【零基础玩转BLDC系列】无刷直流电机无位置传感器三段式启动法详细介绍及代码分享

这篇具有很好参考价值的文章主要介绍了【零基础玩转BLDC系列】无刷直流电机无位置传感器三段式启动法详细介绍及代码分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

无刷直流电动机基本转动原理等内容请参考《基于霍尔传感器的无刷直流电机控制原理》、《基于反电动势过零检测法的无刷直流电机控制原理》与《以GD32F30x为例定时器相关功能详解》,BLDC基本原理及基础知识本篇不再赘述。

直流无刷电机由于定子绕组的反电动势与电机的转速成正比,所以电机在静止时反电动势为零或低速时反电动势很小,此时无法根据反电动势信号确定转子磁极的位置。因此,反电动势法需要采用特殊启动技术,从静止开始加速,直至转速足够大。通过反电势能检测到过零时,再切换至直流无刷电机运行状态。这个过程称为“三段式”启动,主要包括转子预定位、加速和运行状态切换三个阶段。这样既可以使电机转向可控,又可以保证电机达到一定转速后再进行切换,保证了启动的可靠性。

下面对“三段式”启动技术进行详细的分析。

1、电机转子预定位

若要保证直流无刷电机能够正常启动,首先要确定转子在静止时的位置。

在小型轻载条件下,对于具有梯形反电势波形的直流无刷电机来说,一般采用磁制动转子定位方式。系统启动时,任意给定一组触发脉冲,在气隙中形成一个幅值恒定、方向不变的磁通。只要保证其幅值足够大,那么这一磁通就能在一定时间内将电机转子强行定位在这个方向上。

在应用中,可以在任意一组绕组上通电一定时间,其中预定位的PWM占空比和预定位时间的长短设定值可由具体电机特性和负载决定,在实际应用中调试而得。通常为了保险起见,会定位两次相邻的位置,防止转子刚好处于临界位置。

在预定位成功后,转子在启动前可达到预定的位置,为电机启动做好准备。

void motor_lacation_cfg_1()
{
    //W+   U-
    /*  channel0 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);        
    timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_ENABLE);
    /*  channel1 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0);
    timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_DISABLE);
    /*  channel2 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0);           
    timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_ENABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_DISABLE);
}
void motor_lacation_cfg_2()
{
    //U+   V-
    /*  channel0 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);     
    timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_ENABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_DISABLE);
    //    /*  channel1 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0);         
    timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_ENABLE);
    /*  channel2 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0);
    timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_DISABLE);
}
void motor_lacation_cfg_3()
{
    //W+  V-
    /*  channel0 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);
    timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_DISABLE);
    /*  channel1 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0);        
    timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_ENABLE);
    /*  channel2 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0);         
    timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_ENABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_DISABLE);
}
void motor_lacation_cfg_4()
{
    //V+ W-
    /*  channel0 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);
    timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_DISABLE);
    /*  channel1 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0);        
    timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_ENABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_DISABLE);    
    /*  channel2 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0);        
    timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_ENABLE);
}
void motor_lacation_cfg_5()
{
    //V+ U-
    /*  channel0 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);        
    timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_ENABLE);
    /*  channel1 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0);          
    timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_ENABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_DISABLE);
    /*  channel2 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0);
    timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_DISABLE);
}
void motor_lacation_cfg_6()
{
    //  U+  W-
    /*  channel0 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);            
    timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_ENABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_DISABLE);
    /*  channel1 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0);             
    timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_DISABLE);
    /*  channel2 configuration */
    timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0);                
    timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_DISABLE);
    timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_ENABLE);
}
void motor_step_stop()
{   
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,  0);   
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,  0);
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_2,  0); 
}
void motor_locate()
{
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,  1500);   
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,  1500);
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_2,  1500); 
    if(CCW==0){
    motor_lacation_cfg_4();
    timer_enable(TIMER0);
    delay_1ms(60);
    motor_lacation_cfg_6();
    timer_enable(TIMER0);
    delay_1ms(60);
	}
    else{//逆时针
    motor_lacation_cfg_3();
    timer_enable(TIMER0);
    delay_1ms(60);
    motor_lacation_cfg_2();
    timer_enable(TIMER0);
    delay_1ms(60);
	}
	motor_step_stop();
    timer_disable(TIMER0);
}

2、电机的外同步加速

确定了电机转子的初始位置后,由于此时定子绕组中的反电动势仍为零,所以须人为改变电机的外施电压和换相信号,使电机由静止逐步加速运动。这一过程称为外同步加速。对于不同的外施电压调整方法和换相信号调整方法,外同步加速可划分为三类:

①换相信号频率不变,逐步增大外施电压使电机加速,称为恒频升压法。

②保持外施电压不变,逐渐增高换相信号的频率,使电机逐步加速,称为恒压升频法。

③在逐步增大外施电压的同时,增高换相的频率,称为升频升压法。

各个方法都有其优点和缺点。如升频升压法是人为地给电机施加一个由低频到高频不断加速的他控同步切换信号,而且电压也在不断地增加。通过调整电机换相频率,即可调整电机启动的速度。调整方法比较简单。但是这个过程较难实现。切换信号的频率的选择要根据电机的极对数和其他参数来确定。太低,电机无法加速;太高,电机转速达不到,会有噪声甚至无法启动,算法比较困难。

无论哪种方法,该过程都是在未检测到反电动势信号时进行。因此对于控制系统来说此段电机控制是盲区。参数在调试好的时候,可以快速切换至正常运行状态;而参数不理想时,电流可能不稳甚至电机会抖动。因此,在应用中,应根据电机及负载特性设定合理的升速曲线,并在尽可能短的时间内完成切换。

void openloop_step_change(uint32_t pwm_duty,uint32_t counter)
{
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,  pwm_duty);
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,  pwm_duty);
    timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_2,  pwm_duty);
    if(CCW==0){//顺时针
    motor_lacation_cfg_2();
    delay_1us(counter);
    motor_lacation_cfg_3();
    delay_1us(counter);
    motor_lacation_cfg_1();
    delay_1us(counter);
    motor_lacation_cfg_5();
    delay_1us(counter);
    motor_lacation_cfg_4();
    delay_1us(counter);
    motor_lacation_cfg_6();
    delay_1us(counter);}
    else{//逆时针
    motor_lacation_cfg_6();
    delay_1us(counter);
    motor_lacation_cfg_4();
    delay_1us(counter);
    motor_lacation_cfg_5();
    delay_1us(counter);
    motor_lacation_cfg_1();
    delay_1us(counter);
    motor_lacation_cfg_3();
    delay_1us(counter);
    motor_lacation_cfg_2();
    delay_1us(counter);}

}
void motor_openloop()
{
  int i=0;
  timer_enable(TIMER0);
  for(i=0;i<192;i++)
  {
	openloop_step_change(1600,60000-300*i);
  }
  for(i=0;i<800;i++)
  {
    openloop_step_change(1600,2700);
  }

}

3、电机运行状态的转换

当电机通过外同步加速到一定的转速,反电势信号可以准确检测时,即可由外同步向自同步切换。可以通过试验观察反电势信号能够被准确检测的转速。在进行切换有两种方法:一种是测速模块可以测出电机的转速,当达到这一转速时即可进行切换;另一种,通过试验检测出达到预定切换转速的时间,通过软件定时器设置切换时间。

这一步是关键也是比较难实现的一步。有时软件或者硬件设计的不合理都可能导致启动失败。通常是采用估算的方式来选择切换速度。

void motor_sensorless_start()
{
    timer_channel_control_shadow_config(TIMER0,ENABLE);    //开始从外同步切入自同步模式,即使用过零点检测法检测位置
    timer_enable(TIMER2);
	while(speed_count>1300){}    //自同步模式切入后会有短暂的升速阶段,通过判断速度等待并确认自同步成功切入
    CloseLoop_Start=1;  //闭环标志位置位,后续进行闭环控制
}
int main(void)
{
    systick_config();
    bldc_gpio_config();   //  all  gpio
    PID_init( &Speed_Ctrl, PID_Speed, I_ref_Max, 0.0f);
    PID_init( &I_Ctrl, PID_I, PWM_Duty_Max, 0.0f);
    NVIC_CFG();
    dma_config();
    adc_config();
    TimerIn_config();
    TimerOut_config();
    motor_locate();           //定位
	motor_openloop();         //外同步
    motor_sensorless_start(); //自同步-闭环
    while (1){
    }
}

通过上面的分析可知,无位置传感器直流无刷电机控制系统的难点就是加速及切换阶段。当电机顺利启动后,就可以对电机进行调速操作。其中,无位置传感器直流无刷电机和有位置传感器直流无刷电机调速原理一致。但,由于无感三段式启动过程,转子位置检测无效。因此,对电机进行的速度PID闭环控制,须在电机启动顺利完成后进行。文章来源地址https://www.toymoban.com/news/detail-403248.html

到了这里,关于【零基础玩转BLDC系列】无刷直流电机无位置传感器三段式启动法详细介绍及代码分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32实现FOC直流无刷BLDC电机-外围电路

    永磁同步电机和无刷直流电机(BLCD)具有更高效、运行更安静、扭矩波动小、响应速度快、更可靠等优点,正用于越来越多的应用,替代直流有刷电机。尽管结构不同,但所有三相永磁电机(BLDC、PMSM或PMAC)都是由脉冲宽度调制(PWM)的三相桥(三个半桥)驱动,以便采用频

    2024年01月16日
    浏览(53)
  • 【STM32】BLDC驱动&控制开发笔记 | 08_无刷直流电机BLDC参数辨识_极对数,相电阻,相电感,交轴直轴电感,反电动势常数,磁链常数

    本文主要想为后续电机控制的仿真和实验多测试出一些电气参数(以参数辨识的离线辨识为主)。目前包括:极对数;相电阻;相电感;交轴直轴电感;反电动势常数;磁链常数 的测量内容。 因为笔者水平有限,本文以资源整理为主,有的部分我也主要是看别人的博客学习

    2024年02月06日
    浏览(39)
  • 【正点原子】STM32电机应用控制学习笔记——2.直流无刷电机基础知识

    没有电刷,无换向器的电机,也称为无换向器电机。 主要是定子和转子,而直流有刷电机多的是换向器和电刷。 而直流有刷的定子是N和S的永磁体,而无刷是三个线圈饶阻。 直流有刷是定子是饶阻,无刷的定子是N和S的永磁体。两者的转子和定子恰好是相反的。也是他们最大

    2024年02月03日
    浏览(71)
  • 直流无刷电机

    2024年02月15日
    浏览(36)
  • 无刷直流电机最强科普(收藏版)

    无刷直流电机(BLDC:Brushless Direct Current Motor),也被称为电子换向电机(ECM或EC电机)或同步直流电机,是一种使用直流电(DC)电源的同步电机。无刷直流电机实质上为采用直流电源输入,并用逆变器变为三相交流电源,带位置反馈的永磁同步电机。 电机有各式各样的种类

    2024年01月16日
    浏览(46)
  • 直流无刷电机【一】从零开始上手

    这学期正好学完了两学期的电机学,加上个人一直对四轴无人机的无刷电机与电调感兴趣,同时也比较喜欢几个月前看见的foc控制的电机旋钮那个开源项目,于是自己做了一套无刷电机驱动板(算是真正的从0开始),淘宝买了个十几块的不知名云台无刷电机就开始瞎折腾了。

    2024年02月02日
    浏览(37)
  • 直流无刷电机驱动的PWM频率

    针对ESCON伺服驱动器: https://support.maxongroup.com/hc/en-us/articles/360020442720-ESCON-PWM-input-frequency-PWM-output-frequency- Impact of the PWM input frequency? Please be aware that the PWM input frequency in use also determines how fast updated set values can be identified and processed because one period has to measured before the PWM duty cy

    2023年04月08日
    浏览(33)
  • 【电机应用控制】——直流无刷电机&驱动原理&有感闭环控制&无感闭环控制

    ​ 目录 前言 一、概述 二、驱动原理 ​编辑 三、(有感)速度闭环控制 四、无感控制(无位置传感器) 四、(无感)速度闭环控制 总结 声明:学习笔记来自正点原子B站教程,仅供学习交流!! 简介:         直流无刷电机(BLDC)是指无电刷和换向器的电机,又称无

    2024年02月16日
    浏览(41)
  • 无刷直流电机32位MCU解决方案

    电机是指依据电磁感应定律实现电能转换或传递的一种电磁装置。它的主要作用是产生驱动转矩,作为用电器或各种机械的动力源。发电机在电路中用字母G表示。它的主要作用是利用电能转化为机械能。 无刷直流电动机的工作原理:无刷直流电机是永磁式同步电机的一种,

    2024年02月12日
    浏览(46)
  • 直流无刷电机及Matlab/Simulink驱动仿真

    系列文章将更新直流无刷电机的工作原理、仿真控制以及应用STM32开发板与驱动板完成对直流无刷电机的实际控制。 直流无刷电机(Brushless Direct Current Motor,BLDC)没有了直流有刷电机的电刷及换向器等结构,线圈绕组不参与旋转而是作为定子,永磁体作为转子,通过控制线圈

    2024年02月05日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包