stm32cubemx hal学习记录:电机控制

news/2024/11/25 12:54:29/

一、基础配置

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

2、配置USART1、时钟84MHz

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

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

1、选用TIM3的编码器模式

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

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

 三、FreeRTOS配置

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

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

 四、代码编写

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

在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);elseenc=-65535+__HAL_TIM_GET_COUNTER(&htim3);__HAL_TIM_SET_COUNTER(&htim3,0);/* USER CODE END encoder_Callback */
}

此时完成开环控制

增加pid.c与pid.h文件,完成闭环调参


http://www.ppmy.cn/news/6098.html

相关文章

react-router-dom 降低版本的两种方法

前言 react-router-dom 如今已经升级到了 V6 版本&#xff0c;相比较 V5 版本&#xff0c;变化还是挺大的。如今使用 npm install react-router-dom -S 命令来下载 react-router-dom &#xff0c;会自动下载 V6 版本&#xff0c; V6 版本会在接下来的一段时间内成为主流。不过…

Coinbase或在不久使用Zebec发放工资,并对Web3支付赛道发展寄予厚望

流支付协议Zebec Protocol目前已经完成了生态向BNB Chian上的迁移&#xff0c;目前得到了以PancakeSwap为代表的头部生态的支持。在12月20日Zebec生态在PancakeSwap官方的支持下&#xff0c;经过社区投票&#xff0c;ZBC通证上线了糖浆池&#xff0c;并有望继续上线Binance。而…

机器学习算法基础——决策树

文章目录决策树算法的定义发展历程适用范围及其优缺点适用范围优点缺点代码实现决策树算法的定义 决策树&#xff08;Decision Tree&#xff09;是在已知各种情况发生概率的基础上&#xff0c;通过构成决策树来求取净现值的期望值大于等于零的概率&#xff0c;评价项目风险&…

小程序02/小程序 响应式单位rpx 、image组件概念说明 和 mode属性介绍

一. 响应式单位rpx rpx 说明 rpx: 规定不管屏幕为多少px , 100%的屏幕宽度就是750rpx 100% 屏幕的宽度 750rpx rpx响应单位 rpx是微信小程序独有的&#xff0c;解决屏幕自适应的尺寸单位 可以根据屏幕宽度进行自适应&#xff0c;不论大小屏幕&#xff0c;规定屏幕宽为750…

基于ACO蚁群优化实现VRPTW问题求解matlab仿真

目录 1.算法概述 2.仿真效果 3.matlab仿真源码 1.算法概述 随着科学技术和生产的不断发展,许多实际问题不可能在合理的时间范围内找到全局最优解,这就促使了近代最优化问题求解方法的产生。随着各种不同搜索机制的启发式算法相继出现,如禁忌搜索、遗传算法、模拟退火算法…

使用MAXScript脚本编写圣诞树建模插件教程

一、前言 2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 今年的圣诞节为大家分享用MAXScript脚本编写圣诞树建模插件的技术创意&#xff0c;喜欢的同学别忘记在下面点个赞&#xff01; 二、创意名 一键圣诞树插件 三、效果展示 四、实现步骤 1.制作圣诞树的设计稿…

MySQL的数据类型和存储引擎介绍

一. MySQL数据类型 1. 整数类型 注&#xff1a;MySQL可以为整数类型指定宽度&#xff0c;比如 int(3)、int(5)&#xff0c;这个限制不是限制value的合法范围&#xff0c;所以对绝大数应用没有任何意义&#xff0c;对于存储而言&#xff0c;int(3) 和 int(5) 是相同的&#xff…

垃圾回收机制

1.什么场景下该使用什么垃圾回收策略&#xff1f; (1).对内存要求苛刻的场景 想办法提高对象的回收效率&#xff0c;尽可能的多回收一些对象&#xff0c;腾出更多内存 (2).在CPU使用率较高的情况下 降低高并发时垃圾回收频率&#xff0c;让CPU更多地去执行业务而不是垃圾回收 …