> 技术文档 > 【STM32 HAL库】PWM驱动舵机_stm32hal库驱动舵机

【STM32 HAL库】PWM驱动舵机_stm32hal库驱动舵机


文章目录

一、舵机接线

二、舵机配置思路

180度舵机驱动需求:

AAR、CCR、PSC计算思路:

三、STM32 CubeMX配置思路

定时器配置:

PSC、AAR、CCR配置

四、参考代码

Servo.c

Servo.h

headfile.h


一、舵机接线

红色                      VCC  棕色                      GND 黄色                      PWM

二、舵机配置思路

180度舵机驱动需求:

转动角度 脉冲周期 脉冲宽度(高电平宽度) -90度 20ms 0.5ms -45度 20ms 1ms 0度 20ms 1.5ms 45度 20ms 2ms 90度 20ms 2.5ms

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+1100 那么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

菜鸟,有问题还望大佬指出(≧∀≦)ゞ