机械臂关节驱动开发:步进/伺服电机闭环控制实操

机械臂的关节不会自己动——你得教会电机"听话",而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 调参实操步骤

  1. 先只开P,从小到大逐步增加,直到系统开始震荡,然后退回60-70%
  2. 加入少量I,消除残余稳态误差
  3. 如果过冲明显,加D抑制,但注意噪声场景下D要谨慎
  4. 反复微调,观察阶跃响应曲线

机械臂关节控制中,位置环通常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就是这套纠错机制的数学表达——理解了这点,调参就从玄学变成了工程。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐