本章将深入探讨舵机(伺服电机)的工作原理、选型方法和应用技巧。作为机械控制系统的核心执行器,舵机广泛应用于机器人、云台、模型等领域。通过学习本章内容,您将掌握舵机的PWM控制原理、性能参数解读、安装调试技巧,以及在实际项目中的选型策略。我们将从基础的模拟舵机开始,逐步深入到数字舵机的高级特性,最后探讨无刷电机的FOC控制技术。
舵机是一个闭环控制系统,主要由以下几部分组成:
舵机内部结构示意图
+------------------+
| 控制电路板 |
| (Control Board) |
+--------+---------+
|
+--------v---------+
| 直流电机 |
| (DC Motor) |
+--------+---------+
|
+--------v---------+
| 减速齿轮组 |
| (Gear Train) |
+--------+---------+
|
+--------v---------+
| 位置传感器 |
| (Potentiometer) |
+------------------+
核心组件功能:
舵机的发展历程: 舵机最初源于航模领域,用于控制飞机的舵面。早期舵机采用模拟电路控制,精度和响应速度有限。随着微控制器技术的发展,数字舵机应运而生,大幅提升了控制性能。现代舵机已经广泛应用于机器人、自动化设备、医疗器械等领域。
舵机外壳材料选择:
齿轮材料对性能的影响:
PWM(Pulse Width Modulation,脉宽调制)是舵机的标准控制方式:
PWM信号时序图
周期 T = 20ms (50Hz)
高电平 ┌──┐ ┌──┐ ┌──┐
│ │ │ │ │ │
低电平 ┘ └─────┘ └─────┘ └─────
├─┤├────────────────┤
tw T-tw
tw = 脉宽时间 (0.5ms ~ 2.5ms)
标准PWM参数:
控制精度计算: 对于180°舵机,脉宽范围为2ms,理论分辨率为: \(\text{分辨率} = \frac{180°}{2ms \times 1000\mu s/ms} = 0.09°/\mu s\)
实际应用中,由于控制器PWM分辨率限制(如8位PWM),实际分辨率约为: \(\text{实际分辨率} = \frac{180°}{256} \approx 0.7°\)
PWM信号生成方法:
信号完整性考虑: PWM信号在传输过程中可能受到干扰,影响舵机性能:
非标准PWM协议: 除了标准50Hz PWM外,还有其他控制协议:
舵机内部采用简单的比例控制(P控制):
闭环控制框图
目标位置 ──→ [+] ──→ 误差 ──→ [控制器] ──→ 电机
(PWM) ↑ │
│ ↓
实际位置 ←───┴──────── [位置传感器] ←──── 输出轴
控制算法详解:
| PWM占空比:$duty = | u | /u_{max} \times 100\%$ |
死区设置与优化: 为避免抖动,通常设置死区(deadband):
| 当$ | e | < \epsilon$时($\epsilon$通常为1-2°),电机停止 |
电位器反馈机制: 舵机内部的电位器是实现闭环控制的关键元件:
电位器工作原理
Vcc (5V)
│
█ R1
│
输出 ──┤ ← 滑动触点(与输出轴连接)
│
█ R2
│
GND
输出电压:Vout = Vcc × (R2/(R1+R2))
角度映射:θ = (Vout/Vcc) × 180°
电位器的局限性:
控制器增益调节: 比例增益$K_p$的选择对舵机性能影响很大:
典型的增益调节过程:
改进的控制算法: 虽然大多数舵机使用简单的P控制,高端舵机可能采用更复杂的算法:
PD控制:加入微分项,减少超调 \(u = K_p \times e + K_d \times \frac{de}{dt}\)
实际应用参数:
带前馈的控制:提高跟踪性能 \(u = K_p \times e + K_f \times \theta_{target}\)
前馈补偿原理:
自适应控制:根据负载自动调节增益 \(K_p = K_{p0} \times (1 + \alpha \times |load|)\)
负载检测方法:
积分抗饱和PID:消除稳态误差 \(u = K_p \times e + K_i \times \int e \, dt + K_d \times \frac{de}{dt}\)
抗饱和策略:
| 积分限幅:$ | \int e \, dt | < I_{max}$ |
舵机扭矩是选型的关键参数,通常以kg·cm为单位:
扭矩定义:
扭矩与电压关系: \(T = T_{rated} \times \frac{V_{actual}}{V_{rated}}\)
例如:6V时扭矩为20kg·cm的舵机,在4.8V时扭矩约为: \(T_{4.8V} = 20 \times \frac{4.8}{6} = 16kg\cdot cm\)
负载计算示例: 机械臂关节负载计算:
L (力臂长度)
├────────────┤
O─────────────● m (负载质量)
└─舵机轴
所需扭矩 T = m × g × L
例:负载2kg,力臂15cm
T = 2kg × 10m/s² × 15cm = 300kg·cm²/s² = 30kg·cm
考虑安全系数1.5:选择 > 45kg·cm 的舵机
扭矩单位换算: 舵机扭矩有多种表示单位,需要正确换算:
动态扭矩考虑: 静态扭矩计算只考虑重力,实际应用中还需考虑动态因素:
\[T_{total} = T_{static} + T_{dynamic}\]其中动态扭矩包括:
扭矩裕度设计原则:
应用场景 安全系数 说明
静态定位 1.2-1.5 负载稳定,无冲击
缓慢运动 1.5-2.0 低速运动,加速度小
快速运动 2.0-3.0 高速运动,频繁加减速
冲击负载 3.0-5.0 存在突发载荷
扭矩不足的表现:
扭矩测试方法:
舵机速度通常以”秒/60°”表示:
速度计算:
速度与扭矩权衡:
动态响应考虑: 加速时间估算: \(t_{acc} = \frac{J \times \omega}{T - T_{load}}\) 其中:
速度规格的理解: 舵机速度规格通常给出无负载条件下的数据:
典型速度规格示例:
0.12s/60° @ 6V(无负载)
0.10s/60° @ 7.4V(无负载)
实际速度计算:
角速度 = 60°/0.12s = 500°/s
转速 = 500°/360° × 60 = 83.3 RPM
负载对速度的影响: 实际速度与负载呈非线性关系:
\[v_{loaded} = v_{no-load} \times (1 - \frac{T_{load}}{T_{stall}})^n\]其中n通常在0.5-1之间,取决于电机特性。
速度控制策略:
速度
^
│ ┌────────┐
│ / \
│ / \
│ / \
└─────────────────→ 时间
加速 匀速 减速
速度
^
│ ___
│ / \
│ / \
│ / \
└─────────────────→ 时间
更平滑的加减速
高速应用的特殊考虑:
速度测量方法:
功率消耗分析: 舵机的功率消耗包含多个组成部分:
效率分析: 舵机的总效率由多个环节决定:
热管理设计: 连续工作时的热功率必须得到有效散发:
\[P_{heat} = P_{input} \times (1 - \eta)\]热阻计算: \(\Delta T = P_{heat} \times R_{thermal}\)
其中:
散热优化策略:
寿命与温度关系: \(L = L_0 \times 2^{\frac{T_0 - T}{10}}\)
| 特性 | 模拟舵机 | 数字舵机 |
|---|---|---|
| 控制频率 | 50Hz | 300-330Hz |
| 位置采样率 | 50Hz | 300Hz+ |
| 死区 | 5-8μs | 1-2μs |
| 保持力 | 一般 | 强 |
| 响应速度 | 慢 | 快 |
| 功耗 | 低 | 较高 |
| 价格 | 便宜 | 贵 |
工作原理:
模拟舵机控制时序
PWM输入 ──→ 每20ms采样一次 ──→ 驱动电机
↓
位置误差大时全速驱动
接近目标时降速
优点:
缺点:
高频控制回路:
数字舵机内部处理
MCU ──→ 300Hz位置采样 ──→ PID控制 ──→ PWM驱动
↑ ↓
└──────── 编码器/电位器 ←────────────┘
关键特性:
适用场景:
安装方式选择:
常见舵机安装方式
A. 直接安装(标准舵机支架)
┌──────────┐
│ 舵机本体 │
├──────────┤
│□ □ □ □│ ← 安装孔
└──────────┘
B. 侧面安装(U型支架)
┌─┐ ┌─┐
│ │██████│ │
│ │舵机本体│ │
└─┘ └─┘
C. 双轴支撑(高负载应用)
轴承
↓
─────●─────
│
┌────┴────┐
│ 舵机 │
└─────────┘
安装注意事项:
振动隔离设计: 高精度应用需考虑振动隔离:
标准接线定义:
舵机接线颜色标准
┌─────────────┐
│ 舵机接头 │
│ ● ● ● │
│ │ │ │ │
└─┼─┼─┼───────┘
│ │ └─── 信号线(Signal)
│ │ 黄色/橙色/白色
│ │ PWM控制信号
│ │
│ └───── 电源正(VCC)
│ 红色
│ 4.8V-7.2V
│
└─────── 电源负(GND)
黑色/棕色
共地连接
电源设计要点:
电流需求估算:
舵机数量 空载总电流 峰值电流 推荐电源
1个 200mA 2A 5V/2A
4个 800mA 8A 5V/10A
6个 1.2A 12A 5V/15A
12个 2.4A 24A 5V/30A
常见控制方式:
// Arduino PWM控制示例
#include <Servo.h>
Servo myservo;
// 引脚9输出PWM,控制舵机至90度
myservo.attach(9);
myservo.write(90);
光耦隔离电路
MCU侧 光耦 舵机侧
3.3V ┌───┐ 5V
│ 1K │ │ │
PWM──███──→│ │──█──→舵机
│ │ │ │ 信号
GND────────┴───┴───┴───GND
标准舵机臂规格:
常见舵机臂类型
A. 单臂 B. 双臂 C. 圆盘
● ● ●●●
│ ───┼─── ●●●●●
│ │ ●●●●●●●
│ │ ●●●●●
D. 十字臂 E. 齿轮 F. 万向节
│ ╱│╲ ●
───┼─── ╱ │ ╲ ╱ ╲
│ ╱ │ ╲ ●───●
材料选择:
力矩传递分析:
力臂长度与力的关系
舵机轴 ●────────→ F
├───r───┤
扭矩关系:T = F × r
r增大 → F减小(力降低,位移增大)
r减小 → F增大(力增大,位移减小)
最优力臂长度: \(r_{opt} = \sqrt{\frac{T_{servo}}{F_{required}}}\)
设计示例:
花键连接:
25T花键标准(常见规格)
╱╲╱╲╱╲
╱ ╲ ╱
╲ ╱ ╲
╲╱╲╱╲╱
优点:无间隙、扭矩大
缺点:需要专用工具
螺栓夹紧:
键槽设计:
键槽尺寸计算
┌─────┐
│ │← 键宽 w = d/4
│ ● │← 轴径 d
│ │← 键高 h = d/6
└─────┘
六足机器人参数:
静态支撑分析:
三足支撑时最恶劣工况
▲ 3kg
│
●────┼────●
\ │ /
\ │ /
\ │ /
\│/
●
单腿负载 = 3kg ÷ 3 = 1kg
关节扭矩需求:
选型结果: | 关节 | 型号 | 扭矩 | 速度 | 重量 | 数量 | |——|——|——|——|——|——| | 髋关节 | MG996R | 15kg·cm@6V | 0.17s/60° | 55g | 6 | | 膝关节 | DS3235 | 25kg·cm@6V | 0.15s/60° | 60g | 6 | | 踝关节 | MG90S | 9kg·cm@6V | 0.10s/60° | 14g | 6 |
总重量:(55×6) + (60×6) + (14×6) = 774g
硬件架构:
控制系统框图
主控制器 舵机控制板
┌────────┐ ┌──────────┐
│RPi/STM32│─I2C→│ PCA9685×2│
└────────┘ └────┬─────┘
│PWM×18
┌────┴────┐
│18个舵机 │
└─────────┘
步态控制算法:
# 三角步态示例(伪代码)
class TripodGait:
def __init__(self):
self.group_A = [0, 3, 4] # 腿编号
self.group_B = [1, 2, 5]
def step_forward(self):
# 第1相:A组抬腿,B组支撑
self.lift_legs(self.group_A)
self.move_body_forward(distance=50)
# 第2相:A组落地,B组抬腿
self.lower_legs(self.group_A)
self.lift_legs(self.group_B)
# 第3相:B组向前摆动
self.swing_legs_forward(self.group_B)
self.lower_legs(self.group_B)
功率需求计算:
电源分配:
电源分配方案
7.4V电池 ──→ UBEC(5A)×4 ──→ 每组4-5个舵机
│
└→ 主控板供电(独立5V/2A)
性能对比: | 特性 | 传统舵机 | 无刷伺服 | |——|———|———-| | 寿命 | 300-500小时 | 5000+小时 | | 效率 | 40-55% | 80-90% | | 噪音 | 齿轮噪音大 | 静音运行 | | 精度 | ±1-2° | ±0.1° | | 成本 | 低 | 高 | | 控制复杂度 | 简单PWM | 需要FOC驱动 |
磁场定向控制(Field Oriented Control):
FOC控制框图
位置指令 ──→ [位置环] ──→ [速度环] ──→ [电流环]
↑ ↑ ↑
│ │ │
编码器位置 编码器速度 相电流采样
电流环内部:
Id*,Iq* ──→ [PI] ──→ [反Park] ──→ [SVPWM] ──→ 三相逆变器
↑ │
[Clark/Park]←──── 相电流 ←──────┘
核心变换:
Clark变换:三相→两相静止坐标系 \(\begin{bmatrix} I_\alpha \\ I_\beta \end{bmatrix} = \frac{2}{3}\begin{bmatrix} 1 & -\frac{1}{2} & -\frac{1}{2} \\ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{bmatrix}\begin{bmatrix} I_a \\ I_b \\ I_c \end{bmatrix}\)
Park变换:两相静止→两相旋转坐标系 \(\begin{bmatrix} I_d \\ I_q \end{bmatrix} = \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix}\begin{bmatrix} I_\alpha \\ I_\beta \end{bmatrix}\)
其中:
常见编码器对比:
分辨率计算:
机械角度分辨率 = 360° / (编码器线数 × 4 × 减速比)
例:2048线编码器,50:1减速比
分辨率 = 360° / (2048 × 4 × 50) = 0.0088°
硬件配置示例:
SimpleFOC系统组成
Arduino/STM32 ──→ SimpleFOC Shield ──→ 无刷电机
↑ ↑ ↓
位置指令 电流采样 磁编码器
代码示例(Arduino):
#include <SimpleFOC.h>
// 电机和编码器配置
BLDCMotor motor = BLDCMotor(7); // 7对极
MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C);
// 驱动器配置
BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);
void setup() {
// 编码器初始化
sensor.init();
motor.linkSensor(&sensor);
// 驱动器初始化
driver.voltage_power_supply = 12;
driver.init();
motor.linkDriver(&driver);
// FOC控制模式
motor.controller = MotionControlType::angle;
motor.PID_velocity.P = 0.2;
motor.PID_velocity.I = 2;
motor.PID_velocity.D = 0;
// 初始化FOC
motor.init();
motor.initFOC();
}
void loop() {
motor.loopFOC(); // FOC主循环
motor.move(target_angle); // 位置控制
}
机械臂关节升级方案:
原方案(传统舵机):
升级方案(无刷FOC):
性能提升:
PID参数整定:
常见问题解决:
性能优化技巧:
本章系统介绍了舵机的工作原理、选型方法和应用技术。核心要点包括:
基础知识:
关键参数:
实践要点:
高级技术:
通过本章学习,您应该能够根据项目需求选择合适的舵机,设计可靠的机械连接和供电系统,并了解从传统舵机到无刷FOC的技术演进路径。在实际应用中,要根据精度、成本、功耗等因素综合考虑,选择最适合的方案。
题目1:一个标准舵机接收到1.0ms的PWM脉冲信号,假设舵机的运动范围是0-180°,中位在90°,请计算舵机将转到什么角度?
提示:标准舵机1.5ms对应90°,脉宽范围0.5-2.5ms对应0-180°
题目2:一个机械臂需要提起500g的负载,力臂长度为20cm,请计算所需的最小舵机扭矩。如果考虑1.5倍的安全系数,应该选择多大扭矩的舵机?
提示:扭矩 = 力 × 力臂,重力加速度取10m/s²
题目3:有6个舵机需要同时工作,每个舵机的空载电流为200mA,堵转电流为2A。请估算电源的电流容量需求。
提示:考虑正常工作和峰值情况
题目4:设计一个四足机器人,每条腿有3个关节(髋关节、膝关节、踝关节),机器人总重3kg,需要能够携带1kg负载。请完成以下设计: a) 计算各关节所需的舵机扭矩 b) 选择合适的舵机型号 c) 设计供电方案
提示:考虑最恶劣工况——两腿支撑
题目5:你需要将一个传统的MG996R舵机(精度±2°)升级为高精度伺服系统(目标精度±0.1°)。请设计一个基于FOC控制的升级方案,包括: a) 硬件选型 b) 控制策略 c) 成本效益分析
提示:考虑使用SimpleFOC或ODrive方案
题目6:在设计云台稳定器时,需要实现0.01°的角度分辨率,响应频率达到100Hz。请分析: a) 传统舵机能否满足要求? b) 如果不能,提出解决方案 c) 计算所需的编码器分辨率
提示:考虑控制频率和编码器精度
错误现象:舵机抖动、不响应或位置不准
常见原因:
调试方法:
1. 用示波器检查PWM信号
2. 确认控制器与舵机共地
3. 检查脉宽是否在规格范围内
4. 测试中位信号(1.5ms)
错误现象:舵机无力、复位、抖动
常见原因:
解决方案:
错误现象:舵机发热、噪音大、寿命短
常见原因:
预防措施:
错误现象:舵机运动不协调、超出范围
常见代码错误:
// 错误:未限制角度范围
servo.write(angle); // angle可能>180°
// 正确:添加范围限制
angle = constrain(angle, 0, 180);
servo.write(angle);
问题:数字舵机在模拟舵机系统中工作异常
原因:
解决:
通过遵循这个检查清单,可以确保舵机系统的可靠性和长期稳定运行。