基于STM32的高压无刷直流电机控制程序(含硬件设计与软件实现)

一、系统概述

高压无刷直流电机(BLDC) 通常指供电电压≥48V(如72V、310V),功率≥1kW的电机,广泛应用于工业风机、泵类、压缩机等场景。其控制核心是三相逆变桥换相与PWM调速,需解决高压隔离、功率驱动、转子位置检测、过流/过压保护等问题。方案基于STM32F407ZGT6(Cortex-M4,168MHz,带FPU)实现,支持霍尔传感器或无传感器(反电动势检测) 两种模式,具备三段式启动、PID闭环调速、多重保护功能。

二、硬件设计

2.1 核心组件选型

模块 型号/参数 功能说明
主控 STM32F407ZGT6(1MB Flash,192KB RAM) 换相逻辑、PWM生成、电流/电压采样、保护控制
功率驱动 IR2110(半桥驱动,隔离电压2.5kV) 驱动三相逆变桥IGBT(上/下桥臂)
功率器件 6×IKW40N120H3(1200V/40A IGBT) 三相逆变桥(U/V/W相,耐压1200V)
位置检测 3×霍尔传感器(120°电角度分布) 输出U/V/W相位置信号(HALL_A/B/C)
电流采样 LEM LAH-50P(50A/4V,隔离放大器) 母线电流检测(过流保护)
电压采样 电阻分压+隔离运放(AMC1200) 直流母线电压检测(过压/欠压保护)
电源 310V DC(高压母线)+ 15V/5V隔离电源 为驱动电路、控制电路供电(需电气隔离)

2.2 硬件架构与连接

graph TD A[高压电源 310V] --> B[三相逆变桥 IGBT] B --> C[高压无刷电机] D[STM32F407] -->|PWM| E[IR2110驱动] E --> B F[霍尔传感器] -->|HALL_A/B/C| D G[LEM电流传感器] -->|电流信号| D(ADC1_IN0) H[AMC1200电压采样] -->|电压信号| D(ADC1_IN1) D -->|故障信号| I[保护电路 继电器] I --> A[高压电源]

关键引脚分配

  • PWM输出:TIM1_CH1CH3(PA8PA10,上桥臂PWM),TIM1_CH1NCH3N(PB13PB15,下桥臂PWM),带死区时间(2μs);

  • 霍尔信号:HALL_A→PA0,HALL_B→PA1,HALL_C→PA2(外部中断输入,检测边沿);

  • 电流/电压采样:ADC1_IN0(PA3,电流),ADC1_IN1(PA4,电压);

  • 保护输出:PB0(过流/过压时置高,触发继电器切断高压电源)。

三、软件设计(STM32 HAL库)

3.1 系统架构

graph LR A[主程序] --> B[初始化 时钟、PWM、ADC、霍尔] B --> C[启动模式选择 有传感器/无传感器] C --> D[三段式启动 预定位→加速→切换闭环] D --> E[六步换相控制 霍尔/反电动势] E --> F[PWM调速 占空比控制] F --> G[电流/电压采样与保护] G -->|异常| H[故障处理 停机+报警] G -->|正常| E

3.2 核心代码实现

3.2.1 定时器与PWM配置(高级定时器TIM1,带死区)

#include "stm32f4xx_hal.h"

TIM_HandleTypeDef htim1;  // 高级定时器(三相PWM)

// TIM1初始化(20kHz PWM,带死区时间2μs)
void MX_TIM1_Init(void) {
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;                  // 不分频(168MHz)
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 8400 - 1;              // 20kHz(168MHz/8400=20kHz)
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  HAL_TIM_PWM_Init(&htim1);

  // 死区时间配置(2μs:168MHz下,1周期≈5.95ns,2μs≈336个周期)
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 336;         // 死区时间=336 * 5.95ns≈2μs
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;  // 使能刹车功能(保护时关闭PWM)
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
  HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);

  // 配置CH1~CH3为PWM模式1(上桥臂),CH1N~CH3N为互补输出(下桥臂)
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;                      // 初始占空比0
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3);

  // 启动PWM输出(主输出使能)
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);  // 下桥臂
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
}

// 设置PWM占空比(0~100%,对应0~8400计数)
void PWM_SetDuty(uint8_t channel, uint16_t duty) {
  uint16_t pulse = (htim1.Init.Period + 1) * duty / 100;
  switch(channel) {
    case 1: __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pulse); break;
    case 2: __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, pulse); break;
    case 3: __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, pulse); break;
  }
}

3.2.2 霍尔传感器换相逻辑(六步换相)

霍尔传感器输出3路方波(HALL_A/B/C),相位差120°电角度,共6种状态组合,对应6步换相。

// 霍尔状态与换相动作映射表(HALL_A/B/C=XYZ,0=低电平,1=高电平)
const uint8_t comm_table[8] = {0, 5, 3, 2, 1, 4, 6, 0};  // 无效状态=0,有效状态1~6对应换相序号

// 霍尔状态读取(PA0/PA1/PA2)
uint8_t Read_Hall_State(void) {
  return (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) << 2) |  // HALL_A→bit2
         (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) << 1) |  // HALL_B→bit1
         (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) << 0);  // HALL_C→bit0
}

// 换相函数(根据霍尔状态执行六步换相)
void BLDC_Commutate(uint8_t hall_state) {
  uint8_t comm_step = comm_table[hall_state];  // 查表获取换相序号
  if (comm_step == 0) return;  // 无效状态,不换相

  // 关闭所有PWM(先关后开,避免直通)
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0);
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0);

  // 根据换相序号设置上下桥臂导通(1=导通,0=关断)
  switch(comm_step) {
    case 1:  // U+ V-(HALL_A=1,B=0,C=1)
      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);    // U上桥
      HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);  // V下桥
      break;
    case 2:  // U+ W-(HALL_A=1,B=0,C=0)
      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);    // U上桥
      HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);  // W下桥
      break;
    case 3:  // V+ W-(HALL_A=1,B=1,C=0)
      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);    // V上桥
      HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);  // W下桥
      break;
    case 4:  // V+ U-(HALL_A=0,B=1,C=0)
      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);    // V上桥
      HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);  // U下桥
      break;
    case 5:  // W+ U-(HALL_A=0,B=1,C=1)
      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);    // W上桥
      HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);  // U下桥
      break;
    case 6:  // W+ V-(HALL_A=0,B=0,C=1)
      HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);    // W上桥
      HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);  // V下桥
      break;
  }
}

3.2.3 三段式启动(有传感器模式)

高压电机启动需避免过流,采用预定位→加速→切换闭环三段式:

  1. 预定位:强制某两相通电,将转子锁定到已知位置(如U+ V-,锁定到0°电角度);

  2. 加速:按换相顺序逐步升频,同时提高PWM占空比(从30%→80%);

  3. 切换闭环:当转速达到设定阈值(如500RPM),切换为霍尔传感器闭环换相。

// 启动函数(有传感器模式)
void BLDC_Start(void) {
  // 1. 预定位(U+ V-,锁定转子)
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 3000);  // U上桥30%占空比
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);        // V下桥全通
  HAL_Delay(200);  // 锁定200ms

  // 2. 加速阶段(6步换相,逐步升频)
  uint16_t delay_ms = 100;  // 初始换相间隔100ms
  for (int i=0; i<50; i++) {  // 加速50步
    uint8_t hall_state = Read_Hall_State();
    BLDC_Commutate(hall_state);  // 按当前霍尔状态换相
    PWM_SetDuty(1, 30 + i);      // 占空比从30%→80%
    HAL_Delay(delay_ms);
    delay_ms = (delay_ms > 10) ? delay_ms - 2 : 10;  // 逐步缩短换相间隔(加速)
  }

  // 3. 切换闭环(霍尔传感器实时换相)
  start_flag = 1;  // 启动完成标志
}

3.2.4 电流/电压保护与故障处理

// ADC采样与保护(1kHz采样率)
void ADC_Protect_Check(void) {
  static uint16_t adc_buffer[2];
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1, 10);
  adc_buffer[0] = HAL_ADC_GetValue(&hadc1);  // 电流采样(PA3)
  HAL_ADC_PollForConversion(&hadc1, 10);
  adc_buffer[1] = HAL_ADC_GetValue(&hadc1);  // 电压采样(PA4)
  HAL_ADC_Stop(&hadc1);

  // 电流保护(LEM输出4V对应50A,过流阈值40A→3.2V→2048 * 3.2/3.3≈1980)
  if (adc_buffer[0] > 1980) {
    Fault_Handler(OVER_CURRENT);
  }

  // 电压保护(310V对应3.3V,过压330V→3.5V→2184;欠压280V→3.0V→1872)
  if (adc_buffer[1] > 2184 || adc_buffer[1] < 1872) {
    Fault_Handler(OVER_VOLTAGE);
  }
}

// 故障处理函数(停机+报警)
void Fault_Handler(uint8_t fault_type) {
  // 1. 关闭PWM输出(触发刹车功能)
  __HAL_TIM_MOE_DISABLE(&htim1);
  // 2. 切断高压电源(触发继电器)
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
  // 3. 记录故障类型(EEPROM)
  // 4. 报警(LED闪烁+蜂鸣器)
  while(1) {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);  // LED闪烁
    HAL_Delay(500);
  }
}

3.3 主函数(程序入口)

int main(void) {
  HAL_Init();
  SystemClock_Config();  // 168MHz时钟配置
  MX_GPIO_Init();        // GPIO初始化(霍尔、保护、LED)
  MX_ADC1_Init();        // ADC初始化(电流/电压采样)
  MX_TIM1_Init();        // TIM1初始化(PWM)
  MX_USART1_UART_Init();  // 串口初始化(调试用)

  // 启动电机
  BLDC_Start();

  while (1) {
    if (start_flag) {  // 启动完成后进入闭环
      uint8_t hall_state = Read_Hall_State();
      BLDC_Commutate(hall_state);  // 实时换相
      ADC_Protect_Check();         // 保护检测
      HAL_Delay(1);                 // 1ms循环
    }
  }
}

参考代码 STM32控制的高压无刷直流电机程序 www.youwenfan.com/contentcns/182171.html

四、测试与验证

  1. 硬件连接:按2.2节连接STM32、IR2110、IGBT逆变桥、霍尔传感器,确保高压电源与低压控制电路隔离。

  2. 功能测试

    • 上电后电机预定位(轻微震动),随后加速至稳定转速(如1500RPM);

    • 霍尔传感器信号正常时,换相平稳,无异常噪音。

  3. 保护测试

    • 短接电机相线模拟过流,观察是否触发保护(停机+报警);

    • 调整高压电源电压至350V,观察过压保护是否生效。

五、总结

基于STM32F407实现了高压无刷直流电机的控制,核心是六步换相逻辑、PWM死区控制与三段式启动。通过霍尔传感器确保位置检测可靠,多重保护机制保障高压场景下的安全性。可扩展无传感器反电动势检测、PID速度环或CAN通信,满足更复杂的工业控制需求。

posted @ 2026-04-05 21:49  cozicx  阅读(14)  评论(0)    收藏  举报