stm32cubemx hal学习记录:电机控制

这篇具有很好参考价值的文章主要介绍了stm32cubemx hal学习记录:电机控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基础配置

1、配置RCC、SYS,SYS的Timebase Source选择TIM6

2、配置USART1、时钟84MHz

3、激活FreeRTOS,选择CMSIS_V1,Config parameters种USE_TIMERS选择ENABLE

二、编码器及电机驱动引脚配置

1、选用TIM3的编码器模式

__hal_tim_setcompare,stm32,stm32,学习,单片机

__hal_tim_setcompare,stm32,stm32,学习,单片机

__hal_tim_setcompare,stm32,stm32,学习,单片机

 2、驱动使用L298N,将PB6、PB7设置为输出模式

__hal_tim_setcompare,stm32,stm32,学习,单片机

 3、使用TIM2的CH1输出1kHz的PWM

__hal_tim_setcompare,stm32,stm32,学习,单片机

 三、FreeRTOS配置

1、设置两个软件定时器,一个用于总控制,一个用于编码器读取数值,也可以用硬件定时器

__hal_tim_setcompare,stm32,stm32,学习,单片机

 2、设置一个队列,用于编码器数值传输

__hal_tim_setcompare,stm32,stm32,学习,单片机

 四、代码编写

硬件测试及传感器数据读取

在gpio.c中添加以下代码,完成电机限幅与方向控制

void Motor_Limit(int *speed)
{
	if(*speed>=100)
		*speed=100;
	if(*speed<=-100)
		*speed=-100;
}

uint8_t motor_dir;
void Motor_control(int speed)
{
	if(speed>=0)
	{
		motor_dir=1;
		Motor_Limit(&speed);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,speed);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
	}
	else
	{
		motor_dir=0;
		Motor_Limit(&speed);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,-speed);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);		
	}
}

在main.c中初始化TIM2,发出PWM波形

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);

添加以下函数测试电机是否旋转,若电机旋转证明无错误,完成编码器测试后删掉

Motor_control(80);

添加编码器初始化代码

HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_ALL);

在main中测试编码器是否正常,若正常将函数删掉。

enc=__HAL_TIM_GET_COUNTER(&htim3);

在freertos.c中的StartDefaultTask函数中添加代码,启动软件定时器,总控制周期设置10ms,编码器读取设置10ms

	osTimerStart(timer_controlHandle,10);
	osTimerStart(timer_encoderHandle,10);

编写编码器速度读取函数,debug后将enc放入函数内部

int32_t enc;
/* encoder_Callback function */
void encoder_Callback(void const * argument)
{
  /* USER CODE BEGIN encoder_Callback */
	enc=__HAL_TIM_GET_COUNTER(&htim3);
	__HAL_TIM_SET_COUNTER(&htim3,0);
  /* USER CODE END encoder_Callback */
}

此时发现反方向旋转时读出来的数据非常的大,且不是复数,此时更改代码,手动补偿

int32_t enc;
extern uint8_t motor_dir;
/* encoder_Callback function */
void encoder_Callback(void const * argument)
{
  /* USER CODE BEGIN encoder_Callback */
	if(motor_dir==1)
		enc=__HAL_TIM_GET_COUNTER(&htim3);
	else
		enc=-65535+__HAL_TIM_GET_COUNTER(&htim3);
	
	__HAL_TIM_SET_COUNTER(&htim3,0);
  /* USER CODE END encoder_Callback */
}

此时完成开环控制

增加pid.c与pid.h文件,完成闭环调参文章来源地址https://www.toymoban.com/news/detail-583580.html

到了这里,关于stm32cubemx hal学习记录:电机控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搭建stm32电机控制代码框架(一)——Stm32CubeMx入门

    任务是基于stm32f405芯片进行展开,应用的软件是keil5和STM32CubeMx,这两个软件环境目前是已经安装好了,现在就可以开始展开工作了,这系列博客零散的记录任务完成的过程,作为一个笔记方便后续回顾。 任务(一):用CubeMx控制一个引脚的高低电平 第一步: 在CubeMx中导入

    2024年02月06日
    浏览(32)
  • 搭建stm32电机控制代码框架(五)——Stm32CubeMx配置PWM

    采样配置完成后,进行PWM的配置。PWM的生成依赖于STM32的TIM1定时器,其功能完备如下图所示,电机控制中主要应用其PWM生成功能。 我们当前阶段的目标是生成占空比为50%的三路PWM,其开关频率为10kHz。 那么开始CubeMx的配置,依据stm32f405数据手册中地址总线部分内容,TIM1是挂

    2024年02月16日
    浏览(21)
  • 搭建stm32电机控制代码框架(三)——Stm32CubeMx配置ADC采样

    电机控制另一个关键的模块就是ADC采样,这个模块配置的好坏决定了采样电流和电压的精准度,因此有必要对其进行深入学习。 简介: STM32 在片上集成的ADC 外设非常强大。STM32F103xC、STM32F103xD 和STM32F103xE增强型产品内嵌3个12位的ADC,每个ADC 共用多达 21 个外部通道,可以实现

    2024年02月13日
    浏览(19)
  • 搭建stm32电机控制代码框架(二)——Stm32CubeMx配置定时器

    搭建了基础的环境,配置了一个简单的工程后,CubeMx的基本操作就会了。然后基于这个操作往下推进,开始对关键模块定时器的攻略,这个部分需要先熟悉一下Stm32的定时器基本原理。 《STM32参考手册》中仅对定时器的介绍就已经占了100多页,这里就不一一展开,挑一些关键

    2024年02月06日
    浏览(49)
  • STM32控制矩阵按键,HAL库,cubeMX配置

    我使用的是STM32F103RCT6这款单片机,HAL库,使用cubeMX配置。 使用矩阵按键实现功能的方法为轮询法 1.首先矩阵键盘原理图如下: 2.实物图 按照矩阵键盘接法,16个按键需要8个io口,我选择了PC口的0~7号引脚,前四个依次接矩阵键盘的行,后四个依次接矩阵键盘的列;矩阵键盘的

    2023年04月17日
    浏览(36)
  • STM32 HAL库PID控制电机 第三章 PID控制双电机

    注:本文含全部PID控制代码,保证可以运行,如不能运行可以留言回复 1 基础配置 1.1 编码器电路图及配置 引脚 定时器通道 PA0 TIM2_CH1 PA1 TIM2_CH2 PB6 TIM4_CH1 PB7 TIM4_CH2 因此需要把TIM2、TIM4配置为编码器模式。在STM32CubeIDE中找到定时器2与定时器4,进行模式配置。以下以定时器2为

    2024年02月16日
    浏览(17)
  • 电机FOC控制(三)STM32 CUBEMX 配置ADC采样

    本文在电机FOC控制(二)STM32 CUBEMX 配置三相PWM互补输出基础上,继续讲述如何STM32 CUBEMX 配置ADC寄存器,使TIMER1 PWM互补输出CC4触发ADC注入采样的过程。 打开Clock Configuration界面,将ADC设置为42.5MHz。 设定ADC1通道7和通道8为单端输入: 设定ADC2通道6和通道7为单端输入: ADCs_Comm

    2024年04月23日
    浏览(20)
  • 用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

    (1)编程平台:Keil5 (2)CubeMX (1)本此使用最小核心板STM32F103C8T6为例 (2)一个舵机:SG90或者MG996等均可 (3)ST-link 下载器 (4)杜邦线若干         舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度

    2023年04月09日
    浏览(15)
  • 【STM32】使用HAL库进行电机速度环PID控制,代码+调参

    主控:STM32F103C8T6 在进行速度控制之前,我们首先需要进行速度采样,这里参见这篇博文 ​ 这里不细说电机驱动模块的选型和使用,而是说一个常见的误区。我们驱动电机要使用两路PWM,一般是一路给PWM信号,一路是纯低电平。但这其实是不好的,正确的做法是一路给PWM,另

    2023年04月20日
    浏览(32)
  • 【STM32】使用HAL库进行电机PID位置环控制,代码+调参

    前面两篇博文已经实现了电机测速和PID速度环控制,在这篇博文中,我们主要说明位置环的代码怎么写以及PID参数怎么调。 ​ 写完速度环后位置环就很简单了。 ​ 在串级PID中,内环的控制量一般是外环控制量的微分。在我们这里,外环是控制量是电机转动的位置(也可以说

    2024年02月16日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包