【STM32】实战2—用STM32产生PWM信号驱动舵机MG996R(一)
2022-08-17 来源:csdn
1 实验预期效果
完成舵机的90度旋转(不通过串口控制)。
2 硬件学习
2.1 舵机MG996R
某宝店家提供资料如下:
【注:上图中左右所取0度参考位置不同,后文以左侧为准】
根据对应数值可得脉冲宽度与转动角度的关系式为:脉冲宽度 = 0.5 + 角度值A / 90°
所以可得占空比公式:占空比 = (0.5 + A / 90) / 20
有博客舵机使用笔记(mg996 + stm32角度控制代码)_广东老周的博客-CSDN博客_mg996r舵机控制归纳如下:
① PWM信号周期:20000us;
② 0度时,高电平时长:500us;
③ 180度时, 高电平时长:2500us;
④ 每增加1 °,需增加高电平时长:(2500-500)÷180 = 11.1us;
⑤ 某角度值A,需要的总高电平时长:(A x 11.1 + 500)us;
3 STM32CubeMX的相关配置与接线
3.1 配置定时器TIM3
由博客【STM32】7—通用定时器 & 时钟树学习_kokoのadventure的博客-CSDN博客的2.2部分分析可知,TIM3内部时钟来源是PCLK1 = 84MHz,预分频系数(PSC)设置为:83(即84 - 1),则84 000 000 / 84 = 1MHz,即每秒计数1M次,即每秒产生个脉冲。
【注:当每秒产生个脉冲时,Counter Period(ARR)和Pulse在数值上正好与各自单位为us的持续时间相当,因为us与s的数量级刚好差】
为使每20ms产生1次PWM信号(舵机控制需要一个20ms的时基脉冲,即其频率为50Hz),则经过20 000(即0.02/1 * )次脉冲就应重新开始计数,则自动重装值(AutoReload Register,简称ARR)为19 999(即20 000 - 1)。
【PWM相关概念这篇博客讲的很清楚:stm32输出比较PWM_小聪不想秃头的博客-CSDN博客_stm32输出pwm最大频率】
【博客STM32F407+CubeMX-使用TIM产生PWM信号_Wallace Zhang的博客-CSDN博客_cubemx 生成pwm的2.3部分对Counter Period与Pulse有清晰直观的解释】
3.2 stm32原理图
3.3 舵机与STM32的接线方式
+5V —— 5V (0V)GND —— GND (PWM)信号线 —— PA6
4 代码编写与实验效果
4.1 函数理解
/**
* @brief 启动PWM信号的生成。
* @param htim TIM handle
* @param Channel 要启用的TIM通道
*该参数可以是以下值之一。
* @arg TIM_CHANNEL_1: 选择的TIM通道1
* @arg TIM_CHANNEL_2: 选择的TIM通道2
* @arg TIM_CHANNEL_3: 选择的TIM通道3。
* @arg TIM_CHANNEL_4: 选择的TIM通道4
* @retval HAL status
*/
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
/**
* @brief 在运行时设置TIM捕获比较寄存器的值,而不需要调用另一个time ConfigChannel函数。
* @param __HANDLE__ TIM handle.
* @param __CHANNEL__ 要配置的TIM通道。
*该参数可以是以下值之一。
* @arg TIM_CHANNEL_1: 选择的TIM通道1。
* @arg TIM_CHANNEL_2: 选择的TIM通道2
* @arg TIM_CHANNEL_3:选择的TIM通道3。
* @arg TIM_CHANNEL_4: 选择的TIM通道4。
* @param __COMPARE__指定捕获比较寄存器的新值。
* @retval 无
*/
__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)
【相关库函数见【STM32】HAL库学习 3—hal_time_kokoのadventure的博客-CSDN博客】
4.2 代码编写
① 控制数(即__COMPARE__)= 占空比 * 时基脉冲数(此处应为20 000) - 1
② 占空比 = (0.5 + 角度值A / 90) / 20
所以,可得表:
以下基于博客STM32CubeMX-定时器产生PWM驱动舵机_Top嵌入式的博客-CSDN博客_cubemx 舵机的代码进行改写:
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,500-1); //0度
HAL_Delay(1000);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,1500-1); //90度
HAL_Delay(1000);
}
/* USER CODE END 3 */
4.3 实现效果
舵机90度旋转
5 后记
还存在诸多问题:
硬件上:舵机转到指定角度后会左右晃动几下,有时达不到指定角度就返回零度。