310直流电机编码器精准控制实战:从PID算法到抗干扰设计

1次阅读
没有评论

共计 2147 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点

工业现场中,310 直流电机搭配光电编码器使用时,常遇到两个典型问题:

310 直流电机编码器精准控制实战:从 PID 算法到抗干扰设计

  • 脉冲丢失 :电机高速旋转(>3000RPM)时,因电磁干扰导致边沿信号被淹没,计数器漏检正交脉冲
  • 信号抖动 :电机启停瞬间因机械振动产生的毛刺,被误识别为有效跳变,导致位置累计误差

实测某生产线设备在负载突变时,编码器原始信号会出现持续 200ns 的振荡(示波器触发模式捕捉),导致单日位置漂移达 15 个脉冲当量。

技术方案对比

方案 1:STM32 硬件编码器接口

优点
– 自动处理正交信号相位关系(TIMx_CR1 寄存器的 CMS 位)
– 支持 4 倍频计数(TI1/TI2 边沿均触发)
– 不占用 CPU 资源(DMA 可配合读取 CNT 值)

缺点
– 仅特定定时器支持(如 F4 系列的 TIM1/TIM8)
– 最高输入频率受 APB 总线时钟限制

方案 2:外部中断 +GPIO 轮询

优点
– 所有 IO 口均可实现
– 可自定义滤波算法

缺点
– 高频下 CPU 负载率飙升(1MHz 时占用量化测试达 73%)
– 需要严格优化中断服务程序

方案 3:专用解码芯片(如 LS7366R)

优点
– 自带 32 位计数器
– SPI 接口输出绝对值

缺点
– 增加 BOM 成本(约 $2.1/ 片)
– 响应延迟约 4us

最终选择 :基于 TIM3 硬件编码器模式,配合窗口滤波算法(硬件资源与性能平衡最佳)

核心实现

硬件接口配置(CubeMX 生成代码增强版)

// TIM3 初始化片段(参考 RM0090 手册 18.4.11 节)TIM_Encoder_InitTypeDef sConfig = {0};
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;  // 正交模式
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; // TI1 上升沿有效
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;      // 无分频
sConfig.IC1Filter = 6;                     // 8 个时钟周期滤波 (APB1=42MHz 时约 190ns)
// 同理配置 TI2 通道...
HAL_TIM_Encoder_Init(&htim3, &sConfig);
__HAL_TIM_SET_COUNTER(&htim3, 32768);       // 预装中间值防溢出
TIM_RESET_ENCODERVALUE(&htim3);             // 自定义宏清零编码器历史值 

软件窗口滤波算法

#define WINDOW_SIZE 5
int32_t filter_buffer[WINDOW_SIZE];

int32_t WindowFilter_Update(int32_t new_val) {
    static uint8_t idx = 0;
    filter_buffer[idx++] = new_val;
    if(idx >= WINDOW_SIZE) idx = 0;

    // 排序找中值(冒泡排序简化版)for(int i=0; i<WINDOW_SIZE-1; i++) {for(int j=i+1; j<WINDOW_SIZE; j++) {if(filter_buffer[i] > filter_buffer[j]) {int32_t tmp = filter_buffer[i];
                filter_buffer[i] = filter_buffer[j];
                filter_buffer[j] = tmp;
            }
        }
    }
    return filter_buffer[WINDOW_SIZE/2]; // 返回中值
}

性能验证

波形对比(示波器 DPO3014 实测)

  • 原始信号 :电机 3000RPM 时,TI1 通道出现约 120mVpp 的噪声(周期约 400ns)
  • 解码后 :经过硬件滤波 + 软件窗口处理,有效消除脉宽 <500ns 的抖动

捕获成功率统计

转速 (RPM) 无滤波成功率 硬件滤波成功率 硬件 + 软件成功率
500 99.2% 99.8% 99.9%
2000 87.4% 96.1% 99.3%
3500 62.5% 89.7% 97.6%

避坑指南

PCB 布局要点

  • 电源隔离 :编码器 5V 电源采用 ADuM5000 隔离 DC-DC 模块,与电机驱动电源保持≥3mm 间距
  • 信号走线
  • 差分线对(A+/A-)严格等长(偏差 <50mil)
  • 包地处理且远离 PWM 走线

定时器溢出处理

// 在 TIM3 溢出中断中补偿计数值(32 位扩展)void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if(htim->Instance == TIM3) {g_encoder_total += 65536 * (htim->Instance->CR1 & TIM_CR1_DIR ? -1 : 1);
    }
}

进阶思考:卡尔曼滤波优化

对于 <100RPM 的低速场景,可建立状态空间模型:

x(k) = [位置; 速度]  // 状态向量
z(k) = 编码器原始值 // 观测值 

预测方程参考电机运动学模型,测量噪声协方差 R 通过离线标定获得(实测值约 0.2 个脉冲方差)。经测试,低速时位置估计误差可降低 40%。

结语

通过硬件接口优化 + 软件算法协同设计,最终实现:
– 位置控制误差≤±0.5 个脉冲当量
– 抗干扰能力满足 ISO 13766- 2 标准
方案已批量应用于 AGV 驱动系统,连续运行 6 个月零误报。下一步计划移植到带 FPU 的 M7 内核芯片,进一步优化算法实时性。

正文完
 0
评论(没有评论)