【STM32 HAL库】PWM驱动舵机_stm32hal库驱动舵机
文章目录
一、舵机接线
二、舵机配置思路
180度舵机驱动需求:
AAR、CCR、PSC计算思路:
三、STM32 CubeMX配置思路
定时器配置:
PSC、AAR、CCR配置
四、参考代码
Servo.c
Servo.h
headfile.h
一、舵机接线
二、舵机配置思路
180度舵机驱动需求:
AAR、CCR、PSC计算思路:
我们知道 舵机所需要的脉冲周期为20ms 那么就可以知道舵机所需要的频率为 1/20ms = 50hz
既然我们已经知道了舵机需要的频率为50hz 我们按照此来配置AAR、CCR、PSC即可。
三、STM32 CubeMX配置思路
定时器配置:
选择自己需要的定时器进行配置即可
PSC、AAR、CCR配置
此处配置不唯一,具体还要根据自己实际的时钟频率来进行。
PSC:即分频系数
PWM的时钟源我选用内部时钟 因此 如上图 我实际输入的是8mhz 为了让最终的频率为50hz 我们需要进行分频 我选择的分频系数为159 注意此处虽系数为159 但实际计算为 (159+1)=160
ARR:自动重载寄存器
经过PSC分频后 现在的时钟频率为 50000hz 也就是说 计一个数 只需要 1/50000 s 因此我们要把ARR设为999 这样子 就可以把 1/50000 s的时间 延长到 1/500 s也就是20hz 的脉冲注意 此处ARR的系数 在实际计算的时候 与 PSC一样 是(999+1)=1000
CCR:捕获比较寄存器
有些朋友可能会疑惑为什么ARR要设为999 呢 占空比的公式为: CCR/(ARR+1)
我们拿上面舵机为90度来说 我们可以算出占空比为 2.5/20 即为12.5% 如果ARR+1为100 那么CCR就要设置为12.5 这对代码编写并不方便 因此设置为999
输出模式为PWM1 其余配置根据自己的需求来即可
四、参考代码
设 角度为y 占空比为x
占空比=CCR/(ARR+1)我们可以得到方程如下
结合已知的两个舵机角度与占空比的关系进行联立
就可以算出k
而ARR已知 就可以把求解的占空比与角度的方程 转换成 角度与CCR的方程
然后就可以反解出 CCR
Servo.c
#include \"headfile.h\"extern TIM_HandleTypeDef htim1;//stm32f103c8t6每个TIM有四个独立通道void Servo_Init(){HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //启动PWM的输出}/**传入参数:舵机角度*/void Servo_SetAngle(int8_t angle){uint8_t CCR;CCR = (uint8_t)((angle+135)/1.8); //计算公式 当前ARR值为999 PSC为160 __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,CCR);}
Servo.h
#ifndef _SERVO_H#define _SERVO_H#include \"headfile.h\"void Servo_SetAngle(int8_t angle);void Servo_Init(void);#endif
headfile.h
#ifndef _HEADFILE_H#define _HEADFILE_H/* 系统头文件区域 */#include \"main.h\"/* 用户结构体定义区 *//* 用户头文件区域 */#include \"Scheduler.h\"#include \"Led.h\"#include \"Servo.h\"#endif