SG90与MG90S舵机深度对比:从核心原理到STM32实战指南
1. 舵机基础与选型逻辑
在机器人关节控制、航模舵面调节等场景中,舵机扮演着关键角色。面对市场上琳琅满目的舵机型号,初学者常被SG90和MG90S这两款外形相似但特性迥异的产品所困扰。理解它们的本质差异,需要从底层工作原理切入。
扭矩与转速的博弈是舵机选型的首要考量。SG90标称扭矩约为1.6kg·cm(4.8V供电时),而MG90S金属齿轮版本可达2.5kg·cm。但扭矩提升往往伴随转速降低——SG90的60°转动耗时约0.12秒,MG90S则需要0.14秒。这种参数差异直接决定了它们的适用场景:
- SG90更适合需要精确角度定位的应用,如机械臂关节、摄像头云台
- MG90S凭借金属齿轮和更高扭矩,适用于承受较大负载的场合,如越野车转向机构
供电特性也值得关注。两款舵机典型工作电压均为4.8-6V,但瞬时电流差异明显:
| 参数 | SG90 | MG90S |
|---|---|---|
| 空载电流 | 10mA | 15mA |
| 堵转电流 | 650mA | 800mA |
| 工作温度 | 0-55℃ | 0-55℃ |
实际使用中建议为每个舵机预留1A的电源余量,多舵机系统需特别注意电源功率分配
2. 控制原理的本质差异
2.1 角度舵机(SG90)的脉冲解码
传统180°舵机采用位置伺服控制机制。其核心是一个由电位器、控制板和直流电机组成的闭环系统。当接收到50Hz的PWM信号时:
- 控制芯片测量高电平脉宽(典型范围500-2500μs)
- 将脉宽映射到目标角度(0-180°线性对应)
- 比较电位器反馈的当前角度
- 驱动电机旋转直至误差消除
具体脉宽与角度对应关系可通过实验校准:
// SG90角度控制公式(实测校准版) void SetAngle(uint8_t angle) { uint16_t pulse = map(angle, 0, 180, 500, 2500); // 实际应用中需加入死区补偿 pwm_set_pulse_width(pulse); }2.2 连续旋转舵机(MG90S)的速度控制
MG90S虽然标称360°,实则是无级调速电机。其控制逻辑截然不同:
- 1.5ms脉宽:电机停转
- 1.0-0.5ms:顺时针加速
- 2.0-2.5ms:逆时针加速
# MG90S速度控制示例(Python伪代码) def set_speed(speed): # speed范围:-100到100 if speed == 0: pulse = 1500 elif speed > 0: pulse = 1500 - speed*10 # 正转为1000-1500us else: pulse = 1500 - speed*10 # 反转为1500-2000us pwm.set_pulse_width(pulse)关键区别:SG90的脉宽对应绝对角度,MG90S的脉宽决定相对转速。这种底层差异导致它们的应用场景和编程方式完全不同
3. STM32CubeMX实战配置
3.1 硬件连接规范
典型接线方案需要注意防干扰设计:
[STM32F103] [舵机] PA8(TIM1_CH1) ----> 信号线(黄色) 5V输出 ----> VCC(红色) GND ----> GND(棕色)建议在电源正极串联100μF电解电容,并在信号线加220Ω电阻
3.2 CubeMX关键配置步骤
- 时钟树配置:确保APB1定时器时钟为72MHz
- TIM1设置:
- Prescaler: 71 (产生1MHz计数频率)
- Counter Period: 19999 (50Hz PWM)
- Pulse: 初始值1500
- GPIO设置:将对应引脚设为AF_PP模式
生成代码后,需要添加的驱动逻辑:
// 角度控制封装函数 void servo_angle_ctrl(TIM_HandleTypeDef *htim, uint32_t Channel, float angle) { uint16_t pulse = (uint16_t)(500 + angle*(2000/180.0)); __HAL_TIM_SET_COMPARE(htim, Channel, pulse); } // 速度控制封装函数 void servo_speed_ctrl(TIM_HandleTypeDef *htim, uint32_t Channel, int8_t speed) { uint16_t pulse = 1500 + speed*5; // speed范围:-100到100 __HAL_TIM_SET_COMPARE(htim, Channel, pulse); }4. 高级应用与故障排查
4.1 多舵机同步控制
当需要协调多个舵机时,需注意:
- 使用硬件定时器不同通道可实现同步控制
- 软件PWM方案可能导致抖动,建议采用DMA方式
- 共享电源时需防范电压跌落
// 多舵机控制示例 void robotic_arm_move(uint8_t angles[4]) { servo_angle_ctrl(&htim1, TIM_CHANNEL_1, angles[0]); servo_angle_ctrl(&htim1, TIM_CHANNEL_2, angles[1]); HAL_Delay(20); // 避免瞬时电流过大 servo_angle_ctrl(&htim1, TIM_CHANNEL_3, angles[2]); servo_angle_ctrl(&htim1, TIM_CHANNEL_4, angles[3]); }4.2 常见问题解决方案
舵机抖动:
- 检查电源电压是否稳定
- 确认PWM信号接地与电源共地
- 尝试在程序中加入10ms延时
角度偏差:
// 校准代码示例 const float calibration[4] = {1.02, 0.98, 1.05, 0.95}; // 各通道校准系数 void calibrated_move(uint8_t ch, float angle) { uint16_t pulse = (uint16_t)(500 + angle*2000/180 * calibration[ch]); __HAL_TIM_SET_COMPARE(&htim1, ch+1, pulse); }过热保护:
- 金属齿轮舵机连续工作不宜超过15分钟
- 可增加温度传感器监测
- 采用间歇工作模式(工作2分钟,停30秒)