引言:写电机控制程序前,先问一句:这台电机,我该给它“目标”还是“力气”?搞混两者,代码可能直接搬错。本文用常见电机类型和实操代码,帮你理清控制语义。
一、电机家族的控制语义
1. 舵机:听“目标”
舵机(位置伺服)接收的是PWM脉宽代表的目标角度。内部通过电位器反馈自动调节至目标,外界只给目标值,而非力气。
(来源: cnblogs.com)
2. 直流有刷电机:听“力气”
直流有刷电机接收电压或占空比,直接决定转速和方向,属于开环控制,没有自动反馈目标位置的机制。
(来源: cnblogs.com)
3. 步进电机:听“步数”
步进电机通过接收脉冲步数实现精确步进,可在开环下定位,但高速或重载时容易发生丢步。
(来源: cnblogs.com)
4. 直流无刷电机与伺服:复杂的控制闭环
现代人形机器人常用的一体化伺服关节,将电机、减速器、编码器、驱动器、控制器和散热集成在一个紧凑单元内。无刷电机通过矢量控制(FOC)实现更平滑的转矩和更高效率。
(来源: blog.csdn.net)
二、实战:STM32驱动SG90舵机
以下代码来自 cnblogs.com,展示如何用STM32定时器生成50Hz PWM控制舵机。
c // 定时器2通道4(PA3)输出PWM,周期20ms PSC = 72 - 1; // 72MHz / 72 = 1MHz,1个计数约1us ARR = 20000 - 1; // 数满20000个计数,周期约20ms CCR4 = 1166; // 高电平约1.166ms,对应-60° CCR4 = 1500; // 高电平约1.5ms,对应0° CCR4 = 1833; // 高电平约1.833ms,对应+60°
脉宽与角度的关系公式:
pulse = 1000 + (角度 + 90) × 1000 / 180
(来源: cnblogs.com)
接线要点
- 舵机电源不要从STM32的3.3V引出,需独立5V供电。
- 降压模块的GND与STM32的GND必须共地。
- 信号线接PA3(TIM2_CH4)。
三、高阶电机控制模式速览
对于需要力控的场景,常见的控制策略包括:
- 点位控制(PTP):只关心目标点,不关心中间轨迹。
- 连续轨迹控制(CP):要求末端按预定轨迹平滑运动。
- 力/力矩控制:以力或力矩作为反馈量,需要力传感器。
- 阻抗控制:将环境力作为输入,通过调整虚拟质量、阻尼和刚度,使夹爪表现出特定的柔顺性。
- 导纳控制:与阻抗控制相反,将运动偏差或速度作为输入,通过导纳函数计算出期望的力或位置偏移,再由底层位置控制器执行。
(来源: robot.m.ofweek.com, dh-robotics.com)
例如,CubeMars AK45-36无刷关节电机支持MIT控制模式,可在单个CAN报文中同时发送位置、速度和力矩指令。使用前必须先发送Enable报文解锁电机。
(来源: cubemars.com)
四、常见问题与故障排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 舵机不动,但示波器看到信号 | 供电不足或未共地 | 检查5V电源、共地线 |
| 舵机只在一边嗡嗡响 | 连杆卡死,堵转发热 | 断电,松开连杆,重新找中位 |
| 电机抖动或延迟 | CAN通信质量差 | 检查终端电阻、避免信号线与动力线平行 |
| MIT模式电机无响应 | 未发送Enable指令 | 发送特定CAN报文解锁 |
(来源: cnblogs.com, cubemars.com)
五、总结与下一步
搞清楚电机是听“目标”还是“力气”,是写对代码的第一步。下一步你可以:
- 用示波器观察实际PWM波形,验证脉宽是否准确。
- 下载CubeMars上位机软件,体验MIT模式下的电机使能与控制。
- 阅读电机数据手册,确认所选电机的控制接口与驱动要求。
本文内容均来自公开技术资料,具体参数请以官方文档为准。