保山市网站建设_网站建设公司_UI设计师_seo优化
2026/1/19 16:48:59 网站建设 项目流程

脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果。bldc控制器方案,无刷电机。 。提供源码,原理图。

一、代码概述

本代码基于华大半导体HC32L130系列MCU,实现了无霍尔传感器的BLDC(无刷直流电机)控制方案,核心采用脉冲注入法(IPD)进行转子初始位置检测与低速启动,结合反电动势(BEMF)检测实现电机高速运行时的换相控制。代码整体遵循模块化设计思想,涵盖系统初始化、硬件驱动、电机控制算法、中断处理等核心功能模块,可广泛应用于家电、无人机、电动工具等需要无霍尔电机控制的场景。

二、核心技术架构

(一)控制原理

无霍尔BLDC电机控制的核心挑战在于转子位置检测,本代码采用"脉冲注入法+反电动势检测"的混合控制策略:

  1. 低速/启动阶段:通过脉冲注入法(IPD)向电机绕组注入特定脉冲,检测绕组电流响应以判断转子初始位置,实现平稳启动;
  2. 高速运行阶段:当电机转速达到一定阈值后,切换至反电动势检测模式,通过比较绕组反电动势与中性点电压判断换相时机,减少运行损耗。

(二)代码目录结构

├── 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_MAXs_config.hPWM周期最大值(20KHz)2400
MAX_PWMs_config.h最大PWM占空比2000
INIT_PWMs_config.h初始PWM占空比800
ROTORLOCKTIME_CSTs_config.h电机锁死阈值(ms)500
IPDONTIME_CSTs_ipd.cIPD脉冲导通时间(10us单位)2
VC0HYSSELmain.cVC0迟滞电压1(10mV)

六、工作流程

1. 系统启动

  1. 初始化MCU时钟、GPIO、ADC、TIM3、VC等外设;
  2. 初始化全局变量,设置电机初始状态为IDLE_STATE(空闲);
  3. 点亮LED1(PC13),指示系统初始化完成。

2. 电机启动

  1. 长按PA11按键(50ms确认),startflag置1;
  2. 电机状态切换为INITSTATE,触发IPD初始位置检测(IPDProc);
  3. 确定转子初始位置后,设置PWM占空比为INIT_PWM,启动TIM3输出PWM,电机开始旋转;
  4. 运行状态切换为IPD_STATE(低速脉冲注入模式)。

3. 运行阶段

  1. 低速运行时,通过RUNNING_IPD函数持续检测转子位置,更新换相状态;
  2. 转速提升后,切换至反电动势检测模式,由VC中断触发换相;
  3. 实时调节PWM占空比(vrsetpwm),实现转速控制;
  4. 持续检测电机温度、电流、锁死状态,触发对应保护逻辑。

4. 电机停止

  1. 释放PA11按键(50ms确认),startflag置0;
  2. 电机状态切换为STOP_STATE,关闭TIM3 PWM输出,关闭所有MOS管;
  3. 重置相关计数器与状态标志。

七、注意事项

  1. 硬件适配:代码中GPIO引脚定义基于HC32L130开发板,实际应用需根据硬件原理图调整引脚配置;
  2. 参数校准:IPD脉冲时间、VC迟滞电压、锁死阈值等参数需根据电机型号(功率、绕组参数)校准;
  3. 电源要求:电机驱动需要足够的电源功率,建议添加续流二极管与滤波电容,避免电压波动;
  4. 调试建议:通过LED状态与串口打印(需启用UART外设)监控电机状态,便于问题定位。

八、扩展方向

  1. 增加转速闭环控制:通过检测反电动势频率计算实际转速,与目标转速对比,采用PID算法调节PWM占空比;
  2. 扩展多种保护功能:过流保护、欠压保护、过压保护等;
  3. 支持多电机控制:通过增加电机状态结构体,扩展为多电机独立控制;
  4. 低功耗优化:在电机停止时关闭不必要的外设时钟,降低系统功耗。

脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果。bldc控制器方案,无刷电机。 。提供源码,原理图。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询