BLDC双电机六步换相控制学习文档
嵌入式crafter全网平台同名,喜欢视频版的可以移步dy、xhs、b站。
项目要求
实现电机的调速(速度环),电流限流(电流环)。
BLDC电机控制
硬件电路设计


EG3116D 是一款高性价比的大功率 MOS 管、IGBT 管栅极驱动专用芯片,内部集成了逻辑信号输入处理电路、电平位移电路、脉冲滤波电路及输出驱动电路,专用于无刷电机控制器中的驱动电路。
EG3116D 高端的工作电压可达 600V,低端 Vcc 的电源电压范围宽 10V~20V,静态电流约 200uA。输入通道 HIN 和 LIN 内建了一个 200K 下拉电阻,在输入悬空时使上、下功率 MOS 管处于关闭状态,输出电流能力 IO+/- 2/2.5A,采用 SOP8 封装。

电机控制原理

电机的控制框图

正反转控制顺序

STM32Cubemx配置
TIM1和TIM8高级定时器配置一致。

PWM配置为10K

配置Clock Source为Internal Clock

BLDC开环控制
void BLDC_stepSwitch_duty(uint8_t motor_num, float pwm_duty)
{TIM_HandleTypeDef *htim = NULL;// 选择对应定时器if (motor_num == MOTOR_1)htim = &htim1;else if (motor_num == MOTOR_2)htim = &htim8;elsereturn; // 参数错误uint8_t hall_state = get_bldc_hall(motor_num);// 记录方向和绝对占空比uint8_t direction = 1; // 1: 正向,0: 反向if (pwm_duty < 0){direction = 0;pwm_duty = -pwm_duty; // 取绝对值}// 限幅占空比 0~1if (pwm_duty > 1.0f) pwm_duty = 1.0f;// 计算比较寄存器值uint32_t pulse = (uint32_t)(PWM_PERIOD * pwm_duty);__disable_irq(); // 屏蔽中断// 关闭所有通道,避免毛刺HAL_TIM_PWM_Stop(htim, TIM_CHANNEL_1);HAL_TIM_PWM_Stop(htim, TIM_CHANNEL_2);HAL_TIM_PWM_Stop(htim, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Stop(htim, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Stop(htim, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Stop(htim, TIM_CHANNEL_3);// 换相逻辑switch (hall_state){case 1: // B-Cif (direction){// B+ C-__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_3);}else{// B- C+__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_2);}break;case 5: // B-Aif (direction){// B+ A-__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_1);}else{// B- A+__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_2);}break;case 4: // C-Aif (direction){// C+ A-__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_1);}else{// C- A+__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_3);}break;case 6: // C-Bif (direction){// C+ B-__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_2);}else{// C- B+__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_3);}break;case 2: // A-Bif (direction){// A+ B-__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_2);}else{// A- B+__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_2);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_1);}break;case 3: // A-Cif (direction){// A+ C-__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_3);}else{// A- C+__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, pulse);HAL_TIM_PWM_Start(htim, TIM_CHANNEL_3);HAL_TIMEx_PWMN_Start(htim, TIM_CHANNEL_1);}break;default:// 异常状态,全悬空保护break;}__enable_irq(); // 恢复中断
}
三线霍尔传感器
三线霍尔传感器精度比较差,每120°才会有一次信号变化,低速运行抖动比较大,能做简单的速度环,但是无法做到平滑慢速控制。
每个霍尔信号是开关量(高电平or低电平)三个信号组合形成6种有效状态,对应转子一个电气周期(360°)。控制器根据霍尔信号变化每120°换向一次,让电机持续旋转。

根据原理图将三线霍尔传感器的GPIO配置为上拉输入模式。

代码设计
/*** @brief 读取三线霍尔传感器数值判断电机位置* @param 电机1:MOTOR_1 电机2:MOTOR_2* @retval 返回120°HALL值*/
uint8_t get_bldc_hall(uint8_t hall_num)
{uint8_t ret = 0;if(hall_num == MOTOR_1){ret |= HAL_GPIO_ReadPin(HALL_A_1_GPIO_Port, HALL_A_1_Pin) << 2;ret |= HAL_GPIO_ReadPin(HALL_B_1_GPIO_Port, HALL_B_1_Pin) << 1;ret |= HAL_GPIO_ReadPin(HALL_C_1_GPIO_Port, HALL_C_1_Pin);}else if(hall_num == MOTOR_2){ret |= HAL_GPIO_ReadPin(HALL_A_2_GPIO_Port, HALL_A_2_Pin) << 2;ret |= HAL_GPIO_ReadPin(HALL_B_2_GPIO_Port, HALL_B_2_Pin) << 1;ret |= HAL_GPIO_ReadPin(HALL_C_2_GPIO_Port, HALL_C_2_Pin);}return ret;
}
速度环调速控制
电机的占空比用于调节电机的转速快慢,而换相是用于控制电机旋转的方向。
1.三根霍尔线分别感应电机转子磁极位置,产生6个状态脉冲,反映电机的转子角度和转子位置。每转一圈,霍尔信号会切换6次,对应电机的6个换向位置(6步换向)。
2. 速度测量,通过计数单位时间内霍尔脉冲数(如10ms内脉冲数),计算脉冲频率。机械转速RPM计算公式:

3. 速度环PID控制
- 设定目标转速(Target RPM)。
- 测量当前转速(Measured RPM)。
- 计算速度误差:

- 通过PID算法根据误差计算控制量(通常是PWM占空比或电压指令)。
4. PWM驱动与换向控制
- 根据PID输出的占空比调整PWM信号,控制电机电压,改变转速。
- 根据霍尔传感器的状态,实现6步换向,保证电机电流相位正确,维持电机平稳转动。
控制流程
获取转速,通过正负号判断电机旋转方向。然后计算速度误差,传给PI控制器得到最终用于控制电机转速的占空比。

盲换相启动:是为了在电机静止时无法获取有效霍尔传感器状态变化的情况下,主动按照预定换相序列给电机施加励磁,使电机初步产生转动。当电机转速达到霍尔传感器,能正确检测到换相状态变化的条件后,系统便可切换到基于霍尔传感器反馈的闭环控制模式。

当检测到霍尔传感器值变化时,进入霍尔闭环换相。

电流检测电路

