机械臂关节驱动开发:步进/伺服电机闭环控制实操
机械臂关节驱动开发:步进/伺服电机闭环控制实操
机械臂的关节不会自己动——你得教会电机"听话",而PID就是那根教鞭。
一、机械臂关节电机三兄弟
机械臂关节驱动的核心是电机,常见的三种类型各有脾气:
| 类型 | 步进电机 | 伺服电机 | 舵机 |
|---|---|---|---|
| 控制方式 | 脉冲+方向 | 编码器+三环PID | PWM角度 |
| 精度 | 中(开环易丢步) | 高(闭环反馈) | 低( hobby级) |
| 成本 | 低 | 高 | 极低 |
| 适用场景 | 教学/轻载臂 | 工业/重载臂 | 简易关节/夹爪 |
舵机适合末端夹爪和简单的演示臂,但要做正经的关节控制,步进和伺服才是主角。下面重点讲这两位。
二、步进电机驱动:脉冲的艺术
2.1 脉冲+方向控制
步进电机的控制极其简洁:方向信号(DIR)决定正反转,脉冲信号(PULSE)决定转多少步。每发一个脉冲,电机转一个步距角(通常1.8°,即200步/圈)。
方向信号: HIGH = 正转, LOW = 反转
脉冲信号: 每个脉冲上升沿 → 电机走一步
频率越高 → 转速越快
脉冲数越多 → 角度越大
2.2 细分驱动
1.8°的步距角精度有限,细分驱动通过微步进电流分配,将一步细分成多个微步。16细分下,1.8°变成0.1125°/微步,一圈3200微步。
细分的好处:低转速运行更平滑、分辨率更高。但注意——细分不等于精度,微步的定位精度受负载和电机非线性影响,实际定位精度通常低于理论细分精度。
2.3 开环vs闭环步进
- 开环:发脉冲就假设电机走了,不检查实际位置。优点是简单,缺点是丢步——负载突变时电机跟不上脉冲,实际位置偏了但你不知道。
- 闭环:加装编码器反馈,实时比对目标与实际位置,丢步时自动补脉冲。闭环步进电机本质上是"伺服化的步进电机"。
三、伺服电机驱动:三环闭环的精密仪器
伺服电机自带编码器(增量式或绝对式),通过三环控制实现精确运动:
3.1 三环控制架构
位置环(最外层)
│ 输入: 目标位置 输出: 目标速度
│
└──→ 速度环(中间层)
│ 输入: 目标速度 输出: 目标电流(扭矩)
│
└──→ 电流环(最内层)
│ 输入: 目标电流 输出: PWM电压
│ 反馈: 相电流采样
电流环响应最快(μs级),控制扭矩;**速度环**居中(100μs级),控制转速;位置环最外层(~ms级),控制最终角度。环环相扣,从内到外逐层稳定。
3.2 编码器反馈
增量编码器输出A/B两路正交脉冲,每圈线数决定分辨率(如2500线编码器,4倍频后10000计数/圈)。绝对编码器直接输出角度数字值,断电不丢失位置——对机械臂安全启动至关重要。
四、PID控制基础:调参不是玄学
PID是闭环控制的灵魂,三个参数各有分工:
| 参数 | 作用 | 过大会怎样 | 过小会怎样 |
|---|---|---|---|
| P(比例) | 误差越大输出越强 | 过冲、震荡 | 响应慢、到位迟 |
| I(积分) | 消除稳态误差 | 超调、震荡 | 不到位、有偏差 |
| D(微分) | 预判误差趋势 | 噪声放大、抖动 | 抗扰差、过冲 |
4.1 调参实操步骤
- 先只开P,从小到大逐步增加,直到系统开始震荡,然后退回60-70%
- 加入少量I,消除残余稳态误差
- 如果过冲明显,加D抑制,但注意噪声场景下D要谨慎
- 反复微调,观察阶跃响应曲线
机械臂关节控制中,位置环通常P+I即可(D对位置信号噪声敏感),速度环和电流环的PID由驱动器厂商通常已预调好。
五、STM32定时器配置:驱动的心脏
STM32的定时器是电机驱动的核心硬件资源:
5.1 PWM生成(控制电机)
高级定时器(TIM1/TIM8)支持PWM输出,中心对齐模式适合电机驱动:
// STM32 PWM配置 - TIM1 CH1输出电机控制PWM
void pwm_init(void) {
// 假设168MHz时钟,PWM频率20kHz
TIM1->PSC = 0; // 不分频
TIM1->ARR = 8400 - 1; // 168MHz/20kHz = 8400
TIM1->CCR1 = 4200; // 50%占空比初始值
TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // PWM模式1
TIM1->CCER = TIM_CCER_CC1E; // 使能输出
TIM1->BDTR = TIM_BDTR_MOE; // 使能主输出
TIM1->CR1 = TIM_CR1_CMS_0 | TIM_CR1_ARPE | TIM_CR1_CEN;
// CMS_0: 中心对齐模式1, ARPE: ARR预装载
}
5.2 编码器模式(读取反馈)
通用定时器支持编码器正交解码模式,硬件自动计数A/B脉冲:
// TIM3编码器模式配置
void encoder_init(void) {
TIM3->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; // TI1/TI2映射
TIM3->CCER = TIM_CCER_CC1P | TIM_CCER_CC2P; // 上升沿计数
TIM3->SMCR = TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; // 编码器模式3(4倍频)
TIM3->ARR = 0xFFFF; // 16位计数范围
TIM3->CR1 = TIM_CR1_CEN; // 启动计数
}
调用 TIM3->CNT 即可读取当前编码器计数值,换算成角度。
六、电机驱动电路:H桥与驱动IC
电机需要双向转动,H桥电路是基础:
Q1 Q3
+──┤──┤──┤──┤──+
│ │
│ ┌──M──┐ │
│ │电机 │ │
│ └─────┘ │
│ │
+──┤──┤──┤──┤──+
Q2 Q4
Q1/Q4导通→正转,Q2/Q3导通→反转。实际开发中用集成驱动IC更方便:
- TB6612FNG:双通道,1.2A持续/3.2A峰值,3.2V~5V逻辑,适合小型步进
- DRV8833:双通道,1.5A持续,2V~11.8V,内置过热保护
- DRV8711:步进电机专用,8细分预驱动,外接MOSFET可达更高电流
选IC的关键指标:持续电流、逻辑电压兼容性、保护功能(过热/过流/欠压)。
七、PID闭环控制代码框架
以下是一个基于STM32的步进电机闭环位置控制完整框架:
typedef struct {
float kp; // 比例系数
float ki; // 积分系数
float kd; // 微分系数
float integral; // 积分累积
float prev_error; // 上次误差
float output_limit; // 输出限幅
} PID_t;
float pid_calculate(PID_t *pid, float target, float actual) {
float error = target - actual;
// 积分限幅防饱和
pid->integral += error;
if (pid->integral > pid->output_limit)
pid->integral = pid->output_limit;
if (pid->integral < -pid->output_limit)
pid->integral = -pid->output_limit;
float derivative = error - pid->prev_error;
pid->prev_error = error;
float output = pid->kp * error
+ pid->ki * pid->integral
+ pid->kd * derivative;
// 输出限幅
if (output > pid->output_limit) output = pid->output_limit;
if (output < -pid->output_limit) output = -pid->output_limit;
return output;
}
// 1ms周期控制任务
void motor_control_task(void) {
float target_angle = get_target_from_trajectory(); // 上位机给的目标
float actual_angle = encoder_read() * ANGLE_PER_COUNT; // 编码器反馈
float speed_cmd = pid_calculate(&joint_pid, target_angle, actual_angle);
pwm_set_duty(speed_cmd); // PID输出映射为PWM占空比
}
控制周期通常1ms(1kHz),由定时器中断驱动。PID输出映射到PWM占空比,控制电机转速朝目标角度逼近。
八、常见问题排查
| 问题 | 可能原因 | 排查方法 |
|---|---|---|
| 丢步 | 负载突变/加速过快/开环无反馈 | 降加速度、改闭环、加大电机 |
| 抖动 | D参数过大/P过高/编码器噪声 | 减D、减P、加滤波、检查接线 |
| 过冲 | P过大/I过大/D不足 | 减P、减I、适当加D |
| 响应慢 | P太小/I太小/控制周期低 | 加P、加I、提高中断频率 |
| 稳态偏差 | I=0(纯P控制) | 加入积分项消除静差 |
一个实用调试技巧:在STM32的串口上实时输出目标值和实际值的曲线,用Python matplotlib可视化,调参效率提升十倍。
闭环控制的核心思想:不是让电机"听话"地走完脉冲,而是让它"认错"地不断修正偏差,直到到位。PID就是这套纠错机制的数学表达——理解了这点,调参就从玄学变成了工程。
更多推荐



所有评论(0)