脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果。bldc控制器方案,无刷电机。 。提供源码,原理图。
一、代码概述
本代码基于华大半导体HC32L130系列MCU,实现了无霍尔传感器的BLDC(无刷直流电机)控制方案,核心采用脉冲注入法(IPD)进行转子初始位置检测与低速启动,结合反电动势(BEMF)检测实现电机高速运行时的换相控制。代码整体遵循模块化设计思想,涵盖系统初始化、硬件驱动、电机控制算法、中断处理等核心功能模块,可广泛应用于家电、无人机、电动工具等需要无霍尔电机控制的场景。
二、核心技术架构
(一)控制原理
无霍尔BLDC电机控制的核心挑战在于转子位置检测,本代码采用"脉冲注入法+反电动势检测"的混合控制策略:
- 低速/启动阶段:通过脉冲注入法(IPD)向电机绕组注入特定脉冲,检测绕组电流响应以判断转子初始位置,实现平稳启动;
- 高速运行阶段:当电机转速达到一定阈值后,切换至反电动势检测模式,通过比较绕组反电动势与中性点电压判断换相时机,减少运行损耗。
(二)代码目录结构
├── Common/ // 公共基础模块 │ ├── base_types.h // 基础数据类型与宏定义 │ ├── board_stkhc32l13x.h // 开发板硬件定义(GPIO、时钟等) │ ├── ddl_device.h // 设备系列定义 │ ├── hc32l13x.h // MCU寄存器与外设结构体定义 │ ├── interrupts_hc32l13x.c/h // 中断管理实现 │ ├── startup_hc32l13x.s // 启动文件(中断向量表、堆栈配置) │ ├── system_hc32l13x.c/h // 系统时钟初始化 ├── Pro/ // 项目配置文件 │ ├── Objects/ // 编译输出文件 │ ├── RTE/ // 运行时环境配置 │ ├── EventRecorderStub.scvd // 事件记录配置 │ ├── JLinkSettings.ini // 调试器配置 │ ├── main.c // 主函数与应用初始化 ├── User/ // 用户应用模块 │ ├── s_common.h // 公共头文件包含 │ ├── s_config.h // 配置宏定义 │ ├── s_ipd.c // 脉冲注入法(IPD)实现 │ ├── s_sensorless.h // 无霍尔控制核心逻辑 │ ├── s_variable.h // 全局变量定义三、核心模块功能详解
(一)系统初始化模块(system_hc32l13x.c + main.c)
1. 时钟初始化(InitSystemClock)
- 功能:配置MCU核心时钟与外设时钟,为系统运行提供时序基础。
- 关键配置:
- 启用内部高速时钟(RCH)初始为4MHz,通过PLL倍频至48MHz作为系统主时钟;
- 配置Flash等待周期(1个时钟周期),适配48MHz高速运行;
- 使能SysTick定时器,配置1ms中断(用于系统延时与任务调度);
- 使能ADC、GPIO、TIM3等外设时钟。
- 代码片段:
Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz); // 配置RCH为4MHz stcPLLCfg.enInFreq = SysctrlPllInFreq4_6MHz; // PLL输入频率范围 stcPLLCfg.enOutFreq = SysctrlPllOutFreq36_48MHz; // PLL输出频率范围 stcPLLCfg.enPllClkSrc = SysctrlPllRch; // PLL时钟源选择RCH stcPLLCfg.enPllMul = SysctrlPllMul12; // 4MHz * 12 = 48MHz Sysctrl_SetPLLFreq(&stcPLLCfg); SysTick_Config(SystemCoreClock / 1000U); // 48MHz / 1000 = 1ms中断2. 硬件初始化(App_GpioInit + App_AdcInit + App_BldcInit)
- GPIO初始化:
- 配置LED指示灯(PC13)为输出模式,用于系统状态指示;
- 配置按键(PA11)为输入模式(上拉使能),用于电机启动/停止控制;
- 配置电机驱动GPIO引脚(PA07~PA10、PB00~PB01)为复用功能,连接TIM3生成PWM信号。
- ADC初始化:
- 配置ADC为单通道模式,采样频率1MHz,参考电压为AVDD;
- 启用PA06(MOS管温度检测)、PB11(转速检测)、PB15(平均电流检测)等模拟通道;
- 用于检测电机运行参数,实现过温、过流保护。
- BLDC核心初始化:
- TIM3配置:配置为三角波模式,生成互补PWM信号(20KHz),用于驱动电机三相桥;
- VC模块配置:VC0用于反电动势检测(PA00~PA03作为比较输入),VC1用于刹车保护;
- OPA运放配置:外部运放模式,用于信号放大与滤波。
(二)脉冲注入法模块(s_ipd.c)
1. 核心功能
通过向电机三相绕组注入短时电流脉冲,检测绕组电流响应差异,判断转子初始位置,为电机启动提供准确的换相基准。
2. 关键函数
- IPD_Proc:转子初始位置检测主函数。
- 依次向6种绕组组合(A→BC、BC→A、AB→C、C→AB、B→AC、AC→B)注入脉冲;
- 通过ADC采集每种组合的绕组电流,存入
detectphasecurrent_tab数组; - 调用
JudgePosition函数分析电流数据,确定转子初始位置(1~12档)。
- JudgePosition:转子位置判断算法。
- 查找电流最大值对应的绕组组合,结合相邻组合的电流对比,确定转子精确位置;
- 处理边界情况,确保位置值在1~12范围内。
- RUNNING_IPD:运行中脉冲注入检测函数。
- 在电机低速运行阶段,持续注入脉冲并检测电流变化;
- 根据电流对比结果更新转子当前位置,实现低速换相控制。
3. 关键宏定义
#define IPD_ON_TIME_CST 2 // 脉冲注入导通时间(10us单位) #define IPD_OFF_TIME_CST 1 // 脉冲注入关断时间(10us单位) #define MPD_FILTER_TIMES 2 // 位置判断滤波次数 #define ADC_ISHUNT_CH 22 // 电流检测ADC通道(三)无霍尔控制核心模块(s_sensorless.h)
1. 反电动势检测
- 利用VC(电压比较器)模块检测电机绕组反电动势(BEMF)与中性点电压的差值;
- 当反电动势过零时,触发VC中断,作为换相时机判断依据;
- 配置VC0迟滞电压为10mV,避免高频抖动导致误触发。
2. 换相控制
- 基于转子位置(初始位置由IPD检测,运行中由BEMF更新),按照BLDC六步换相逻辑控制TIM3输出PWM信号;
- 换相顺序:根据电机转向(CW/CCW)确定绕组导通顺序,确保电机持续旋转;
- PWM占空比调节:通过
strmotor.vrset_pwm变量调节输出占空比,实现电机转速控制。
(四)中断处理模块(interrupts_hc32l13x.c)
1. 中断向量表
- 定义MCU所有中断处理函数入口,包括SysTick、TIM3、ADC、VC等核心中断;
- 中断优先级配置:TIM3中断(换相控制)优先级设为1,高于SysTick中断(1ms调度)。
2. 核心中断实现
- TIM3中断:用于换相触发与PWM周期控制,中断中更新PWM占空比与换相状态;
- VC中断:反电动势过零检测中断,触发后更新转子位置并执行换相;
- SysTick中断:1ms定时中断,用于系统状态扫描(按键检测、电机锁死检测)。
(五)电机保护模块(main.c + s_variable.h)
1. 锁死保护(MotorLockChk)
- 当电机处于运行状态时,累计锁死计数器;
- 若计数器达到
ROTORLOCKTIME_CST(锁死阈值),执行重启逻辑(最多重启5次); - 多次重启失败则标记电机锁死错误,停止输出。
2. 温度保护
- 通过ADC采集MOS管温度(PA06通道);
- 当温度超过阈值时,累计过温计数器,达到阈值后降低PWM占空比或停止电机。
3. 按键控制(DirSwitchScan)
- 检测PA11按键状态(长按50ms确认),控制电机启动/停止;
- 启动时设置电机运行状态为
INIT_STATE,触发IPD初始位置检测; - 停止时设置运行状态为
STOP_STATE,关闭所有MOS管输出。
四、全局变量与数据结构
(一)电机状态结构体(str_motor)
typedef struct { uint8_t hall_state; // 霍尔状态(无霍尔场景下复用为转子位置) uint8_t lst_hall_state; // 上一次转子位置 uint8_t startflag; // 启动标志(0-停止,1-启动) uint8_t dir_flg; // 转向标志(CW-顺时针,CCW-逆时针) uint8_t e_run_state; // 运行状态(IDLE/BRAKE/INIT/RUN/STOP) uint8_t e_err_state; // 错误状态(NO_ERR/MOTOR_LOCK_ERR/OVER_TEMP_ERR) uint16_t vr_set_pwm; // PWM占空比设置值 uint16_t vr_set_pwm_tmp; // PWM占空比临时值(用于平滑调节) uint32_t lock_cnt; // 锁死计数器 uint8_t lock_restart_times_cnt; // 锁死重启次数 // 其他状态变量... } MOTOR_STR_DEF;(二)IPD检测结构体(str_ipd)
typedef struct { uint16_t detect_phase_current_tab[7]; // 6种绕组组合的电流检测值 uint8_t rotor_init_pos; // 转子初始位置 uint8_t rotor_now_pos; // 转子当前位置 uint8_t rotor_init_pos_lst; // 上一次初始位置(用于滤波) uint8_t chk_cnt; // 位置检测滤波计数器 } IPD_STR_DEF;五、关键配置参数
| 参数名称 | 定义位置 | 功能描述 | 默认值 |
|---|---|---|---|
PERIOD_MAX | s_config.h | PWM周期最大值(20KHz) | 2400 |
MAX_PWM | s_config.h | 最大PWM占空比 | 2000 |
INIT_PWM | s_config.h | 初始PWM占空比 | 800 |
ROTORLOCKTIME_CST | s_config.h | 电机锁死阈值(ms) | 500 |
IPDONTIME_CST | s_ipd.c | IPD脉冲导通时间(10us单位) | 2 |
VC0HYSSEL | main.c | VC0迟滞电压 | 1(10mV) |
六、工作流程
1. 系统启动
- 初始化MCU时钟、GPIO、ADC、TIM3、VC等外设;
- 初始化全局变量,设置电机初始状态为
IDLE_STATE(空闲); - 点亮LED1(PC13),指示系统初始化完成。
2. 电机启动
- 长按PA11按键(50ms确认),
startflag置1; - 电机状态切换为
INITSTATE,触发IPD初始位置检测(IPDProc); - 确定转子初始位置后,设置PWM占空比为
INIT_PWM,启动TIM3输出PWM,电机开始旋转; - 运行状态切换为
IPD_STATE(低速脉冲注入模式)。
3. 运行阶段
- 低速运行时,通过
RUNNING_IPD函数持续检测转子位置,更新换相状态; - 转速提升后,切换至反电动势检测模式,由VC中断触发换相;
- 实时调节PWM占空比(
vrsetpwm),实现转速控制; - 持续检测电机温度、电流、锁死状态,触发对应保护逻辑。
4. 电机停止
- 释放PA11按键(50ms确认),
startflag置0; - 电机状态切换为
STOP_STATE,关闭TIM3 PWM输出,关闭所有MOS管; - 重置相关计数器与状态标志。
七、注意事项
- 硬件适配:代码中GPIO引脚定义基于HC32L130开发板,实际应用需根据硬件原理图调整引脚配置;
- 参数校准:IPD脉冲时间、VC迟滞电压、锁死阈值等参数需根据电机型号(功率、绕组参数)校准;
- 电源要求:电机驱动需要足够的电源功率,建议添加续流二极管与滤波电容,避免电压波动;
- 调试建议:通过LED状态与串口打印(需启用UART外设)监控电机状态,便于问题定位。
八、扩展方向
- 增加转速闭环控制:通过检测反电动势频率计算实际转速,与目标转速对比,采用PID算法调节PWM占空比;
- 扩展多种保护功能:过流保护、欠压保护、过压保护等;
- 支持多电机控制:通过增加电机状态结构体,扩展为多电机独立控制;
- 低功耗优化:在电机停止时关闭不必要的外设时钟,降低系统功耗。
脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果。bldc控制器方案,无刷电机。 。提供源码,原理图。