这一章在干嘛?
把第 21 章的六步换相变成代码:霍尔读转子位置 → 查换相表 → 上桥臂 PWM 调速、下桥臂 IO 开关。这是无刷电机最简单的驱动方式,也是后续闭环的地基。
22.1 硬件设计:H_PWM-L_ON
本书采用 H_PWM-L_ON:只有上桥臂(U/V/W+)走 TIM1 的 CH1/CH2/CH3(PA8/PA9/PA10)输出 PWM 调速;下桥臂(PB13/PB14/PB15)用普通推挽 IO 直接开关。霍尔 U/V/W 接 PH10/PH11/PH12,半桥刹车 SHUTDOWN = PF10(低电平使能、高电平关断)。
原书图 22.1.2:无刷电机接口 1 原理图
原书图 22.1.3:开发板 & 驱动板连接图
跳帽:
JP3 需将 H&Z 与 HALL 短接,才能使用霍尔检测。
22.2 程序设计:霍尔查表换相
定时器 ARR=10000−1、PSC=0,更新中断约 55µs(约 18kHz),最大占空比限制 MAX_PWM_DUTY=(10000-1)×0.96 限速。霍尔状态:U=bit0、V=bit1、W=bit2,组合值 1~6 有效:
原书图 22.2.2.1:无刷电机基本控制流程图
uint32_t hallsensor_get_state(uint8_t motor_id)
{
__IO static uint32_t State;
State = 0;
if (motor_id == MOTOR_1) {
if (HAL_GPIO_ReadPin(HALL1_TIM_CH1_GPIO, HALL1_TIM_CH1_PIN)
!= GPIO_PIN_RESET) State |= 0x01U; /* 霍尔U -> bit0 */
if (HAL_GPIO_ReadPin(HALL1_TIM_CH2_GPIO, HALL1_TIM_CH2_PIN)
!= GPIO_PIN_RESET) State |= 0x02U; /* 霍尔V -> bit1 */
if (HAL_GPIO_ReadPin(HALL1_TIM_CH3_GPIO, HALL1_TIM_CH3_PIN)
!= GPIO_PIN_RESET) State |= 0x04U; /* 霍尔W -> bit2 */
}
return State; /* 返回 1~6 的组合值 */
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{ /* 周期约 55us */
if (htim->Instance == ATIM_TIMX_PWM) {
if (g_bldc_motor1.run_flag == RUN) {
if (g_bldc_motor1.dir == CW) /* 正转:霍尔顺序 6,2,3,1,5,4 */
g_bldc_motor1.step_sta = hallsensor_get_state(MOTOR_1);
else /* 反转:顺序 5,1,3,2,6,4 */
g_bldc_motor1.step_sta = 7 - hallsensor_get_state(MOTOR_1);
if ((g_bldc_motor1.step_sta <= 6) &&
(g_bldc_motor1.step_sta >= 1))
pfunclist_m1[g_bldc_motor1.step_sta - 1](); /* 查表换相 */
else { /* 霍尔错误/接触不良则停机 */
stop_motor1();
g_bldc_motor1.run_flag = STOP;
}
}
}
}
反转的小聪明:
6 种霍尔状态按位取反正好是反序——代码用 7 − 霍尔值 一行实现反转查表,无需第二张表。换相函数如 m1_uhvl()(U 相上桥 PWM、V 相下桥导通)通过给 CCR1 赋 pwm_duty 控制占空比调速;霍尔值 0 或 7 说明传感器错误,立即停机保护。
22.3 下载验证
12~60V DC 电源(建议 24V 额定)。按键:KEY0 每按一次占空比 +500(加速),KEY1 −500(减到负值自动换向),KEY2 停机清零;LCD 显示当前占空比百分比。启动调用 bldc_init(10000-1, 0) 与 bldc_ctrl(MOTOR_1, CCW, 0) 后开定时器。
现象:
按 KEY0 电机一声「哒」后顺滑加速,KEY1 减速,KEY2 随时停机。如果电机抖动不转,优先检查相线顺序(黄绿蓝是否一一对应)和霍尔跳帽。
1. H_PWM-L_ON 驱动方式下,上、下桥臂分别由什么控制?
上桥臂由 TIM1 的 CH1/CH2/CH3(PA8/PA9/PA10)输出 PWM 控制并靠改比较值调速;下桥臂由普通 IO(PB13/PB14/PB15)直接拉高拉低控制导通。
2. 程序如何利用霍尔值实现反转?
正转直接取霍尔组合值(顺序 6,2,3,1,5,4)查换相表;反转取 7−霍尔值(顺序 5,1,3,2,6,4),再经函数指针表 pfunclist_m1 调用对应换相函数。
3. 霍尔组合值为 0 或 7 时程序会怎样?
判定霍尔传感器错误、接触不良或断开,调用 stop_motor1() 关闭 PWM 与所有上下桥臂并将 run_flag 置 STOP,停机保护。