共计 1404 个字符,预计需要花费 4 分钟才能阅读完成。
电机特性与编码器基础
25GA370 是一款直流有刷电机,额定电压 24V,典型空载转速 3700RPM,峰值扭矩 0.25N·m。配套的增量式编码器采用 ABZ 三相输出:

- A/ B 相 :相位差 90°的方波信号,用于判断转向和位置计数
- Z 相 :每转产生 1 个脉冲的零位信号
- 线数 :常见 500 线,即单相每转输出 500 个脉冲(4 倍频后分辨率达 2000PPR)
工业场景中的三大痛点
- 低速抖动 :开环控制时 PWM 频率与机械谐振频率耦合导致
- 位置累积误差 :负载突变或打滑时开环系统无法感知实际位移
- 速度波动 :传统测速法(如反电动势检测)响应延迟达 100ms 级
闭环控制技术方案
开环 vs 闭环对比
| 指标 | 开环控制 | 闭环控制 |
|---|---|---|
| 精度 | ±5% | ±0.1% |
| 抗扰性 | 差 | 优秀 |
| 成本 | 低 | 需编码器 + 处理器 |
STM32 编码器接口配置
// CubeMX 配置:TIM3 选择 Encoder Mode
void Encoder_Init(void) {
htim3.Init.Period = 0xFFFF; // 16 位计数器
htim3.EncoderMode = TIM_ENCODERMODE_TI12; // 双通道计数
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
}
// 带软件消抖的位置读取
int32_t Get_Position() {
static uint16_t last_cnt = 0;
uint16_t cur_cnt = TIM3->CNT;
if(abs(cur_cnt - last_cnt) > 1000) { // 防溢出处理
overflow_count += (cur_cnt < last_cnt) ? 1 : -1;
}
last_cnt = cur_cnt;
return overflow_count * 65536 + cur_cnt;
}
PID 控制核心代码
typedef struct {
float Kp, Ki, Kd;
float integral;
float prev_error;
float max_output;
} PID_Controller;
float PID_Update(PID_Controller *pid, float error) {
// 积分抗饱和
if(fabs(pid->integral) < pid->max_output * 2) {pid->integral += error;}
float derivative = error - pid->prev_error;
pid->prev_error = error;
return pid->Kp * error +
pid->Ki * pid->integral +
pid->Kd * derivative;
}
关键波形分析
当电机正转时:
- A 相上升沿超前 B 相 90°
- 4 倍频解码后每个周期包含 4 个边沿事件
- 转速计算公式:
$$
RPM = \frac{PulseCount \times 60}{PPR \times SampleTime(s)}
$$
工程避坑指南
信号传输优化
- 双绞线传输距离 >5m 时需加 RS422 差分驱动
- 终端匹配电阻取 120Ω±1%
接地规范
电机外壳 ━━━━┓
├─→ 单独接地桩
编码器屏蔽层━┛
过载保护策略
- 电流采样电阻选用 50mΩ/2W 规格
- 硬件过流保护阈值设定为额定值 150%
- 软件保护触发后立即切换为能耗制动
进阶思考
当转速 >2000RPM 时,传统 PID 会因采样延迟产生估计误差。卡尔曼滤波通过融合编码器脉冲计数与电机模型预测值,可将位置估计精度提升 40% 以上。其状态方程如何构建?过程噪声矩阵 Q 与观测噪声矩阵 R 又该如何取值?
正文完
