1. SG90舵机工作原理与PWM信号基础
第一次接触舵机时,我盯着那个三线接口的小盒子完全摸不着头脑。直到拆开一个报废的SG90,才发现里面的结构比想象中简单:核心就是直流电机+减速齿轮组+电位器反馈电路。这个精巧的机械结构决定了它和普通电机的本质区别——舵机不是靠持续通电转动,而是通过脉冲信号精确定位。
SG90的PWM控制有个黄金法则:50Hz频率+脉宽调制。实测下来,0.5ms脉宽对应0度,1.5ms对应90度,2.5ms对应180度(不同品牌可能有微小差异)。这里有个新手容易误解的点:占空比计算要基于20ms周期。比如1.5ms脉宽的实际占空比是7.5%,而不是直接看脉宽绝对值。
我用示波器抓取了典型控制信号:
- 0度位置:高电平0.5ms + 低电平19.5ms
- 中立位:高电平1.5ms + 低电平18.5ms
- 180度位置:高电平2.5ms + 低电平17.5ms
注意:舵机供电电压会影响扭矩但不会改变角度映射关系,实测5V供电时扭矩约1.6kg·cm,降到4.8V时扭矩衰减明显
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STM32定时器的PWM生成机制
STM32的定时器就像瑞士军刀,TIM1/TIM8这类高级定时器更是功能强大。以TIM8为例,配置PWM输出要搞懂三个核心参数:
- 时钟源:通常用内部72MHz时钟(APB2总线)
- 预分频器(Prescaler):将时钟分频给计数器使用
- 自动重载值(Period):决定PWM周期
计算周期有个实用公式:
code复制PWM周期 = (Prescaler+1) × (Period+1) / 时钟频率
拿20ms周期举例,如果时钟72MHz:
- 设Prescaler=7199 → 分频后时钟=72MHz/(7199+1)=10kHz
- 设Period=199 → 周期=200×0.1ms=20ms
实际调试时我习惯先用STM32CubeMX可视化配置,再微调代码。比如发现TIM8的刹车功能会影响输出时,需要特别关注BDTR寄存器的MOE位。
3. 完整工程代码实现
先分享一个我优化过的初始化函数,增加了错误处理和参数校验:
c复制void TIM8_PWM_Init(uint32_t pulse_width_us)
