别再发“最终版3”了:PCB哪一版交给了工厂,应该这样查
2026/10/20 4:16:08
脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果。bldc控制器方案,无刷电机。 。提供源码,原理图。
本代码基于华大半导体HC32L130系列MCU,实现了无霍尔传感器的BLDC(无刷直流电机)控制方案,核心采用脉冲注入法(IPD)进行转子初始位置检测与低速启动,结合反电动势(BEMF)检测实现电机高速运行时的换相控制。代码整体遵循模块化设计思想,涵盖系统初始化、硬件驱动、电机控制算法、中断处理等核心功能模块,可广泛应用于家电、无人机、电动工具等需要无霍尔电机控制的场景。
无霍尔BLDC电机控制的核心挑战在于转子位置检测,本代码采用"脉冲注入法+反电动势检测"的混合控制策略:
├── 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 // 全局变量定义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中断通过向电机三相绕组注入短时电流脉冲,检测绕组电流响应差异,判断转子初始位置,为电机启动提供准确的换相基准。
detectphasecurrent_tab数组;JudgePosition函数分析电流数据,确定转子初始位置(1~12档)。#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通道strmotor.vrset_pwm变量调节输出占空比,实现电机转速控制。ROTORLOCKTIME_CST(锁死阈值),执行重启逻辑(最多重启5次);INIT_STATE,触发IPD初始位置检测;STOP_STATE,关闭所有MOS管输出。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;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) |
IDLE_STATE(空闲);startflag置1;INITSTATE,触发IPD初始位置检测(IPDProc);INIT_PWM,启动TIM3输出PWM,电机开始旋转;IPD_STATE(低速脉冲注入模式)。RUNNING_IPD函数持续检测转子位置,更新换相状态;vrsetpwm),实现转速控制;startflag置0;STOP_STATE,关闭TIM3 PWM输出,关闭所有MOS管;脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果。bldc控制器方案,无刷电机。 。提供源码,原理图。