0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HPM知识库 | BLDC 无传感器过零控制技术指南

先楫半导体HPMicro 2026-03-27 08:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

无刷直流电机BLDC)的无传感器控制技术是现代电机控制领域的重要技术方向,通过检测反电动势过零点来确定转子位置,实现无位置传感器的精确控制。本文将基于HPMicro SDK中的bldc_over_zero示例,详细介绍BLDC电机的无传感器过零控制技术,包括控制原理、软件架构和实际应用。

1. BLDC无传感器控制基础理论

1.1 反电动势产生机理与数学模型

当BLDC电机转动时,转子永磁体在定子绕组中运动,根据法拉第电磁感应定律产生反电动势。这一现象的物理本质是磁通量的时间变化率:

85586964-2974-11f1-96ea-92fbcf53809c.png

其中:

  • ϕm为磁链幅值,取决于永磁体强度和绕组匝数
  • ω为转子电角速度
  • θ为转子电角度位置

三相反电动势表达式

对于理想的三相BLDC电机,三相反电动势具有120°相位差:

8565a0ac-2974-11f1-96ea-92fbcf53809c.png

其中856fe4d6-2974-11f1-96ea-92fbcf53809c.png为反电动势幅值。

反电动势常数的物理意义

反电动势常数 Ke与电机的物理结构密切相关:

857c5c20-2974-11f1-96ea-92fbcf53809c.png

中:

N为每相串联导体数

  • Br为永磁体剩磁密度
  • l为导体有效长度
  • r 为电机半径

1.2 过零检测的物理原理与数学推导

悬浮相电压的构成

在三相BLDC电机的六步换相控制中,任意时刻都有一相处于悬浮状态(未导通)。该相的端电压由反电动势和中性点电压共同决定:

8584e46c-2974-11f1-96ea-92fbcf53809c.png

中性点电压的计算:

理论上,三相中性点电压为:

85909e10-2974-11f1-96ea-92fbcf53809c.png

但在实际系统中,无法直接测量中性点电压。HPM MCL库采用"虚拟中性点"方法,通过导通两相的电压均值来估算:

859991a0-2974-11f1-96ea-92fbcf53809c.png

过零点的数学条件:

当悬浮相反电动势过零时:

85a4b4ea-2974-11f1-96ea-92fbcf53809c.png

即:

85b005d4-2974-11f1-96ea-92fbcf53809c.png

30度延迟的理论依据:

过零点对应转子磁极轴线与定子绕组轴线垂直的瞬间,此时转子位于两个换相点的中间位置。为获得最大转矩,需要在过零点后延迟30°电角度再进行换相:

85b9da5a-2974-11f1-96ea-92fbcf53809c.png

对应的时间延迟为:

85c5b348-2974-11f1-96ea-92fbcf53809c.png

其中 85ceed00-2974-11f1-96ea-92fbcf53809c.png为上一次换相间隔时间。

1.3 六步换相序列的理论基础

换相序列的磁场原理

六步换相控制的本质是在定子中产生旋转磁场,与转子永磁体相互作用产生转矩。每个换相步骤对应60°电角度的磁场位置:

85d84648-2974-11f1-96ea-92fbcf53809c.png

换相序列与过零检测的对应关系

85e71812-2974-11f1-96ea-92fbcf53809c.png

磁通链与转矩分析

在每个换相区间内,转矩可表示为:

85f259d4-2974-11f1-96ea-92fbcf53809c.png

其中:

  • P 为极对数
  • ϕpm 为永磁磁链
  • Ia为相电流幅值
  • θe为转子电角度
  • θi 为电流矢量角度

为获得最大转矩,需要保持θe−θi=90°,这正是 30° 延迟换相的理论依据。

2. 软件架构分析

2.1 系统架构概述

85ff6b56-2974-11f1-96ea-92fbcf53809c.png

2.2 核心数据结构

系统使用hpm_mcl_over_zero_cfg_t结构体封装过零控制相关数据:

typedefstructhpm_mcl_over_zero_cfg{ int32_tadc_u; // U相ADC采样值 int32_tadc_v; // V相ADC采样值 int32_tadc_w; // W相ADC采样值 uint32_tnumber_consecutive_zeros;// 连续过零次数 uint32_tdelay_degree_30; // 30度延迟值 uint32_tinterval_tick; // 换相间隔时间 hpm_mcl_dir_tmotor_dir; // 电机方向 hpm_mcl_over_zero_interval_tnext_interval;// 下一换相区间 uint8_tpole_num; // 极对数 floatloop_time_in_sec; // 控制周期 hpm_mcl_over_zero_fsm_tfsm; // 状态机}hpm_mcl_over_zero_cfg_t;

2.3 关键参数配置

电机物理参数

sensorless_cfg.pole_num= MOTOR0_POLE_PAIR; // 极对数:2sensorless_cfg.loop_time_in_sec=0.0001; // 控制周期:100μssensorless_cfg.motor_dir= motor_dir; // 电机方向

PI控制器参数

pi_para.kp= PI_P_VAL; // 比例系数:124pi_para.ki= PI_I_VAL; // 积分系数:0.15pi_para.integral_max= PI_PWM_OUT_MAX; // 积分限幅pi_para.output_max= PI_PWM_OUT_MAX; // 输出限幅

速度滤波参数

speed_para.filter_coef=0.0304; // 滤波系数(100Hz)speed_para.kp=0.2814; // 速度环比例系数speed_para.ki=0.0145; // 速度环积分系数

3. 外设初始化详解

3.1 ADC外设初始化

ADC用于采集三相电压信号,实现反电动势检测:

voidadc_init(void){ adc_config_tcfg; adc_channel_config_tch_cfg; // ADC基本配置 cfg.module= BOARD_BLDC_ADC_MODULE; #ifBOARD_BLDC_ADC_MODULE == ADCX_MODULE_ADC12 cfg.config.adc12.res = adc12_res_12_bits; // 12位分辨率 cfg.config.adc12.conv_mode = adc12_conv_mode_preemption;// 抢占模式 cfg.config.adc12.adc_clk_div =2; // 时钟分频 #else cfg.config.adc16.res = adc16_res_16_bits; // 16位分辨率 cfg.config.adc16.conv_mode = adc16_conv_mode_preemption;// 抢占模式 cfg.config.adc16.adc_clk_div = adc16_clock_divider_4; // 时钟分频 #endif // 初始化三相ADC hpm_adc_init(&cfg);}

ADC触发配置

voidinit_trigger_cfg(uint8_ttrig_ch,boolinten){ adc_pmt_config_tpmt_cfg; pmt_cfg.config.adc12.trig_ch = trig_ch; // 触发通道 pmt_cfg.config.adc12.trig_len = BOARD_BLDC_ADC_PHASE_PREEMPT_TRIG_LEN; pmt_cfg.config.adc12.adc_ch[0] = BOARD_BLDC_ADC_PHASE_CH_U;// U相通道 pmt_cfg.config.adc12.adc_ch[1] = BOARD_BLDC_ADC_PHASE_CH_V;// V相通道 pmt_cfg.config.adc12.adc_ch[2] = BOARD_BLDC_ADC_PHASE_CH_W;// W相通道 hpm_adc_set_preempt_config(&pmt_cfg);}

3.2 PWM外设初始化

PWM负责产生六步换相所需的驱动信号:

PWM模块初始化

voidpwm_init(void){ pwm_cmp_config_tcmp_config[3] = {0}; pwm_config_tpwm_config = {0}; // 停止PWM计数器 pwm_stop_counter(MOTOR0_BLDCPWM); // 设置PWM重载值 pwm_set_reload(MOTOR0_BLDCPWM,0, PWM_RELOAD); pwm_set_start_count(MOTOR0_BLDCPWM,0,0); // 配置比较器 cmp_config[0].mode = pwm_cmp_mode_output_compare; cmp_config[0].cmp = PWM_RELOAD >>1; // 50%占空比 cmp_config[0].update_trigger = pwm_shadow_register_update_on_shlk; // PWM输出配置 pwm_config.enable_output =true; pwm_config.dead_zone_in_half_cycle =0; // 无死区时间 pwm_config.invert_output =false; // 配置所有PWM通道 pwm_setup_waveform(MOTOR0_BLDCPWM, BOARD_BLDC_UH_PWM_OUTPIN, &pwm_config, cmp_index, cmp_config,2); // ... 其他五个通道配置}

关键配置参数说明

  • PWM频率:PWM_FREQUENCY = 20000(20kHz)
  • 重载值:PWM_RELOAD = (motor_clock_hz/PWM_FREQUENCY) - 1
  • 强制输出模式:初始状态下所有PWM输出强制为0

3.3 定时器初始化

定时器用于控制算法的周期执行:

voidtimer_init(void){ gptmr_channel_config_t config; // 时钟配置 clock_add_to_group(BOARD_BLDC_TMR_CLOCK,0); gptmr_channel_get_default_config(BOARD_BLDC_TMR_1MS, &config); // 定时器参数配置 config.reload=SENSORLESS_TMR_RELOAD+1; // 重载值 config.cmp[0] =SENSORLESS_TMR_RELOAD; // 比较值 // 使能中断 gptmr_enable_irq(BOARD_BLDC_TMR_1MS,GPTMR_CH_CMP_IRQ_MASK(BOARD_BLDC_TMR_CH,BOARD_BLDC_TMR_CMP)); gptmr_channel_config(BOARD_BLDC_TMR_1MS,BOARD_BLDC_TMR_CH, &config,true); intc_m_enable_irq_with_priority(BOARD_BLDC_TMR_IRQ,1);}

定时器参数计算

860e711e-2974-11f1-96ea-92fbcf53809c.png

4. 软件结构框架

4.1 状态机设计

系统采用状态机管理过零控制流程:

86188c58-2974-11f1-96ea-92fbcf53809c.png

状态定义

typedefenum{ hpm_mcl_over_zero_fsm_init =0, // 初始化状态 hpm_mcl_over_zero_fsm_location =1, // 定位状态 hpm_mcl_over_zero_fsm_running =2 // 运行状态}hpm_mcl_over_zero_fsm_t;

4.2 初始化流程

步骤1:硬件初始化

board_init(); // 板级初始化motor_clock_hz =clock_get_frequency(BOARD_BLDC_QEI_CLOCK_SOURCE);init_pwm_pins(MOTOR0_BLDCPWM); // PWM引脚初始化init_motor_over_zero_sensorless_adc_pins();// ADC引脚初始化

步骤2:外设初始化

pwm_init(); // PWM初始化adc_init(); // ADC初始化timer_init(); // 定时器初始化

步骤3:控制参数初始化

init_over_zero_para(&sensorless_cfg); // 过零控制参数初始化

4.3 运行时框架

// 主循环:速度变化控制while(1) { motor_run =true; if(isadd) { user_setspeed++; // 加速 }else{ user_setspeed--; // 减速 } board_delay_ms(100);}// 定时器中断:控制算法执行voidisr_gptmr(void){ step_delay =hpm_mcl_over_zero_step_get(&sensorless_cfg); // 获取换相步骤 if(motor_run ==true) { speed_para.speed=hpm_mcl_over_zero_cal_speed(&sensorless_cfg);// 计算速度 current_speed =hpm_mcl_over_zero_speed_filter(&speed_para); // 速度滤波 pi_para.target= user_setspeed; // 设置目标速度 pi_para.cur= current_speed; // 当前速度 hpm_mcl_over_zero_pi_contrl(&pi_para); // PI控制 block_pwm_out =pival_to_pwmoutput(pi_para.outval); // 转换为PWM输出 bldc_block_motor0_duty_set(block_pwm_out); // 设置PWM占空比 hpm_mcl_over_zero_pwm_ctrl(BLDC_MOTOR0_INDEX, step_delay); // PWM控制输出 }}

5. HPM MCL过零检测算法深度分析

5.1 HPM MCL过零检测的核心实现

虚拟中性点计算方法

HPM MCL库采用创新的虚拟中性点方法,简化了过零检测的复杂度:

// 核心检测函数中的关键代码int8_thpm_mcl_over_zero_step_get(hpm_mcl_over_zero_cfg_t*cfg){ int32_tadc_over_zero_u, adc_over_zero_v, adc_over_zero_w; // 计算三相虚拟中性点电压 adc_over_zero_u = (cfg->adc_w + cfg->adc_v) >>1; // U相过零检测用 adc_over_zero_v = (cfg->adc_w + cfg->adc_u) >>1; // V相过零检测用 adc_over_zero_w = (cfg->adc_u + cfg->adc_v) >>1; // W相过零检测用}

检测原理解析

  • 当检测U相过零时,U相悬浮,用V相和W相电压的均值作为中性点
  • 比较:8625f7d0-2974-11f1-96ea-92fbcf53809c.png的符号变化
  • 过零条件:该值从正变负或从负变正

5.2 三状态机的深度实现分析

5.2.1 初始化状态(hpm_mcl_over_zero_fsm_init)

casehpm_mcl_over_zero_fsm_init: cfg->last_interval = hpm_mcl_interval_init; cfg->delay_degree_30 =0; cfg->number_consecutive_zeros_w =0; cfg->adc_zero_ph =0; // 过零检测阶段标志 cfg->last_interval_tick =0; cfg->number_consecutive_zeros =0; cfg->interval_tick =0; cfg->speed_tick =0; cfg->interval = hpm_mcl_interval_init; cfg->fsm = hpm_mcl_over_zero_fsm_location; // 转入定位状态 break;

初始化的关键参数

  • adc_zero_ph:过零检测阶段标志,用于多阶段验证
  • number_consecutive_zeros:连续过零检测计数器
  • delay_degree_30:30度延迟计数器

5.2.2 定位状态(hpm_mcl_over_zero_fsm_location)

定位阶段采用三阶段验证机制,确保初始转子位置检测的可靠性:

case hpm_mcl_over_zero_fsm_location: adc_over_zero_w = (cfg->adc_u + cfg->adc_v) >>1; // 计算W相虚拟中性点 if(cfg->adc_zero_ph ==0) { // 第一阶段:等待W相反电动势从负变正 if(adc_over_zero_w - cfg->adc_w >0) { cfg->number_consecutive_zeros_w++; if(cfg->number_consecutive_zeros_w > HPM_OVER_ZERO_INIT_FILTER_TIMES) { cfg->adc_zero_ph =1; // 进入第二阶段 cfg->number_consecutive_zeros_w =0; } }else{ cfg->number_consecutive_zeros_w =0; return-1; // 继续等待 } }elseif(cfg->adc_zero_ph ==1) { // 第二阶段:再次检测过零,确保稳定 if(adc_over_zero_w - cfg->adc_w >0) { cfg->number_consecutive_zeros_w++; if(cfg->number_consecutive_zeros_w > HPM_OVER_ZERO_INIT_FILTER_TIMES) { cfg->adc_zero_ph =2; // 进入第三阶段 } }else{ cfg->number_consecutive_zeros_w =0; return-1; } }elseif(cfg->adc_zero_ph ==2) { // 第三阶段:定位完成,设置初始换相区间 cfg->last_interval = hpm_mcl_interval_w_down; cfg->interval = cfg->last_interval; cfg->next_interval = hpm_mcl_interval_w_down; // 根据电机方向设置下一个换相区间 if(cfg->motor_dir == hpm_motor_dir_forward) { cfg->next_interval = (cfg->interval %6) +1; }else{ cfg->next_interval -=1; if(cfg->next_interval ==0) { cfg->next_interval = hpm_mcl_interval_u_up; } } cfg->fsm = hpm_mcl_over_zero_fsm_running; // 转入运行状态 } break;

定位算法的关键特点

  • 连续性验证:HPM_OVER_ZERO_INIT_FILTER_TIMES = 15,需连续15次检测到相同结果
  • 二次确认机制:确保转子位置检测的准确性
  • 方向适应:根据电机方向设置不同的换相序列

5.2.3 运行状态(hpm_mcl_over_zero_fsm_running)

运行状态是核心算法,实现六步换相的过零检测:

casehpm_mcl_over_zero_fsm_running: cfg->interval_tick++; // 换相间隔计时 cfg->delay_degree_30++; // 30度延迟计时 // 计算三相虚拟中性点 adc_over_zero_u = (cfg->adc_w + cfg->adc_v) >>1; adc_over_zero_v = (cfg->adc_w + cfg->adc_u) >>1; adc_over_zero_w = (cfg->adc_u + cfg->adc_v) >>1; // 根据当前区间和电机方向进行过零检测 switch(HPM_OVER_ZERO_INDEX_GET(cfg->next_interval, cfg->motor_dir)) { caseHPM_OVER_ZERO_INDEX_GET(hpm_mcl_interval_w_down, hpm_motor_dir_forward): if (adc_over_zero_w - cfg->adc_w >0) { // W相从负过零到正 cfg->number_consecutive_zeros++; }else{ cfg->number_consecutive_zeros =0; } break; caseHPM_OVER_ZERO_INDEX_GET(hpm_mcl_interval_w_up, hpm_motor_dir_forward): if (adc_over_zero_w - cfg->adc_w < 0) {  // W相从正过零到负                cfg->number_consecutive_zeros++; }else{ cfg->number_consecutive_zeros =0; } break; // ... 其他五个区间的检测逻辑 } // 过零检测成功处理 if(cfg->number_consecutive_zeros >= HPM_OVER_ZERO_FILTER_TIMES) { cfg->number_consecutive_zeros =0; cfg->last_interval_tick = cfg->interval_tick; // 保存上次换相间隔 cfg->interval_tick =0; // 重置计数器 cfg->delay_degree_30 = HPM_OVER_ZERO_FILTER_TIMES; // 设置30度延迟 // 计算下一个换相区间 if(cfg->motor_dir == hpm_motor_dir_forward) { cfg->next_interval = (cfg->interval %6) +1; }else{ cfg->next_interval -=1; if(cfg->next_interval ==0) { cfg->next_interval = hpm_mcl_interval_u_up; } } } // 30度延迟判断和换相执行 if(cfg->delay_degree_30 > (cfg->last_interval_tick >>1)) { cfg->speed_tick = cfg->last_interval_tick; // 保存速度计算用数据 cfg->interval = cfg->next_interval; // 执行换相 } break;

运行状态的关键算法

1. 双重计时器机制

  • interval_tick换相间隔计时器
  • delay_degree_3030度延迟计时器

2. 过零检测的数学条件

ParseError: KaTeX parse error: Expected & or \\ or \cr or \end at end of input: …erval\_tick}{2}

5.3 HPM MCL的高精度速度计算算法

理论基础与数学推导

基于换相间隔时间计算电机转速的数学模型:

862fbd7e-2974-11f1-96ea-92fbcf53809c.png转换为每分钟转数(rpm):863942cc-2974-11f1-96ea-92fbcf53809c.png转换为每秒转数(rps):8644356a-2974-11f1-96ea-92fbcf53809c.png

HPM MCL库的实际实现

floathpm_mcl_over_zero_cal_speed(hpm_mcl_over_zero_cfg_t*cfg){ // 原始实现:基于换相间隔计算转速 return((float)((60.0f/ cfg->pole_num) /360.0f))/(cfg->loop_time_in_sec * (cfg->speed_tick +1));}

算法分析与优化

单位统一化

8651d652-2974-11f1-96ea-92fbcf53809c.png

其中:

  • :将每分钟转数转换为每秒转数
  • :采样周期(秒)
  • :换相间隔的采样次数

精度优化技巧

  • 使用speed_tick + 1避免除零错误
  • 通过last_interval_tick保存上次有效测量值
  • 采用浮点运算提高计算精度

速度计算的时序分析

865b04b6-2974-11f1-96ea-92fbcf53809c.png这种设计确保了速度计算的实时性和准确性。

5.4 HPM MCL的高级PI控制算法

双环PI控制系统架构

HPM MCL实现了双层PI控制系统:外环PI控制器 + 内环PWM输出控制。

外环:速度PI控制器

floathpm_mcl_over_zero_speed_filter(hpm_mcl_over_zero_spd_para_t*par){ floatportion_asp =0; floatportion_asi =0; // 低通滤波器预处理 par->err = par->speed - par->speedout; par->err_last = par->filter_coef * par->err + (1- par->filter_coef) * par->err_last; // PI控制计算 portion_asp = par->kp * par->err_last; // 比例项 portion_asi = par->ki * par->err_last; // 积分项 portion_asi += par->mem; // 积分累加 // 积分限幅 if(portion_asi > par->integral_max) { portion_asi = par->integral_max; }elseif(portion_asi < par->integral_min) { portion_asi = par->integral_min; } par->mem = portion_asi; // 组合PI输出 portion_asi += portion_asp; // 输出限幅 if(portion_asi > par->output_max) { portion_asi = par->output_max; }elseif(portion_asi < par->output_min) { portion_asi = par->output_min; } par->speedout = portion_asi; returnpar->speedout;}

内环:PWM占空比PI控制器

floathpm_mcl_over_zero_pi_contrl(hpm_mcl_over_zero_pi_para_t*par){ floatresult =0; floatcurerr =0; floatportion_asp =0; floatportion_asi =0; curerr = par->target - par->cur; // 计算误差 portion_asp = curerr * par->kp; // 比例项 portion_asi = curerr * par->ki + par->mem; // 积分项 // 积分限幅(防止积分饱和) if(portion_asi < par->integral_min) { portion_asi = par->integral_min; }elseif(portion_asi > par->integral_max) { portion_asi = par->integral_max; } par->mem = portion_asi; // PI输出组合 result = portion_asi + portion_asp; // 输出限幅(防止PWM超出范围) if(result < par->output_min) { result = par->output_min; }elseif(result > par->output_max) { result = par->output_max; } par->outval = result; returnresult;}

PI控制器的高级特性分析

8667d59c-2974-11f1-96ea-92fbcf53809c.jpg

控制参数的自适应调优

系统在实际应用中采用了经验参数:

// 速度环PI参数speed_para.kp=0.2814; // 比例系数speed_para.ki=0.0145; // 积分系数speed_para.integral_max=1000; // 积分上限speed_para.integral_min= -1000; // 积分下限// PWM环PI参数pi_para.kp=PI_P_VAL; // 124pi_para.ki=PI_I_VAL; // 0.15pi_para.integral_max=PI_PWM_OUT_MAX; // PWM最大值pi_para.integral_min= -PI_PWM_OUT_MAX; // PWM最小值

这些参数通过大量实验优化,可以在大多数BLDC电机上直接使用。

5.5 HPM MCL的多级滤波系统

滤波系统的分层设计

HPM MCL采用多级滤波架构,提高系统的抗干扰能力:

  1. 硬件滤波层:过零检测的连续性验证
  2. 软件滤波层:数字低通滤波器
  3. 控制滤波层:PI控制器的积分作用

连续性验证滤波器

这是一种独特的数字滤波方法,通过计数器实现:

// 运行状态下的滤波参数#defineHPM_OVER_ZERO_FILTER_TIMES 5// 初始化状态下的滤波参数#defineHPM_OVER_ZERO_INIT_FILTER_TIMES 15// 滤注逻辑:只有连续检测到相同结果才认为有效if(zero_crossing_detected) { cfg->number_consecutive_zeros++; if(cfg->number_consecutive_zeros >= HPM_OVER_ZERO_FILTER_TIMES) { // 过零检测有效 trigger_commutation(); }}else{ cfg->number_consecutive_zeros =0; // 重置计数器}

传递函数分析
连续性验证滤波器的传递函数可表示为:

86739468-2974-11f1-96ea-92fbcf53809c.png

其中NN为连续检测次数。

数字低通滤波器

在速度环中集成的IIR低通滤波器:

867e1096-2974-11f1-96ea-92fbcf53809c.png

截止频率计算

滚动均值滤波器的截止频率为:

868935de-2974-11f1-96ea-92fbcf53809c.png8695d154-2974-11f1-96ea-92fbcf53809c.png

这接近于设计目标的100Hz。

滤波器的性能优化

  1. 相位延迟最小化采用一阶IIR结构减少相位延迟
  2. 计算复杂度优化避免浮点乘法,使用位移操作
  3. 参数自适应根据转速动态调整滤波参数

滤波器的实际效果

  • 噪声抑制有效抑制ADC采样噪声和电磁干扰
  • 过零检测稳定性防止误判断导致的换相错误
  • 速度控制稳定性平滑速度反馈信号,减少控制震荡

5.6 HPM MCL六步换相序列的深度实现

换相序列与过零检测的对应关系

HPM MCL库的六步换相序列实现了精确的PWM控制逻辑:

86a1e93a-2974-11f1-96ea-92fbcf53809c.png

HPM MCL的PWM控制函数实现:

voidhpm_mcl_over_zero_pwm_ctrl(uint8_tmotorindex,uint8_tstep){ switch(step) { case2: // UH+WL:U相上桥导通,W相下桥导通,V相悬浮 hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_UL); // U相下桥关闭 hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_VH); // V相上桥关闭 hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_VL); // V相下桥关闭 hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WH); // W相上桥关闭 hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_UH); // U相上桥导通 hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_WL); // W相下桥导通 break; case1: // UH+VL:U相上桥导通,V相下桥导通,W相悬浮 hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_UL); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_VH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WL); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_UH); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_VL); break; case6: // VL+WH:V相下桥导通,W相上桥导通,U相悬浮 hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_UH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_UL); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_VH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WL); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_VL); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_WH); break; case5: // UL+WH:U相下桥导通,W相上桥导通,V相悬浮 hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_UH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_VH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_VL); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WL); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_UL); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_WH); break; case4: // UL+VH:U相下桥导通,V相上桥导通,W相悬浮 hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_UH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_VL); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WL); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_UL); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_VH); break; case3: // VH+WL:V相上桥导通,W相下桥导通,U相悬浮 hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_UH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_UL); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_VL); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WH); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_WL); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_VH); break; }}

PWM强制输出的底层实现:

voidhpm_mcl_bldc_pwm_enable(uint8_tmotor_index,uint8_tpin_name){ motor_index -=1; // 转换为数组索引 #ifdefined(HPMSOC_HAS_HPMSDK_PWM) pwm_disable_pwm_sw_force_output(motor_pwm_tbl[motor_index], pwm_uvw_conversion_tbl[motor_index][pin_name]); #endif #ifdefined(HPMSOC_HAS_HPMSDK_PWMV2) pwmv2_disable_software_force(motor_pwm_tbl[motor_index], pwm_uvw_conversion_tbl[motor_index][pin_name]); #endif}voidhpm_mcl_bldc_pwm_disable(uint8_tmotor_index,uint8_tpin_name){ motor_index -=1; #ifdefined(HPMSOC_HAS_HPMSDK_PWM) pwm_enable_pwm_sw_force_output(motor_pwm_tbl[motor_index], pwm_uvw_conversion_tbl[motor_index][pin_name]); #endif #ifdefined(HPMSOC_HAS_HPMSDK_PWMV2) pwmv2_enable_software_force(motor_pwm_tbl[motor_index], pwm_uvw_conversion_tbl[motor_index][pin_name]); #endif}

引脚映射表的实现:

constuint8_tpwm_uvw_conversion_tbl[4][6] = { { BOARD_BLDC_UH_PWM_OUTPIN, // U相上桥引脚 BOARD_BLDC_UL_PWM_OUTPIN, // U相下桥引脚 BOARD_BLDC_VH_PWM_OUTPIN, // V相上桥引脚 BOARD_BLDC_VL_PWM_OUTPIN, // V相下桥引脚 BOARD_BLDC_WH_PWM_OUTPIN, // W相上桥引脚 BOARD_BLDC_WL_PWM_OUTPIN // W相下桥引脚 }};

换相序列的数学模型

每个换相步骤对应的磁场矢量可表示为:

86b187fa-2974-11f1-96ea-92fbcf53809c.png

方向控制的实现

HPM MCL支持双向运行,通过改变换相序列实现:

// 正向运行:1→2→3→4→5→6→1...if(cfg->motor_dir == hpm_motor_dir_forward) { cfg->next_interval = (cfg->interval %6) +1;}// 反向运行:6→5→4→3→2→1→6...else{ cfg->next_interval -=1; if(cfg->next_interval ==0) { cfg->next_interval = hpm_mcl_interval_u_up; // 6 }}

换相时序的精确控制

HPM MCL实现了精确的换相时序控制:

86bcee06-2974-11f1-96ea-92fbcf53809c.png

这种设计确保了换相的实时性和准确性,同时避免了换相过程中的竞态条件。

5.7 完整的执行流程分析

HPM MCL过零控制的完整执行流程

86caaa1e-2974-11f1-96ea-92fbcf53809c.png

性能特点总结

  1. 实时性50μs控制周期,确保系统响应速度
  2. 可靠性多级滤波和验证机制,提高系统稳定性
  3. 适应性支持不同电机参数和应用场景
  4. 易用性提供完整的API接口和参数配置

6. 中断服务程序

6.1 ADC中断处理

voidisr_adc(void){ uint32_t status =hpm_adc_get_status_flags(&hpm_adc_u); if((status &BOARD_BLDC_ADC_PHASE_TRIG_FLAG) !=0) { hpm_adc_clear_status_flags(&hpm_adc_u,BOARD_BLDC_ADC_PHASE_TRIG_FLAG); // 获取三相ADC采样值 sensorless_cfg.adc_u= ((adc_buff[0][BOARD_BLDC_ADC_PHASE_TRG*4] &0xffff) >>4) &0xfff; sensorless_cfg.adc_v= ((adc_buff[0][BOARD_BLDC_ADC_PHASE_TRG*4+1] &0xffff) >>4) &0xfff; sensorless_cfg.adc_w= ((adc_buff[0][BOARD_BLDC_ADC_PHASE_TRG*4+2] &0xffff) >>4) &0xfff; }}

ADC中断在每个PWM周期触发一次,采集三相电压信号用于过零检测。

6.2 定时器中断处理

voidisr_gptmr(void){ if(gptmr_check_status(BOARD_BLDC_TMR_1MS,GPTMR_CH_CMP_IRQ_MASK(BOARD_BLDC_TMR_CH,BOARD_BLDC_TMR_CMP))) { gptmr_clear_status(BOARD_BLDC_TMR_1MS,GPTMR_CH_CMP_IRQ_MASK(BOARD_BLDC_TMR_CH,BOARD_BLDC_TMR_CMP)); // 获取换相步骤 step_delay =hpm_mcl_over_zero_step_get(&sensorless_cfg); if(motor_run ==true) { timer_times++; if(timer_times >=TIMER_TIMES_1MS) { timer_times =0; // 速度计算和控制 speed_para.speed=hpm_mcl_over_zero_cal_speed(&sensorless_cfg); current_speed =hpm_mcl_over_zero_speed_filter(&speed_para); // PI控制 pi_para.target= user_setspeed; pi_para.cur= current_speed; hpm_mcl_over_zero_pi_contrl(&pi_para); // PWM输出 block_pwm_out =pival_to_pwmoutput(pi_para.outval); bldc_block_motor0_duty_set(block_pwm_out); } } // PWM控制输出 if(motor_run ==true) { hpm_mcl_over_zero_pwm_ctrl(BLDC_MOTOR0_INDEX, step_delay); } }}

定时器中断执行核心控制算法,周期为100μs。

7. PWM驱动实现

7.1 六步换相控制

无传感器控制采用六步换相方式,每60°电角度换相一次:

voidhpm_mcl_over_zero_pwm_ctrl(uint8_tmotorindex,uint8_tstep){ switch(step) { case1:// AH+BL: A相上桥导通,B相下桥导通 hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_UH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_UL); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_VH); hpm_mcl_bldc_pwm_enable(motorindex, BLDC_PWM_PIN_VL); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WH); hpm_mcl_bldc_pwm_disable(motorindex, BLDC_PWM_PIN_WL); break; case2:// AH+CL: A相上桥导通,C相下桥导通 // ... 类似配置 break; // ... 其他步骤 }}

7.2 占空比控制

系统通过调整PWM占空比实现速度控制:

voidbldc_block_motor0_duty_set(uint32_tduty){ #ifdefined(HPMSOC_HAS_HPMSDK_PWM) pwm_update_raw_cmp_central_aligned(MOTOR0_BLDCPWM, BOARD_BLDCPWM_CMP_INDEX_0, BOARD_BLDCPWM_CMP_INDEX_1, (PWM_RELOAD - duty) >>1, (PWM_RELOAD + duty) >>1); pwm_issue_shadow_register_lock_event(MOTOR0_BLDCPWM); #endif #ifdefined(HPMSOC_HAS_HPMSDK_PWMV2) pwmv2_shadow_register_unlock(MOTOR0_BLDCPWM); pwmv2_set_shadow_val(MOTOR0_BLDCPWM, (BOARD_BLDCPWM_CMP_INDEX_0 +1), (PWM_RELOAD - duty) >>1,0,false); pwmv2_set_shadow_val(MOTOR0_BLDCPWM, (BOARD_BLDCPWM_CMP_INDEX_1 +1), (PWM_RELOAD + duty) >>1,0,false); pwmv2_shadow_register_lock(MOTOR0_BLDCPWM); #endif}

7.3 PWM强制输出模式

当需要关闭特定相的输出时,使用强制输出模式:

voidhpm_mcl_bldc_pwm_disable(uint8_tmotor_index,uint8_tpin_name){ motor_index -=1; #ifdefined(HPMSOC_HAS_HPMSDK_PWM) pwm_enable_pwm_sw_force_output(motor_pwm_tbl[motor_index], pwm_uvw_conversion_tbl[motor_index][pin_name]); #endif #ifdefined(HPMSOC_HAS_HPMSDK_PWMV2) pwmv2_enable_software_force(motor_pwm_tbl[motor_index], pwm_uvw_conversion_tbl[motor_index][pin_name]); #endif}

8. 使用指南

8.1 硬件准备

  1. MCU开发板支持HPMicro芯片的开发板
  2. BLDC电机三相无刷直流电机(推荐雷赛智能BLM57050-1000)
  3. 功率驱动三相逆变器模块,支持相电压检测
  4. 电源24V直流电源
  5. ADC电路用于采集三相电压信号

8.2 软件配置

步骤1:参数配置
根据实际电机参数修改以下定义:

#defineMOTOR0_POLE_PAIR (2) // 电机极对数#definePWM_FREQUENCY (20000) // PWM频率20kHz#definePI_P_VAL (124) // PI比例系数#definePI_I_VAL (0.15) // PI积分系数

步骤2:编译下载
使用支持的IDE编译工程并下载到目标板。

步骤3:运行测试
系统启动后会自动进行预定位,然后开始速度测试。

8.3 操作特点

  1. 预定位过程:系统启动时会进行强制换相预定位,持续约500ms
  2. 自动测试:电机在5-40转/秒范围内自动变速运行
  3. 无传感器启动:无需外部位置传感器,完全基于反电动势检测

9. 调试与优化

9.1 常见问题

问题1:电机无法启动

  • 检查ADC采集电路是否正常
  • 确认三相电压检测信号连接正确
  • 验证PWM输出波形

问题2:速度不稳定

  • 调整PI控制器参数
  • 修改速度滤波器系数
  • 检查过零检测阈值

问题3:换相不平滑

  • 优化30度延迟计算
  • 调整过零检测灵敏度
  • 检查PWM驱动时序

9.2 参数调优

PI参数调整

86d53e84-2974-11f1-96ea-92fbcf53809c.png

滤波器参数

86dfd09c-2974-11f1-96ea-92fbcf53809c.png

9.3 性能优化

提高启动成功率

  • 优化预定位时间和强度
  • 调整初始换相频率
  • 改善过零检测算法

提高运行稳定性

  • 增加反电动势滤波
  • 优化换相时机预测
  • 实现自适应控制参数

10. 移植指南

10.1 硬件移植步骤

步骤1:板级定义修改

// ADC相关定义#defineBOARD_BLDC_ADC_PHASE_U_BASE HPM_ADC0 // U相ADC#defineBOARD_BLDC_ADC_PHASE_V_BASE HPM_ADC1 // V相ADC#defineBOARD_BLDC_ADC_PHASE_W_BASE HPM_ADC2 // W相ADC#defineBOARD_BLDC_ADC_PHASE_CH_U (5U) // U相通道#defineBOARD_BLDC_ADC_PHASE_CH_V (6U) // V相通道#defineBOARD_BLDC_ADC_PHASE_CH_W (7U) // W相通道// PWM相关定义#defineMOTOR0_BLDCPWM HPM_PWM0 // PWM模块#defineBOARD_BLDC_UH_PWM_OUTPIN (0U) // U相上桥臂#defineBOARD_BLDC_UL_PWM_OUTPIN (1U) // U相下桥臂// ... 其他引脚定义

步骤2:引脚配置

voidinit_motor_over_zero_sensorless_adc_pins(void){ // 配置ADC输入引脚 // 设置引脚复用功能为ADC // 配置引脚特性(如输入阻抗等)}

10.2 电机参数适配

基本参数修改

voidinit_over_zero_para(hpm_mcl_over_zero_cfg_t *cfg){ cfg->pole_num =MOTOR0_POLE_PAIR; // 根据电机极对数修改 cfg->loop_time_in_sec =0.0001; // 控制周期,根据定时器频率 // 速度滤波参数(根据电机特性调整) speed_para.filter_coef=0.0304; // 滤波系数 speed_para.kp=0.2814; // 速度环P参数 speed_para.ki=0.0145; // 速度环I参数 // PI控制器参数(根据负载特性调整) pi_para.kp=PI_P_VAL; // 比例系数 pi_para.ki=PI_I_VAL; // 积分系数}

10.3 ADC电路适配

电压检测电路要求

  • ADC输入电压范围:0-3.3V
  • 相电压检测电路:需要电压分压和偏置
  • 噪声抑制:添加RC滤波电路

典型检测电路

86ea1ba6-2974-11f1-96ea-92fbcf53809c.png

11. 安全注意事项

电气安全

  • 确保功率电路与控制电路隔离
  • 实现过流、过压保护
  • 正确接地,避免地环路

启动安全

  • 无传感器启动时电机可能产生抖动
  • 预定位过程中避免外部干扰
  • 设置合理的启动电流限制

运行安全

  • 监控ADC采集信号质量
  • 实现失步检测和保护
  • 设置最大运行速度限制

12. 性能对比

12.1 与有传感器控制对比

86f30f90-2974-11f1-96ea-92fbcf53809c.png

12.2 适用场景

适合无传感器控制的应用

  • 成本敏感的应用
  • 恶劣环境(传感器易损坏)
  • 高速运行为主的应用
  • 空间受限的应用

不适合的应用

  • 需要精确位置控制
  • 频繁启停的应用
  • 超低速运行要求
  • 极高可靠性要求

13. 总结

BLDC无传感器过零控制技术通过检测反电动势过零点实现转子位置估计,具有成本低、结构简单的优势。HPMicro SDK提供的bldc_over_zero示例展示了完整的实现方案,包括:

  • 过零检测算法:基于ADC采集的相电压信号
  • 换相控制逻辑:六步换相with 30度延迟
  • 速度闭环控制:PI控制器实现精确调速
  • 滤波和稳定性:多级滤波保证系统稳定

主要技术特点:

  • 无需外部位置传感器,降低系统成本
  • 采用梯形波控制,实现简单可靠
  • 支持双向运行和宽速度范围控制
  • 提供完整的移植和调试指南

在实际应用中,开发者需要根据具体的电机参数和应用需求,对控制参数进行优化调整,以获得最佳的控制性能。通过本文提供的详细分析和指导,可以快速掌握无传感器过零控制技术,并成功应用到实际项目中。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • BLDC
    +关注

    关注

    220

    文章

    959

    浏览量

    100748
  • 无传感器
    +关注

    关注

    0

    文章

    67

    浏览量

    13764
  • HPM
    HPM
    +关注

    关注

    2

    文章

    55

    浏览量

    8323
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    BLDC位置传感器控制方式介绍

    BLDC根据转子的位置进行换向控制,而转子位置要靠位置传感器获取,那么这期就为大家介绍BLDC位置
    的头像 发表于 12-30 07:55 1.6w次阅读
    <b class='flag-5'>BLDC</b><b class='flag-5'>无</b>位置<b class='flag-5'>传感器</b><b class='flag-5'>控制</b>方式介绍

    开发知识库测试添加知识库

    文档类型的知识要等待数据校验完成后才能上架 可以点击知识名称查看知识详情 等待后端处理完成可以点击知识列表的上架 在智能体中知识库的位置点
    发表于 03-06 15:07

    采用56F801X的3相刷直流电机传感器控制参考设计

    的三相BLDC电机,带有反电动势感应用于传感器控制的ADC检测使用PI
    发表于 07-18 14:13

    传感器BLDC电机控制引入低成本应用

    ,使用可软件编程的控制器通常会使这些挑战更容易解决,就像本文提及的两个问题的解决方案一样。  通过示例进行研究和实验使得学习新技术更为容易。专为传感器
    发表于 11-08 16:08

    传感器控制基础知识和要点

    电机,控制算法必须经由以下状态:• 对齐 ( 初始位置设置 )• 启动 (强制换相)• 运行 ( 传感器运行,提供反电动势 AD 采样和
    发表于 02-28 09:11

    关于BLDC电机控制的所有信息:传感器刷直流电机控制器

    了解传感器刷直流电动机控制器,一些示例IC以及使用此类电动机的一些缺点。有刷和刷直流电动机的快速回顾
    发表于 10-25 09:51

    基于PSoC4的传感器BLDC控制

    个或多个转子位置传感器确定电机转子相对于电机定子的位置。采用位置传感器BLDC控制方案较为简单,根据位置传感器的输出确定转子所处的区间,并
    发表于 05-05 07:27

    基于知识库的智能策略翻译技术

    提出基于知识库的策略翻译方法,设计策略翻译组成结构,分析策略知识及其表示形式,建立动态可扩展的策略知识库,开发可扩展的策略编译和策略组装
    发表于 04-22 09:42 11次下载

    传感器BLDC电机控制

    传感器BLDC电机控制:The SPMC75F2413A digital motor controller developed by SUNPLUS is well suitabl
    发表于 09-19 11:11 69次下载

    领域知识库的研究与设计

    领域知识库的构建有利于知识的检索和共享。分析了领域知识库应具备的条件,指出构建领域知识库的有效方法;介绍了构建知识库的一般步骤,并设计出领域
    发表于 08-29 14:39 0次下载

    NXP NFC知识库

    NXP NFC知识库
    发表于 12-30 17:32 49次下载

    本体知识库的模块与保守扩充

    模块化是软件工程的一种方法,近年来被引入到本体领域,用以支持本体的重用和本体的整合。已有的工作没有讨论同时含有TBox和ABox的本体知识库的模块化的相关问题。在定义本体知识库的模块和知识库的保守
    发表于 11-24 09:58 0次下载

    单片机C868实现传感器BLDC电机控制

    单片机C868实现传感器BLDC电机控制(电源技术作业 电力/水利工程科技 答案)-单片机C868实现
    发表于 09-18 17:24 26次下载
    单片机C868实现<b class='flag-5'>无</b><b class='flag-5'>传感器</b><b class='flag-5'>BLDC</b>电机<b class='flag-5'>控制</b>

    BLDC电机的传感器梯形控制

    电子发烧友网站提供《BLDC电机的传感器梯形控制.pdf》资料免费下载
    发表于 10-12 11:32 3次下载
    <b class='flag-5'>BLDC</b>电机的<b class='flag-5'>无</b><b class='flag-5'>传感器</b>梯形<b class='flag-5'>控制</b>

    HPM知识库 | 先楫半导体电机库简介

    /简介先楫电机库(HPM_MCLV2)是由先楫半导体开发的一个专门用于电机控制的软件,它支持广泛的电机控制应用,包括基于传感器
    的头像 发表于 05-22 10:58 49次阅读
    <b class='flag-5'>HPM</b><b class='flag-5'>知识库</b> | 先楫半导体电机库简介