CCS编码器中断读数处理实战:从异常检测到数据恢复

1次阅读
没有评论

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

image.webp

工业场景中的编码器中断问题

去年调试六轴机械臂时,我曾遇到一个诡异现象:每当附近变频器启动时,机械臂末端就会出现 3 -5mm 的随机漂移。经过两周的排查,最终锁定问题根源——编码器信号线受到干扰导致的中断读数丢失。这种看似微小的信号异常,在积分运算后会引发严重的累积误差,最终表现为机械臂定位失准。

三层防护机制详解

硬件层:打造干净信号输入

编码器信号传输中最头疼的就是信号抖动问题。下图是实测的原始信号波形(此处应有示波器截图):

CCS 编码器中断读数处理实战:从异常检测到数据恢复

解决方案:

  1. RC 滤波电路设计
  2. 临界频率计算公式:$f_c = \frac{1}{2\pi RC}$
  3. 典型参数选择(针对 100kHz 编码器):

    • R=1kΩ
    • C=100pF
    • 理论截止频率 159kHz
  4. PCB 布局要点

  5. 信号线走内层且包地处理
  6. 连接器处放置 TVS 二极管(如 SMBJ5.0CA)
  7. 避免与电机电源线平行走线

驱动层:智能状态机设计

typedef enum {
    ENCODER_NORMAL,
    ENCODER_FAULT,
    ENCODER_RECOVERING  
} EncoderState;

// 状态转换条件示例
if(LL_GPIO_IsInputPinSet(ENCODER_Z_PORT, ENCODER_Z_PIN)) {if(++fault_counter > FAULT_THRESHOLD) {current_state = ENCODER_FAULT;}
}

关键处理逻辑:

  1. 故障判定标准
  2. 连续丢失 5 个脉冲(可配置)
  3. Z 相信号超时未触发

  4. 恢复策略

  5. 故障后首次收到 Z 相信号时切换至 RECOVERING 状态
  6. 连续收到 10 个正常脉冲后回归 NORMAL 状态

应用层:运动数据重建

当检测到中断时,采用二阶运动模型补偿:

$$
\begin{cases}
\theta_{est} = \theta_{last} + \omega_{avg} \cdot \Delta t \
\omega_{avg} = \frac{\omega_{pre1} + \omega_{pre2}}{2}
\end{cases}
$$

卡尔曼滤波实现要点:

// 状态向量定义
typedef struct {
    float position;
    float velocity;
} KalmanState;

// 预测步骤
void kalman_predict(KalmanState* s, float dt) {
    s->position += s->velocity * dt;
    // 此处省略协方差更新
}

关键代码实现

中断服务例程

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin == ENCODER_A_PIN) {uint32_t primask = __get_PRIMASK();
        __disable_irq();

        // 边缘检测与计数
        uint8_t a_val = HAL_GPIO_ReadPin(ENCODER_A_GPIO_Port, ENCODER_A_Pin);
        uint8_t b_val = HAL_GPIO_ReadPin(ENCODER_B_GPIO_Port, ENCODER_B_Pin);
        encoder_update(a_val, b_val);

        __set_PRIMASK(primask);
    }
}

带单位换算的数据处理

#define PULSES_PER_REV (2048)  // 17 位编码器

float get_angular_velocity(uint32_t pulse_count, float delta_t) {
    // 转 / 分钟 -> 弧度 / 秒
    return (pulse_count * 2 * M_PI * 60) / (PULSES_PER_REV * delta_t);
}

避坑指南

中断响应时间匹配

  1. 计算最大允许中断延迟:
    $$
    t_{max} = \frac{60}{RPM \times PPR}
    $$
  2. 示例:2000RPM@2048PPR → 14.65μs

  3. 实测方法:

  4. 在中断入口 / 出口翻转 GPIO
  5. 用逻辑分析仪测量脉冲宽度

EMC 问题解决方案

  1. 常见地环路问题表现:
  2. 电机运行时编码器计数随机跳变
  3. 重启后问题消失,运行一段时间再现

  4. 改进措施:

  5. 使用隔离式编码器接口(如 AMC1301)
  6. 电机与控制器间采用单点接地
  7. 信号线使用双绞线 + 屏蔽层

开放性问题

在多轴协同控制系统中,当多个编码器同时发生中断时:
1. 如何设计优先级仲裁机制?
2. 共享总线架构下如何避免中断风暴?
3. 能否利用 DMA 减轻 CPU 中断负荷?

(全文约 1500 字,含 6 个代码块 / 公式)

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