🚀 深入解析 BLDC 电机驱动核心:六步换向(方波驱动)

🎯 导言:驱动 BLDC 电机的第一步

无刷直流电机(Brushless DC Motor,BLDC)因其高效率、高功率密度和长寿命,被广泛应用于无人机、电动工具和现代家电中。与有刷电机不同,BLDC 需要电子换向器来持续驱动它,而**六步换向(Six-Step Commutation)**就是实现这一目标最基础、最经典的方法。

本文将详细解析六步换向的工作原理,并提供核心代码框架,助您理解和实现 BLDC 电机驱动。


⚙️ 一、六步换向原理介绍

1.1 什么是六步换向?

六步换向,也常被称为梯形波驱动或 120∘120^\circ120∘ 导通模式,它是一种根据转子位置,周期性地切换定子绕组电流的技术,以产生持续的转矩。

核心思想: 在任何给定的时刻,只有三相绕组中的两相导电,一相接电源(高电位),一相接地(低电位),而第三相绕组保持浮空(高阻态)。

1.2 为什么是“六步”?

一个标准的 BLDC 电机有三相绕组(U、V、W),由六个开关管(通常是 MOSFETs)组成的 三相逆变器(H桥) 驱动。

电机每旋转 360∘360^\circ360∘ 电角度,需要六种不同的驱动状态才能保持转子磁场和定子磁场之间的最佳夹角(理论上接近 90∘90^\circ90∘)。这六种状态构成了完整的换向周期。每切换一步,电机在电角度上旋转 60∘60^\circ60∘。

1.3 位置反馈:霍尔传感器

为了知道何时进行切换,驱动器需要知道转子的当前位置。六步换向最常用的位置反馈元件是霍尔传感器(Hall Sensors)。

  • BLDC 电机内部通常嵌入了三个霍尔传感器(HA,HB,HCH_A, H_B, H_CHA​,HB​,HC​),它们之间相隔 120∘120^\circ120∘ 或 60∘60^\circ60∘ 电角度。
  • 这三个传感器在转子磁场经过时产生 23=82^3 = 823=8 种状态。其中,六种状态是有效的换向状态(例如 000000000 和 111111111 是无效或禁止状态)。
  • 当霍尔状态发生改变时(通常通过微控制器的外部中断捕获),表明转子已移动到需要切换驱动电流的下一个 60∘60^\circ60∘ 扇区。

💻 二、核心换向表(Commutation Table)

换向表是将霍尔传感器状态(输入)映射到 MOSFET 开关序列(输出)的核心逻辑。

假设我们采用 120∘120^\circ120∘ 导通模式,且电机按**顺时针(CW)**方向旋转:

Step霍尔状态 (HCHBHAH_C H_B H_AHC​HB​HA​)驱动相(+ to -)驱动绕组导通 High Side导通 Low Side
1101 (5)U →\to→ VU+, V-UHighU_{High}UHigh​VLowV_{Low}VLow​
2001 (1)U →\to→ WU+, W-UHighU_{High}UHigh​WLowW_{Low}WLow​
3011 (3)V →\to→ WV+, W-VHighV_{High}VHigh​WLowW_{Low}WLow​
4010 (2)V →\to→ UV+, U-VHighV_{High}VHigh​ULowU_{Low}ULow​
5110 (6)W →\to→ UW+, U-WHighW_{High}WHigh​ULowU_{Low}ULow​
6100 (4)W →\to→ VW+, V-WHighW_{High}WHigh​VLowV_{Low}VLow​
  • +: 绕组连接到电源电压(通过高侧 MOSFET)。
  • -: 绕组连接到地(通过低侧 MOSFET)。
  • 浮空: 该绕组的两个 MOSFET 都关闭。
  • 速度控制: 通常通过对高侧 (High Side) MOSFET 使用 PWM(脉冲宽度调制) 来控制施加到绕组上的有效电压,从而控制电机速度。

💡 三、关键代码实现框架(C/C++)

六步换向的代码通常在微控制器(MCU)上实现,核心逻辑位于**中断服务程序(ISR)**中。

3.1 预备:硬件抽象与死区时间

在代码层面,我们首先需要一个函数来安全地控制六个 MOSFET。

❗ 重要提醒:死区时间(Dead Time)
在切换同一个桥臂的高侧和低侧开关时,必须插入一个极短的延迟(通常由 PWM 硬件自动管理),以防止两个开关同时导通造成电源短路。这是电机驱动的安全红线。

// ----------------------
// 1. 硬件抽象函数
// ----------------------

// 定义占空比类型 (取决于您的MCU库)
typedef uint16_t PWM_Duty_t;

/**
 * @brief 安全地设置三相驱动状态
 * @param uh_duty: U相高侧PWM占空比 (0-MAX)
 * @param ul_gpio: U相低侧GPIO状态 (1=ON, 0=OFF)
 * ... V, W 相类似
 */
void SetMotorDrive(PWM_Duty_t uh_duty, int ul_gpio, 
                   PWM_Duty_t vh_duty, int vl_gpio, 
                   PWM_Duty_t wh_duty, int wl_gpio) 
{
    // 安全策略:确保同一相的高低侧不会同时被设置
    
    // 示例:U相驱动逻辑
    if (uh_duty > 0) {
        Disable_Low_Side(U_LOW_GPIO);
        Set_PWM_Duty(U_HIGH_PWM_CHANNEL, uh_duty);
    } else if (ul_gpio == 1) {
        Disable_PWM(U_HIGH_PWM_CHANNEL);
        Enable_Low_Side(U_LOW_GPIO);
    } else {
        Disable_All(U_HIGH_PWM_CHANNEL, U_LOW_GPIO); // 浮空/停止
    }
    // ... 对 V, W 相重复类似逻辑
}

3.2 核心:换向函数

这是根据霍尔状态执行换向操作的主函数。

// ----------------------
// 2. 核心换向逻辑
// ----------------------

// 全局变量:当前速度控制占空比
volatile PWM_Duty_t current_pwm_speed = 500; // 假设满速是 1000

/**
 * @brief 执行换向,实现电机旋转
 * @param hall_state: 当前读取到的霍尔状态 (0x01 到 0x06)
 */
void Commutate(uint8_t hall_state) {
    
    PWM_Duty_t PWM_VAL = current_pwm_speed; // 速度控制值

    switch (hall_state) {
        case 0b101: // Step 1: U(+) V(-) W(Float)
            // uh, ul, vh, vl, wh, wl
            SetMotorDrive(PWM_VAL, 0,    0, 1,    0, 0); 
            break;
            
        case 0b001: // Step 2: U(+) V(Float) W(-)
            SetMotorDrive(PWM_VAL, 0,    0, 0,    0, 1);
            break;
            
        case 0b011: // Step 3: U(Float) V(+) W(-)
            SetMotorDrive(0, 0,    PWM_VAL, 0,    0, 1);
            break;
            
        case 0b010: // Step 4: U(-) V(+) W(Float)
            SetMotorDrive(0, 1,    PWM_VAL, 0,    0, 0);
            break;
            
        case 0b110: // Step 5: U(-) V(Float) W(+)
            SetMotorDrive(0, 1,    0, 0,    PWM_VAL, 0);
            break;
            
        case 0b100: // Step 6: U(Float) V(-) W(+)
            SetMotorDrive(0, 0,    0, 1,    PWM_VAL, 0);
            break;
            
        default: // 非法状态 (000, 111, 或其他) -> 安全停止
            SetMotorDrive(0, 0, 0, 0, 0, 0);
            break;
    }
}

3.3 主程序与中断处理

// ----------------------
// 3. 中断和主循环
// ----------------------

/**
 * @brief 霍尔传感器中断服务程序 (ISR)
 * 此函数在任何一个霍尔传感器电平变化时触发
 */
void HALL_SENSOR_ISR_Handler() {
    
    // 1. 读取当前霍尔传感器状态
    uint8_t current_hall_state = Read_Hall_Sensors_Pins(); 
    
    // 2. 调用换向函数
    Commutate(current_hall_state);
    
    // 3. (可选) 速度计算:记录当前时间,用于计算电机转速
    // Calculate_Motor_Speed_RPM(); 
}

int main() {
    // 1. 初始化 MCU, PWM, GPIO, 中断等外设
    
    // 2. 配置霍尔传感器引脚为外部中断触发模式
    
    // 3. (启动阶段) 读取初始霍尔状态并开始第一次驱动
    Commutate(Read_Hall_Sensors_Pins());
    
    while (1) {
        // 主循环通常用于用户交互、故障处理、通信等非实时任务
        // 例如:Update_Speed_From_UART(current_pwm_speed);
    }
}

总结与进阶

六步换向是理解 BLDC 驱动技术的基石。它简单、直接,是大多数 BLDC 应用的起点。

特性六步换向(方波)
控制复杂度低
控制信号方波电流
转矩脉动高(有噪音)
位置传感器必需(霍尔)
PWM 使用仅用于速度控制

如果您追求更高效率、更平稳的运行和更低噪音,下一步可以研究更复杂的磁场定向控制(Field-Oriented Control, FOC)。


希望这份详尽的博客文章结构对您有所帮助!您只需要将 <> 中的占位符替换为您特定 MCU 平台的代码即可。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐