3. STM32与舵机接口

舵机是机器人关节执行的核心部件,其控制精度直接决定了机械臂的定位准确性、足式机器人的步态稳定性以及云台的跟随平滑度。STM32与舵机之间的接口,本质上是通过GPIO复用功能输出特定时序的PWM(脉冲宽度调制)信号。本章将深入剖析PWM控制舵机的物理原理,明确频率与脉宽如何映射到舵机转角,并给出基于STM32标准库与HAL库的GPIO配置方法,帮助读者建立从寄存器位到舵机转角的完整工程认知。

STM32 舵机控制链路与PWM信号映射 STM32 定时器 TIMx (CH1~CH4) PSC / ARR / CCR 预分频·重载·比较 GPIO 复用 AF_PP 推挽输出 速度 50MHz PA0~PA15 / PB0~PB15 舵机 PWM 信号线 (橙/黄) VCC (红) / GND (棕) SG90 / MG996R / DS3218 PWM 脉宽与舵机角度映射(50Hz 周期 20ms) t 0.5 0° 1.0 45° 1.5 90° 2.0 135° 2.5 180° 周期 T = 20ms(频率 50Hz) ⚠ 安全保护区间 0.3ms ~ 2.7ms 软件限位

3.1 核心原理:PWM信号如何控制舵机角度

舵机内部集成了直流电机、减速齿轮组、位置反馈电位器以及控制电路。其控制接口接收一个周期性的脉冲信号,控制电路通过测量高电平脉宽(即PWM的占空比时间)来驱动电机,直到输出轴转动到与脉宽对应的角度位置。这个闭环过程不需要MCU读取舵机位置反馈,MCU只需持续输出稳定的PWM波形即可。

标准模拟舵机的控制信号频率为50Hz,即周期为20ms。在这个周期内,高电平持续时间(脉宽)决定了舵机输出轴的角度。以最常见的180°舵机为例,其映射关系如下:

  • 0.5ms 脉宽 → 0°(左极限)
  • 1.5ms 脉宽 → 90°(中位)
  • 2.5ms 脉宽 → 180°(右极限)

值得注意的是,不同品牌和型号的舵机,其脉宽-角度映射可能存在差异。例如,某些数字舵机支持更宽的脉宽范围(0.4ms~2.6ms),而一些高精度舵机(如LX-16A)则采用串行总线控制而非PWM。因此,在实际项目中,必须查阅舵机数据手册确认其有效脉宽范围,避免超出机械限位导致堵转损坏。

频率与脉宽的关系辨析:舵机控制的核心是脉宽而非占空比。虽然占空比 = 脉宽/周期,但在50Hz下,1.5ms脉宽对应3%占空比。如果误将频率提高到200Hz(周期5ms),此时1.5ms脉宽对应30%占空比,但舵机依然会转到90°位置。然而,过高的频率会导致舵机内部控制电路无法正确解析脉冲,出现抖动或发热。因此,必须保持50Hz左右的频率,仅调整脉宽来改变角度。

3.2 判断方法与操作流程:STM32定时器与GPIO配置

STM32产生PWM信号的核心是通用定时器(TIMx)。每个定时器拥有4个独立通道(CH1~CH4),可同时输出4路不同脉宽的PWM。配置流程分为三步:时钟使能 → 定时器参数配置 → GPIO复用映射。

3.2.1 定时器时基与PWM频率计算

PWM频率由定时器时钟源、预分频器(PSC)和自动重载寄存器(ARR)共同决定。以STM32F103系列为例,定时器挂载在APB1总线上,时钟频率为72MHz。计算公式如下:

PWM频率 = 定时器时钟 / ((PSC+1) × (ARR+1))
目标频率 50Hz,则 (PSC+1) × (ARR+1) = 72MHz / 50Hz = 1,440,000

为了获得较高的脉宽分辨率,通常选择PSC=71(即72分频),则ARR = 1,440,000 / 72 - 1 = 19999。此时定时器计数周期为20ms,每个计数单位对应1μs,脉宽设置值直接以微秒为单位,便于计算。

参数寄存器值说明
预分频器TIMx_PSC7172MHz ÷ 72 = 1MHz(1μs计数周期)
自动重载TIMx_ARR19999计数20000次 = 20ms周期
比较寄存器TIMx_CCR500~2500对应0.5ms~2.5ms脉宽

3.2.2 GPIO复用模式配置

定时器通道必须映射到特定的GPIO引脚。例如TIM2的CH1映射到PA0,TIM3的CH2映射到PB5。配置为复用推挽输出(AF_PP),使GPIO引脚由定时器外设控制,而非普通IO输出。以下为HAL库配置示例:

// 1. 使能定时器与GPIO时钟
__HAL_RCC_TIM2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();

// 2. GPIO复用配置
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;   // 复用推挽
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// 3. 定时器PWM配置
TIM_HandleTypeDef htim2 = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71;
htim2.Init.Period = 19999;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_PWM_Init(&htim2);

// 4. 配置PWM通道
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500;  // 初始1.5ms,90°
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);

// 5. 启动PWM输出
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
工程经验:在配置GPIO时,务必确认所选引脚没有其他复用功能冲突(如JTAG、USART等)。例如PA13~PA15默认是JTAG调试口,若需用作PWM输出,必须先禁用JTAG功能。建议优先选用TIM2/TIM3/TIM4的通道引脚,它们通常不与调试接口冲突。

3.3 案例拆解:六足机器人腿部关节的PWM控制

项目背景:设计一台六足机器人,每条腿包含2个关节(髋关节和膝关节),共需12路PWM信号。主控采用STM32F103RCT6,舵机选用MG996R金属齿轮舵机,工作电压6V,堵转电流2.5A。

初始现象:在调试过程中,发现第3号腿的髋关节舵机在指令90°时实际转动到约95°,且伴随轻微抖动。其他11路舵机工作正常。

分析过程:

  1. 电源检查:使用示波器测量舵机电源引脚,发现6V电压在舵机动作时跌落至4.8V。由于12路舵机同时供电,瞬时电流峰值超过5A,而电源模块最大输出仅3A,导致电压跌落。
  2. 信号完整性:测量第3号腿的PWM波形,发现高电平脉宽为1.55ms,而非设定的1.50ms。进一步检查发现,该通道的GPIO引脚与相邻的I2C引脚存在PCB布线串扰。
  3. 软件排查:检查定时器配置,确认TIM2_CH1(PA0)的PSC和ARR设置正确,但中断优先级配置不当,导致PWM更新被其他中断频繁打断。

解决方案:

  • 更换为10A输出的DC-DC降压模块,并在舵机电源端并联470μF电解电容和0.1μF陶瓷电容,抑制瞬态压降。
  • 重新绘制PCB,将PWM信号线与I2C线间距拉大至3倍线宽,并增加地线隔离。
  • 将定时器更新中断优先级设为最高,确保PWM寄存器更新不被延迟。

结果对比:修复后,所有12路舵机在0°~180°范围内角度误差小于±1°,抖动消失。系统连续运行2小时,舵机温度稳定在45°C以内。

复盘经验:多舵机系统必须优先考虑电源裕量,PWM信号线应远离高频数字信号线。同时,软件上建议使用DMA或定时器级联方式,减少CPU干预。

3.4 常见误区与安全保护设计

在舵机PWM控制中,以下误区容易导致硬件损坏或控制异常:

误区后果正确做法
频率设置过高(>100Hz)舵机发热、抖动、响应迟钝严格使用50Hz,允许±5%偏差
脉宽超出机械极限齿轮打齿、电机堵转烧毁软件限位:0.5ms~2.5ms,留0.1ms安全余量
GPIO配置为开漏输出高电平驱动能力不足,波形畸变必须使用复用推挽(AF_PP)
忽略舵机供电与逻辑共地信号参考点漂移,角度随机跳变舵机电源负极与STM32 GND可靠连接

安全保护机制:在机器人系统中,舵机堵转是常见故障。建议在软件中增加脉宽渐变功能,避免舵机从0°瞬间跳变到180°产生巨大冲击。同时,利用STM32的ADC采样舵机电流,当电流超过阈值(如1.5A)持续200ms时,自动将PWM脉宽归中位并报警。

风险提示:切勿在舵机通电状态下用手强行转动输出轴,这会损坏内部减速齿轮。在调试初期,建议在舵机供电回路中串联一个1A的保险丝或自恢复保险丝,防止因程序错误导致长时间堵转烧毁舵机。

3.5 总结复盘

本章从PWM信号本质出发,明确了50Hz频率下脉宽与舵机角度的线性映射关系。通过STM32定时器的PSC、ARR、CCR三个关键寄存器,可以精确生成0.5ms~2.5ms的脉宽。GPIO复用推挽模式是连接定时器与舵机信号线的正确配置。在实际工程中,必须同时关注电源供电能力、信号完整性和软件限位保护,才能构建稳定可靠的舵机控制系统。建议读者在开发板上使用示波器实测PWM波形,对比CCR值与实际脉宽,建立直观的时序感知。