BLDC编码器入门指南:从基础原理到电机控制实战

1次阅读
没有评论

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

image.webp

波形图对比:增量式 vs 绝对式编码器

用示波器捕获两种编码器的典型输出信号:

  • 增量式编码器(如 1000 线 ABZ 输出)
  • A/ B 相:两路 90°相位差的方波
  • Z 相:每转一圈产生单个脉冲
  • 特点:需要上电后寻零,抗干扰能力弱

  • 绝对式编码器(如 SSI 接口)

  • 多路同步数字信号(通常 12-16bit)
  • 每个机械位置对应唯一编码值
  • 特点:断电不丢位置,成本较高

BLDC 编码器入门指南:从基础原理到电机控制实战

霍尔传感器信号解码实战

基础信号特性

霍尔传感器典型输出包含:
– U 相 /HallA
– V 相 /HallB
– W 相 /HallC

每个电周期(360°电角度)会产生 6 个有效状态,对应以下真值表:

HallA HallB HallC 电角度
1 0 1 60°
0 0 1 120°

状态机实现方案

推荐使用 3 位状态编码(HallA<<2 | HallB<<1 | HallC)实现状态切换:

// 霍尔状态转换表(6 步换相)const uint8_t state_table[6] = {0b101, 0b001, 0b011, 0b010, 0b110, 0b100};

void handle_hall_change() {uint8_t current_state = (digitalRead(HallA) << 2) | 
                         (digitalRead(HallB) << 1) |
                          digitalRead(HallC);

  // 查找有效状态位置                          
  for(int i=0; i<6; i++) {if(state_table[i] == current_state) {set_commutation_phase(i); // 执行换相
      break;
    }
  }
}

双平台代码实现

Arduino 模拟霍尔处理

  1. 引脚配置与中断设置

    // 引脚定义
    #define HallA 2
    #define HallB 3
    #define HallC 4
    
    void setup() {
      // 设置为输入带上拉
      pinMode(HallA, INPUT_PULLUP); 
      pinMode(HallB, INPUT_PULLUP);
      pinMode(HallC, INPUT_PULLUP);
    
      // 边沿触发中断
      attachInterrupt(digitalPinToInterrupt(HallA), hall_isr, CHANGE);
    }

  2. 带滤波的转速计算

    // 使用定时器 1 捕获脉冲间隔
    volatile uint32_t last_capture = 0;
    volatile float rpm = 0;
    
    void hall_isr() {
      static uint8_t filter_count = 0;
      uint32_t now = micros();
    
      // 消抖滤波(连续 3 次状态一致才生效)if(digitalRead(HallA) == digitalRead(HallB)) {
        filter_count++;
        if(filter_count >= 3) {
          uint32_t period = now - last_capture;
          rpm = 60.0 * 1e6 / (period * 6); // 6 个状态 / 转
          last_capture = now;
          filter_count = 0;
        }
      }
    }

STM32 硬件编码器接口

  1. 定时器配置(以 TIM4 为例)

    // 使用 TIM4 的编码器模式
    void Encoder_Init(void) {TIM_Encoder_InitTypeDef encoder_config = {0};
    
      encoder_config.EncoderMode = TIM_ENCODERMODE_TI12;
      encoder_config.IC1Filter = 6; // 设置输入滤波器
      encoder_config.IC1Polarity = TIM_ICPOLARITY_RISING;
      encoder_config.IC2Polarity = TIM_ICPOLARITY_RISING;
    
      HAL_TIM_Encoder_Init(&htim4, &encoder_config);
      HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
    }

  2. 位置速度计算

    int32_t get_encoder_speed(void) {
      static int32_t last_count = 0;
      int32_t current_count = TIM4->CNT;
      int32_t delta = current_count - last_count;
    
      // 处理计数器溢出(16bit 情况下)if(delta > 32768) delta -= 65536;
      else if(delta < -32768) delta += 65536;
    
      last_count = current_count;
      return delta * 1000 / ENCODER_CPR; // 返回每毫秒脉冲数
    }

PID 闭环控制实现

class SimplePID {
public:
  float kp, ki, kd;
  float i_term, last_error;

  float compute(float setpoint, float input) {
    float error = setpoint - input;

    // 抗积分饱和
    if(abs(error) < max_i_error) {i_term += ki * error;}

    float d_term = kd * (error - last_error);
    last_error = error;

    return kp * error + i_term + d_term;
  }
};

// 电机控制应用
SimplePID speed_pid;

void motor_control_task() {float current_rpm = get_encoder_rpm();
  float pwm_out = speed_pid.compute(target_rpm, current_rpm);
  set_motor_pwm(pwm_out);
}

避坑指南

机械安装校准

  1. 使用千分表检查电机轴与编码器的同轴度
  2. 径向跳动应 <0.05mm
  3. 轴向窜动应 <0.1mm
  4. 联轴器选择建议
  5. 推荐使用弹性联轴器
  6. 避免使用刚性联轴器

信号处理规范

  1. 接线要求
  2. 使用双绞屏蔽线(如 STP)
  3. 屏蔽层单端接地(接控制器 GND)
  4. 硬件滤波
  5. 信号线对地加 100pF 电容
  6. 串联 100Ω 电阻

软件消抖技巧

  1. 状态变化验证

    bool check_valid_hall_state() {uint8_t s1 = read_hall_state();
      delayMicroseconds(10); // 10us 延时
      uint8_t s2 = read_hall_state();
      return (s1 == s2); // 两次读取一致才有效
    }

  2. 过零检测补偿

    // 在 30°电角度窗口内检测过零点
    if(abs(current_angle - expected_zero) < 30) {apply_phase_compensation(5); // 5°相位补偿
    }

进阶思考方向

  1. 信号频谱分析
  2. 使用 FFT 分析编码器信号中的异常谐波
  3. 典型故障特征:

    • 轴承磨损→特定频率幅值升高
    • 联轴器偏心→转频谐波
  4. 多电机同步方案

  5. 主从模式时钟同步
  6. 编码器脉冲的相位锁定环 (PLL) 实现
  7. 动态调整采样间隔补偿传输延迟

总结体会

经过实际项目验证,BLDC 编码器系统的稳定性取决于三个关键点:机械安装精度、信号处理质量和控制算法响应速度。建议开发时先用示波器监控原始信号质量,再逐步添加控制算法。对于 3000RPM 以上的高速应用,务必注意编码器信号的上升沿时间是否符合要求(通常需 <100ns)。

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