• 注册 / 登录
  • 切换到窄版
  • 查看: 1235|回复: 0

    有感BLDC电机启动检测和启动方法

    [复制链接]

    665

    主题

    679

    帖子

    6461

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    6461
    发表于 2024-1-13 22:13:10 | 显示全部楼层 |阅读模式

    路线栈欢迎您!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 一路上 于 2024-1-13 22:16 编辑

    一、有感BLDC为什么要做启动检测?

    1.做启动检测主要是为了防止霍尔传感器有故障或电路异常。

    2.做启动检测也是为了整个程序的鲁棒性和健壮性。

    二、启动检测的软件实现

    1.如下图所示,如果霍尔传感器工作正常,则霍尔值的U、V、W三相中的某一相值为1,另外2相值为0。U相值为bit2,V相值为bit1,W相值为bit0,如果霍尔值等于0或霍尔值大于6,则霍尔输入值检测异常。

    1.png

    2.在循环中连续读取霍尔传感器的值,如果值每次都相等,则到了一定次数后直接退出循环,表示启动检测正常。示例代码如下:

    1. ReadHallCnt = 0;
    2. ReadLast = 0;
    3. ReadOverTime=100 ;
    4. do
    5. {
    6. Hall- >HallData = (PINA>>3)&0x7; //读取霍尔传感器的值
    复制代码

    启动检测正常后,进行相关换向和速度控制功能。

    三、电机运行过程中的堵转检测

    1.电机在运行过程中有可能电机加载负载过大,或者系统供电不足,导致电机停止转动,如果长时间堵转,很可能会导致电机过热损毁。

    2.检测堵转方法是:在换向的方法里,做换向超时检测,如果在规定时间内没有换向,霍尔传感器的采集值始终无变化,那么就发生了堵转。堵转异常处理一般有时间指标,如果超过这个时间指标,就停止电机工作。

    四、启动方法

    在使用hall传感器的情况下可以直接获取到转子的位置,不需要对齐,但要加一个最大转矩启动状态,在此阶段使电机输出最大转矩(通过电流环实现),为了防止启动过冲给电流启动加一个斜坡。当电机速度达到设定的启动速度后自动切换到速度闭环模式。

    1.状态机

    2.png

    2.Calib2Aligment

    在Calib完成后执行C2A(AppStopToAlignment())函数,初始化电流PI环参数、电流斜坡函数,通过霍尔传感器获取转子所在扇区,开启相应驱动桥臂。然后跳转到Aligment状态。

    1. void AppStopToAlignment(void)
    2. {
    3.         uint8_t i;

    4.     driveStatus.B.Alignment = 1; //状态更新,在LPIT0中进行电流PI环计算和更新
    5.     driveStatus.B.EnableCMT = 1; //开启换相,只有开启才能在FTM2的捕获中断中自动换相
    6.     driveStatus.B.CloseLoop = 0;
    7.     driveStatus.B.Calib = 0;
    8.         driveStatus.B.Sensorless = 0;
    9.         driveStatus.B.NewZC = 0;

    10.     /* Torque ramp initialization */
    11.     torqueRampPrms.fltState = 0.0F; //力矩斜坡的初始值

    12.     alignmentTimer = mcat_alignDuration;//启动时间=20000,1s
    13.     duty_cycle = MLIB_Mul(MLIB_Div(mcat_alignVoltage, U_PH_NOM), 100.0F); //mcat_alignVoltage=1.5F 启动占空比=1.5/12*100

    14.     /* Current PI controller initialization */
    15.         currentPIPrms.fltInK_1 = 0;//初始误差
    16.         currentPIPrms.fltIntegPartK_1 = duty_cycle;//初始积分项

    17.     /* Update PWM duty cycle*/
    18.         ACTUATE_SetDutycycle(duty_cycle, HW_INPUT_TRIG1);
    19.         /*根据三个霍尔引脚的电平计算所在扇区,更新到SensorHall.Sector*/
    20.         HALL_GetSector(&SensorHall);
    21.         /* 开启相关桥臂,相当于第一次换相在此手动开启 */
    22.         ACTUATE_SetPwmMask(ui8FTM3OutmaskVal[rotationDir][SensorHall.Sector],
    23.                                                   ui16FTM3SwOctrlVal[rotationDir][SensorHall.Sector], HW_INPUT_TRIG0);
    24.         
    25.         /*在电机转动起来之前无法测量电机转速,因此需要先手动初始化一个转速*/
    26.         for( i=0;i<6;i++)
    27.                 {
    28.                         SensorHall.Period[i] =60000  ;/*将扇区时间设为最大,这样初始转速约等于0*/
    29.                 }
    30.     appState = APP_ALIGNMENT; /*跳转到Aligment*/
    31. }
    复制代码

    3.力矩闭环

    进入Aligment后,通过driveStatus.B.Alignment=1在LPIT0中断每1ms进行1次电流环计算:

    1. void LPIT0_Ch0_IRQHandler(){
    2. if(driveStatus.B.Alignment == 1)
    3.     {
    4.             /*更新当前速度,用于状态跳转判断*/
    5.             actualSpeed = MLIB_Mul(MLIB_ConvertPU_FLTF32(MLIB_Div_F32(SPEED_SCALE_CONST, period6ZC)), N_MAX);
    6.             /*
    7.              GFLIB_Ramp斜坡函数,使电流目标值按照设定的斜率从0增加到I_DCB_LIMIT
    8.              计算电流误差:电流目标值-滑动滤波后的电流值(torque_filt)
    9.                 */
    10.             torqueErr = MLIB_Sub(GFLIB_Ramp(I_DCB_LIMIT, &torqueRampPrms), torque_filt);
    11.             /*计算PI输出*/
    12.             currentPIOut = GFLIB_ControllerPIpAW(torqueErr, ¤tPIPrms);
    13.                   /*更新PWM占空比*/
    14.                   duty_cycle = currentPIOut;
    15.             ACTUATE_SetDutycycle(duty_cycle, HW_INPUT_TRIG0);
    16.     }
    17. }
    复制代码
    1. void AppAlignment(void)
    2. {
    3. /*alignmentTimer每1/20000秒自减1*/
    4.         if((alignmentTimer == 0)||(actualSpeed >= 300))
    5.             {
    6.                     if(actualSpeed < 300)
    7.                     {
    8.                             AppAlignmentToFault();/*启动时间到了但速度每上来,启动失败*/
    9.                     }else
    10.                     {
    11.                             AppAlignmentToStart();/*启动成功*/
    12.                     }                  
    13.             }
    14. }

    15. void AppAlignmentToStart(void)
    16. {
    17.     driveStatus.B.Alignment = 0;/*关闭电流环*/
    18.     driveStatus.B.EnableCMT = 1;
    19.         driveStatus.B.AfterCMT  = 0;
    20.         appState = APP_START;/*跳转至Start*/
    21. }
    复制代码

    4.Start2Run

    电机到达启动速度后切换到运行状态,对运行状态参数初始化后进入速度电流双闭环运行状态。

    1. void AppStartToRun(void)
    2. {
    3.     /* 速度PI控制参数初始化 */
    4.     speedPIPrms.fltInK_1 = 0;/*初始误差*/
    5.     speedPIPrms.fltIntegPartK_1 = duty_cycle;/*直接将启动阶段计算的占空比作为初始积分结果*/

    6.     /* 电流PI控制参数初始化 */
    7.     currentPIPrms.fltInK_1 = 0;
    8.     currentPIPrms.fltIntegPartK_1 = speedPIPrms.fltIntegPartK_1;

    9.     /* 速度斜坡参数初始化 */
    10.     speedRampPrms.fltState = mcat_NMin;/*初始输入速度设为0*/        
    11.         /*状态跳转*/
    12.     appState = APP_RUN;
    13.     stallCheckCounter = 0; /*清除失速检测计数*/
    14.     faultStatus.B.StallError = 0;
    15.     // Reset FTM2 counter
    16.         FTM2->CNT = 0;
    17.     // Clear FTM counter overflow flag
    18.         FTM2->SC &= (~FTM_SC_TOF_MASK);
    19.     driveStatus.B.CloseLoop = 1;/*进入速度力矩双闭环模式*/
    20. }
    复制代码

    五、结果运行

    如下图,电机以一个比较平滑的速度启动,并且启动负载增大后可以自动增加启动力矩。

    3.png
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|路丝栈 ( 粤ICP备2021053448号 )

    GMT+8, 2024-9-8 10:18 , Processed in 0.047289 second(s), 21 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表