STM32双舵机协同控制实战TIM2驱动SG90与MG90S的完整解决方案在机器人关节控制、云台稳定系统等嵌入式开发场景中同时控制多个舵机是常见需求。本文将深入解析如何利用STM32F103C8的TIM2定时器实现对SG90角度控制和MG90S速度控制两类舵机的协同驱动。不同于基础教程我们重点解决实际工程中的多外设协同、PWM资源分配和混合控制逻辑问题。1. 硬件架构设计与信号分析1.1 舵机特性对比与选型两种舵机的核心差异体现在控制维度上特性SG90MG90S控制模式角度定位0-180°速度/方向控制脉冲范围0.5ms-2.5ms0.5ms-2.5ms典型应用机械臂关节轮式驱动扭矩1.8kg·cm4.8V2.5kg·cm4.8V1.2 硬件连接方案推荐使用STM32F103C8最小系统板的以下引脚配置// 宏定义引脚映射 #define SERVO_SG90_PIN GPIO_Pin_1 // PA1 - TIM2_CH2 #define SERVO_MG90S_PIN GPIO_Pin_0 // PA0 - TIM2_CH1 #define SERVO_GPIO_PORT GPIOA接线注意事项使用独立5V/2A电源为舵机供电信号线需加装220Ω限流电阻共地连接必须可靠2. TIM2定时器高级配置2.1 时基单元参数计算针对50Hz舵机控制信号的特殊要求void TIM2_Init(void) { TIM_TimeBaseInitTypeDef TIM_BaseStruct; // 时钟配置 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 时基参数 TIM_BaseStruct.TIM_Period 20000 - 1; // 20ms周期 TIM_BaseStruct.TIM_Prescaler 72 - 1; // 1MHz计数频率 TIM_BaseStruct.TIM_ClockDivision 0; TIM_BaseStruct.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, TIM_BaseStruct); }2.2 双通道PWM输出配置关键配置点在于通道独立控制void PWM_Init(void) { TIM_OCInitTypeDef TIM_OCStruct; // 通道1配置MG90S TIM_OCStruct.TIM_OCMode TIM_OCMode_PWM1; TIM_OCStruct.TIM_OutputState TIM_OutputState_Enable; TIM_OCStruct.TIM_Pulse 1500; // 初始中立位置 TIM_OCStruct.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM2, TIM_OCStruct); // 通道2配置SG90 TIM_OCStruct.TIM_Pulse 1500; TIM_OC2Init(TIM2, TIM_OCStruct); TIM_Cmd(TIM2, ENABLE); TIM_CtrlPWMOutputs(TIM2, ENABLE); }3. 混合控制算法实现3.1 SG90角度控制函数实现0-180°线性映射void SG90_SetAngle(uint8_t angle) { if(angle 180) angle 180; uint16_t pulse 500 angle * (2000 / 180); TIM_SetCompare2(TIM2, pulse); }3.2 MG90S速度控制函数实现双向速度调节typedef enum { DIR_CW 0, // 顺时针 DIR_CCW 1 // 逆时针 } RotationDir; void MG90S_SetSpeed(uint8_t speed, RotationDir dir) { uint16_t base_pulse (dir DIR_CW) ? 500 : 2500; uint16_t pulse base_pulse (dir ? -speed : speed) * 10; TIM_SetCompare1(TIM2, pulse); }4. 实战调试技巧与异常处理4.1 常见问题排查表现象可能原因解决方案舵机无反应电源功率不足更换2A以上电源角度偏差大脉冲范围不匹配校准500-2500us范围电机发热严重机械负载过大检查传动机构是否卡死控制响应延迟软件延时过长优化主循环周期4.2 进阶优化建议增加软件死区保护防止信号冲突采用DMA方式更新CCR寄存器添加舵机位置反馈检测实现S曲线加减速控制在最近完成的六足机器人项目中这种双舵机控制方案成功实现了每条腿的两个自由度协调运动。实际测试表明通过精细调整PWM更新时序可以避免多个舵机同时启动造成的电流冲击问题。