小白入门STM32:控制SG90舵机的基础工作原理详解
小白入门STM32:控制SG90舵机的基础工作原理详解
本文是一篇关于STM32单片机控制SG90舵机的基础教程。从理论到实践,详细介绍了PWM信号控制原理、定时器的工作机制,并给出了具体的代码示例。
序言
本文旨在帮助有一定C语言基础的读者入门STM32单片机。按照理论先行、实践跟进的思路,通过讲解PWM控制原理和定时器机制,指导读者完成对SG90舵机的控制。SG90舵机是最适合初学者的舵机类型,可以直接由单片机驱动。
一、基础理论
1.1 舵机控制原理–PWM
舵机通常可以在0-180度或0-360度范围内转动,广泛应用于小车转向控制和机械臂关节控制等领域。其转动角度范围需要在购买时确认。
控制舵机的基本需求包括:
- 控制舵机转动到指定角度
- 在舵机转动过程中,可以随时改变目标角度
设计者采用了一种简单而有效的方法:使用一个20ms周期的PWM信号来控制舵机。信号的前段为高电平,持续时间在0.5ms到2.5ms之间,对应0-180度或0-360度的转动角度,后半段为低电平。具体如下图所示:
这种设计使得舵机能够根据高电平的持续时间来调整转动角度。需要注意的是,舵机转动到指定角度需要一定时间,转动角度越大所需时间越长。如果在舵机转动过程中发送新的角度指令,舵机会直接从当前位置转向新目标角度,而不会完成当前指令后再转向。
习题
- 如果2.5ms对应90度,那么36度的PWM信号高电平时间长度是多少?
- 为什么使用PWM控制舵机?是否有其他控制方法?
- PWM信号属于串行还是并行通信?全双工还是单工?为什么采用这种设计?
- 为什么PWM信号长度为20ms,但通常只使用前2.5ms?
1.2 定时器
1.2.1 基础定时器
定时器的作用类似于闹钟,可以设定在特定时间执行特定操作。例如,每隔4秒让二极管亮起或熄灭。
为了实现这一功能,可以设计一套定时器系统:
- 时钟装置:将1秒分为50份,每份20ms。
- 循环计数装置:每当定时器响一次,计数值加一,最大值为199,超过后重置为0。
- 开关装置:当计数装置数值为199时,开关反转一次,控制灯的亮灭。
在STM32单片机中,时钟装置通常使用系统时钟(72MHz),需要通过分频来降低频率。循环计数器包含两个重要寄存器:
- 计数寄存器CK_CNT:存储一个16位数字,时钟每前进一次,数值自动加一或减一。
- 自动重载寄存器ARR:当CK_CNT大于ARR时,会触发中断并重新开始计数。
循环计数器有三种模式:
- 向上计数:从0增长到ARR
- 向下计数:从ARR减小到0
- 中心对齐:先从0加到ARR,再从ARR减到0
1.2.2 比较定时器
为了产生PWM信号,需要在循环计数器中添加比较功能。比较寄存器CCR用于存储一个比较值,当计数器的值更新时,与CCR比较,并对外输出比较结果。
习题
- 定时器的时钟装置和循环计数器各发挥了什么作用?
- 循环计数器有哪些重要参数需要设置?
- STM32时钟频率为72MHz,分频数为16位,CK_CNT为16位,最大和最小循环时间间隔是多少?
- 如何设置时钟装置和循环计数器的寄存器值以产生360度的PWM信号?
二、实战上手
STM32单片机已经封装好了时钟装置、循环计数器和对外输出装置等功能,用户只需进行相关设置和接线。
2.1 设置定时器和单片机接线
2.2 代码示例
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
TIM1->CCR1=50;
HAL_Delay(1000);
TIM1->CCR1=150;
HAL_Delay(1000);
}
/* USER CODE END 3 */
三、习题答案
36度的PWM信号高电平时间长度计算:
[
(2.5 - 0.5) / 90 * 36 + 0.5 = 1.3ms
]PWM控制舵机的原因:
- 使用时间长度表示转动角度,支持高精度细分
- 只需一根导线传输信号,成本低
- 可能存在其他控制方法
- PWM信号通信特性:
- 串行通信
- 单工
- 设计原因:一根导线成本低,PWM机制可靠,执行端无需反馈
- PWM信号长度设计:
- 2.5ms占20ms的八分之一
- 空余17.5ms用于区分杂音信号和准备接收下一个PWM信号
- 定时器组件作用:
- 时钟装置提供时间粒度
- 循环计数器记录时间以执行特定操作
- 循环计数器重要参数:
- 循环周期长度
- STM32定时器时间间隔计算:
- 最小时间间隔:(1.38e-07s \times 1 = 1.38e-07s)
- 最大时间间隔:(65536s \times 0.00910 = 596.3776s)
- 产生360度PWM信号的寄存器设置:
- 360度对应2.5ms
- Counter Period设置为1999的原因:
- 计算机从0开始计数,0-1999共2000个数
- 二极管观察PWM信号:
- 不可行,因为闪烁太快,人眼无法识别