您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 基于STM8官方库控制BLDC应用说明
基于STM8官方库控制BLDC说明一、基于STM8官方库控制BLDC反电动势采样方法说明1、ST公司专利(PWMOFF反电势采样)采样原理:在PWMOFF期间电机虚拟中点的电压为零,反电势电压可以直接AD采样,采样值和0.2V做比较;优点:采样电路简单,只需要三个限流电阻,限制流入AD转换器的电流;缺点:由于这种方法需要一定的PWMOFF时间,所以在有些需要PWM占空比为100%的应用中,无法使用此方法;2、反电势经典采样方法(PWMON)采样原理:在PWMON期间,电机中点电压为电源母线电压的一半,其值作为反电势是否过零点的参考值优点:PWM的占空比可以达到100%;缺点:需要三个电阻构建一个虚拟中点,并且和电机的速度有关系,在采样灵敏度上没有PWMOFF灵敏;虚拟中点基于虚拟中点反电动势采样电路设计采样电路设计计算方法:F为PWM的频率,本例为18.1Khz二、基于STM8官方库的启动方法主要由两部分组成强制启动和线性加速1、强制启动:为了产生足够大的启动转矩所以同时给电机的三相通电。其功能主要由这个函数完成AlignRotor(void)T1用PWM控制,T4,T6为低;TIM1-CCMR1=CCMR_PWM;T1为PWMTIM1-CCMR2=CCMR_LOWSIDE;T4TIM1-CCMR3=CCMR_LOWSIDE;T6TIM1-CCER1=(A_ON|B_COMP);TIM1-CCER2=C_COMP;2、加速阶段:通过增加PWM的占空比来增加速度,在开环控制模式时加速阶段一直到自动模式(也就是执行完300ms的加速时间,占空比达到75%);在闭环控制模式时速度只要达到设置的最小速度,加速就结束。3、加速代码:增加PWM的占空比if(Align_IndexAlign_Target){Align_Index+=1;temp32=((u32)Align_Index*(u16)hArrPwmVal);修改加速时PWM占空比temp32=temp32/(u16)100;Temp=(u16)temp32;ToCMPxH(TIM1-CCR1H,temp);ToCMPxL(TIM1-CCR1L,temp);ToCMPxH(TIM1-CCR2H,temp);ToCMPxL(TIM1-CCR2L,temp);ToCMPxH(TIM1-CCR3H,temp);ToCMPxL(TIM1-CCR3L,temp);}三、电机换相主要包括软件弱磁、过零检测(AD转化)、换相三部分:其功能由这个函数ComHandler(void)完成CD为快速退磁时间,Z为过零点,ZC为换向延迟也就是30°延迟。一个换相的完整周期是快速退磁、过零检测、换相三部分1、快速退磁:退磁代码:其主要完成以下两个功能,弱磁和设置反电势采样点的;A、退磁时间分两部分:MTC_STEP_MODE:电机已经完成启动阶段,但是没有达到设定的速度,也就是电机加速阶段。退磁时间为:Commutation_Time=RAMP_TABLE[Ramp_Step]电机启动阶段:就是上文提到的电机加速阶段,这个阶段检测不到零点。弱磁时间为:temp_time=Previous_Zero_Cross_Time*2;hTim3Th=hTim3Cnt+temp_time;B、设置反电势采样点:由于本设计要求PWM的占空比为100%所以只能为BEMF_SAMPLING_METHOD==BEMF_SAMPLING_TONMCI_CONTROL_DR&=(u8)(~MCI_CONTROL_PINS);MCI_CONTROL_DDR|=MCI_CONTROL_PINS;反电势采样时设置相应的GPIO为低这两行代码实现上图所示的功能。反电动势采样点设置:ToCMPxH(TIM1-CCR4H,(hCntDeadDtime+SAMPLING_POINT_DURING_TON_CNT));ToCMPxL(TIM1-CCR4L,(hCntDeadDtime+SAMPLING_POINT_DURING_TON_CNT));hCntDeadDtime为常数6.25us;SAMPLING_POINT_DURING_TON_CNT也是常数;2、过零点检测:每相在一个周期内必须检测到两个过零点,一次是上升沿过零点也就是反电势由负值变为正值;另一次是下降沿过零点也就是反电动势由正值变为负值;弱磁时间结束后就开始反电势检测,由于本设计要求PWM的占空比为100%,所以只能采样经典的过零点检测方法,也就是反电势的值和中点电压值作比较。这些功能主要由AD中断函数完成。中点电压每10ms就AD采样一次vtimer_SetTimer(ADC_SAMPLE_TIMER,ADC_SAMPLE_TIMEOUT,&Application_ADC_Manager);反电势过零点代码:只以下降沿过零点为例Current_BEMF==BEMF_FALLING;反电势下降沿过零点bemf_threshold=hNeutralPoint;比较参考值为中点电压值if(databemf_threshold)检测到过零点Zero_Sample_Count++;BEMF_Sample_Debounce++;if(BEMF_Sample_Debounce=BEMF_SAMPLE_COUNT)检测到两次过零点其中有一次为虚假的过零点,由于消磁事件的存在,B端会在AC相通电期间,产生两次过零事件。PWM信号驱动时退磁波形图A、B、C感生电动势实际波形(PWM占空比为100%)SpeedMeasurement();bComHanderEnable=1;换相使能if(bComHanderEnable==1){ComHandler();}调用换相函数;3、换相延迟时间计算:其主要由两部分组成一部分是检测到过零点,另一部是未检测到过零点直接换相(主要是电机启动阶段);A、Autoswitchmode:if(Zero_Cross_Count!=Last_Zero_Cross_Count)检测到过零点Commutation_Time=(Previous_Zero_Cross_Time*BEMF_Falling_Factor)计算换相延迟时间BEMF_Falling_Factor;这个参数和速度有关系u16GetSpeed_01HZ(void);计算速度函数{hTemp=PWM_FREQUENCY;PWM频率wTemp=(u32)(hTemp)*10;wTemp/=(*pcounter_reg);speedHz10=(u16)(wTemp);}BLDCDelayCoefComputation(u16Motor_Frequency);速度延迟参数计算函数计算出的速度和曲线上的点作比较,根据比较的结果来选择速度延迟函数的参数BEMF_Falling_Factor;Motor_Frequency=Freq_Min;BEMF_Rising_Factor=Rising_Fmin;BEMF_Falling_Factor=Falling_Fmin;Motor_Frequency=F_1BEMF_Rising_Factor=(u8)(Rising_Fmin+(s32)(alpha_Rising_1*(Motor_Frequency-Freq_Min)/1024));Motor_Frequency=F_2BEMF_Rising_Factor=(u8)(Rising_F_1+(s16)(alpha_Rising_2*(Motor_Frequency-F_1)/1024));Motor_Frequency=Freq_MaxBEMF_Rising_Factor=(u8)(Rising_F_2+(u16)(alpha_Rising_3*(Motor_Frequency-F_2)/1024));Bsteppedmode:Commutation_Time=Average_Zero_Cross_Time;hTim3Th=Average_Zero_Cross_Time;Average_Zero_Cross_Time=(Previous_Zero_Cross_Time+Zero_Cross_Time)1;Previous_Zero_Cross_Time=Zero_Cross_Time;4、换相功能:电机正转的相序表constPhase_Step_sPhaseSteps_CW[NUMBER_PHASE_STEPS]={{CCMR_PWM,CCMR_LOWSIDE,CCMR_PWM,(A_ON|B_COMP),C_OFF},//A-HI,B-Lo,C-Looking{CCMR_PWM,CCMR_PWM,CCMR_LOWSIDE,(A_ON|B_OFF),C_COMP},//A-HI,C-Lo,B-Looking{CCMR_PWM,CCMR_PWM,CCMR_LOWSIDE,(A_OFF|B_ON),C_COMP},//B-HI,C-Lo,A-Looking{CCMR_LOWSIDE,CCMR_PWM,CCMR_PWM,(A_COMP|B_ON),C_OFF},//B-HI,A-Lo,C-Looking{CCMR_LOWSIDE,CCMR_PWM,CCMR_PWM,(A_COMP|B_OFF),C_ON},//C-Hi,A-Lo,B-Looking{CCMR_PWM,CCMR_LOWSIDE,CCMR_PWM,(A_OFF|B_COMP),C_ON}//C-Hi,B-Lo,A-Looking};四、电机启动函数(电机转速达到最小转速要求,可以检测到零点)voidStartMotor(void){Ramp_Step=0;Commutation_Time=RAMP_TABLE[Ramp_Step];Ramp_Step++;Current_BEMF=BEMFSteps[CurrentStep].BEMF_Level;反电势检测沿Current_BEMF_Channel=BEMFSteps[CurrentStep].ADC_Channel;反电势检测通道hTim3Th=Commutation_Time;装载延迟函数data=((u32)RAMP_DUTY_CYCLE*(u16)hArrPwmVal);计算PWM占空比data=data/(u16)100;temp=(u16)data;}五、定时器TIM1中断函数的功能:中断源为计数器更新、计数溢出、触发、刹车中断voidTIM1_UPD_OVF_TRG_BRK_IRQHandler(void)staticu16bkin_blink_cnt=0;if((TIM1-SR1&BIT7)==BIT7);这部分代码主要是刹车中断else这部分代码是更新中断其功能由两部分组成,触发AD转换,进行软件计数//UpdatemanagementonlyifBRKisnotoccurredif((TIM1-SR1&BIT0)==BIT0)if(bEnableSoftwareCounter==1)软件计数使能{hTim3Cnt++;//Checkformatchif(hTim3Cnt=hTim3Th);hTim3Th:根据不同的值其分别是弱磁时间,换相延迟时间ComHandler();调用换相函数具体功能为,软件弱磁,过零点检测,换相}触发AD转换:TIM1的更新中断值由下面参数决定:ToCMPxH(TIM1-CCR4H,(hCntDeadDtime+SAMPLING_POINT_DURING_TON_CNT));ToCMPxL(TIM1-CCR4L,(hCntDeadDtime+SAMPLING_POINT_DURING_TON_CNT));六、一些主要参数的设置1、电机参数设置,在这个头文件MC_BLDC_Motor_Param.h#defineMEASURED_ROTOR_SPEED0//(unitrpm)//Constant
本文标题:基于STM8官方库控制BLDC应用说明
链接地址:https://www.777doc.com/doc-5053245 .html