4. 霍尔传感器换相逻辑实现

任务目标

本案例基于霍尔传感器输出的三路开关信号(HA/HB/HC),实现无刷直流电机(BLDC)的六步换相逻辑。输入为霍尔信号组合,输出为三相逆变桥六个功率管(Q1~Q6)的导通状态,使电机按固定顺序换相旋转。

核心原理

霍尔传感器安装在电机定子上,每60°电角度产生一次信号跳变,三路信号组合共有6个有效状态(另2个为非法状态)。每个状态对应唯一的功率管导通组合,使转子磁场始终超前定子磁场一定角度,维持持续转矩输出。换相表是六步换相的核心数据结构。

关键完整代码


// hall_commutation.h
#ifndef HALL_COMMUTATION_H
#define HALL_COMMUTATION_H

#include <stdint.h>

// 三相全桥功率管定义:Q1/Q3/Q5为上桥臂,Q2/Q4/Q6为下桥臂
// 导通状态编码:bit0=Q1, bit1=Q2, bit2=Q3, bit3=Q4, bit4=Q5, bit5=Q6
typedef enum {
    PWM_NONE = 0x00,
    // 霍尔状态 101 (HA=1, HB=0, HC=1) → 导通 Q1+Q4
    COMM_STATE_1 = 0x11,   // 0001 0001
    // 霍尔状态 100 → 导通 Q1+Q6
    COMM_STATE_2 = 0x21,   // 0010 0001
    // 霍尔状态 110 → 导通 Q3+Q6
    COMM_STATE_3 = 0x22,   // 0010 0010
    // 霍尔状态 010 → 导通 Q3+Q2
    COMM_STATE_4 = 0x0C,   // 0000 1100
    // 霍尔状态 011 → 导通 Q5+Q2
    COMM_STATE_5 = 0x14,   // 0001 0100
    // 霍尔状态 001 → 导通 Q5+Q4
    COMM_STATE_6 = 0x18    // 0001 1000
} CommState_t;

// 霍尔信号组合 → 换相状态查找表(索引为霍尔值 0~7)
// 霍尔信号按 (HA<<2 | HB<<1 | HC) 编码
static const uint8_t hall_comm_table[8] = {
    PWM_NONE,        // 000 非法
    COMM_STATE_6,    // 001
    COMM_STATE_4,    // 010
    COMM_STATE_5,    // 011
    COMM_STATE_2,    // 100
    COMM_STATE_1,    // 101
    COMM_STATE_3,    // 110
    PWM_NONE         // 111 非法
};

// 根据霍尔信号获取功率管导通状态
static inline uint8_t hall_get_commutation(uint8_t hall_abc) {
    if (hall_abc > 7) return PWM_NONE;
    return hall_comm_table[hall_abc];
}

#endif // HALL_COMMUTATION_H

// main.c 示例调用
#include <stdio.h>
#include "hall_commutation.h"

// 模拟霍尔信号读取(实际项目中连接GPIO)
uint8_t read_hall_sensors(void) {
    // 示例:返回霍尔状态 5 (101)
    return 0x05;
}

int main(void) {
    uint8_t hall = read_hall_sensors();
    uint8_t pwm_state = hall_get_commutation(hall);
    
    printf("Hall: 0x%X → PWM: 0x%X\n", hall, pwm_state);
    
    // 验证:霍尔101应输出COMM_STATE_1 (0x11)
    if (pwm_state == COMM_STATE_1) {
        printf("换相逻辑正确\n");
    } else {
        printf("换相逻辑错误\n");
    }
    return 0;
}

换相表推导说明

换相表依据“定子磁场超前转子磁场120°电角度”原则推导。以霍尔状态101为例:此时转子磁极位于使HA和HC为高电平的位置,定子应导通Q1(A相上桥)和Q4(B相下桥),使电流从A相流入、B相流出,产生与转子位置匹配的定子磁场方向。其余状态按转子每旋转60°电角度依次切换功率管组合,形成六步循环。

运行与验证

  1. 编译:将上述两个文件保存后执行 gcc -o hall_test main.c
  2. 运行:./hall_test
  3. 预期输出:Hall: 0x5 → PWM: 0x11 及 换相逻辑正确
  4. 完整验证:修改 read_hall_sensors() 返回值依次为1~6,确认输出分别对应COMM_STATE_6、COMM_STATE_4、COMM_STATE_5、COMM_STATE_2、COMM_STATE_1、COMM_STATE_3

DSP工程接入要点

在C2000平台(如TMS320F28069)中,将 read_hall_sensors() 替换为GPIO读取函数(如 GPIOReadPin()),并将返回的PWM状态值直接写入ePWM模块的比较寄存器或通过查表映射到6路PWM输出引脚。换相周期由霍尔信号跳变触发中断(或eCAP模块捕获)驱动,确保每次霍尔变化立即更新PWM输出。

常见问题

  • 非法状态处理:霍尔值0和7为非法状态(传感器故障或安装错误),代码返回PWM_NONE关闭所有功率管,避免直通短路。
  • 换相时序:实际应用中需在霍尔信号变化后加入死区时间(典型值1~3μs),防止上下桥臂直通,本案例未包含死区生成逻辑,需在PWM硬件模块中配置。
  • 旋转方向:若电机反转,只需将换相表反向映射(将表索引按相反顺序排列)即可。