基于STM8官方库控制BLDC说明
一、基于STM8官方库控制BLDC反电动势采样方法说明
1、ST公司专利(PWM OFF 反电势采样)
采样原理:在PWM OFF期间电机虚拟中点的电压为零,反电势电压可以直接AD采样,采样值和0.2V做比较;
优点:采样电路简单,只需要三个限流电阻,限制流入AD转换器的电流;
缺点:由于这种方法需要一定的PWM OFF时间,所以在有些需要PWM占空比为100%的应用中,无法使用此方法;
2、反电势经典采样方法(PWM ON)
采样原理:在PWM ON期间,电机中点电压为电源母线电压的一半,其值作为反电势是否过零点的参考值
优点:PWM 的占空比可以达到100%;
缺点:需要三个电阻构建一个虚拟中点,并且和电机的速度有关系,在采样灵敏度上没有
PWM OFF灵敏;
虚拟中点
基于虚拟中点反电动势采样电路设计
采样电路设计
计算方法:
F为PWM的频率,本例为18.1Khz
二、基于STM8官方库的启动方法主要由两部分组成强制启动和线性加速
1、强制启动:为了产生足够大的启动转矩所以同时给电机的三相通电。其功能主要由这个
函数完成AlignRotor( void )
T1用PWM控制,T4,T6为低;
TIM1->CCMR1 = CCMR_PWM;T1为PWM
TIM1->CCMR2 = CCMR_LOWSIDE;T4
TIM1->CCMR3 = CCMR_LOWSIDE;T6
TIM1->CCER1 = (A_ON|B_COMP);
TIM1->CCER2 = C_COMP;
2、加速阶段:通过增加PWM的占空比来增加速度,在开环控制模式时加速阶段一直到自
动模式(也就是执行完300ms的加速时间,占空比达到75%);在闭环控制模式时速度只要达到设置的最小速度,加速就结束。
3、加速代码:增加PWM的占空比
if( Align_Index < Align_Target ){
Align_Index += 1;
temp32 = ((u32)Align_Index * (u16)hArrPwmV al);修改加速时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_TON
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_Ma nager);
反电势过零点代码:只以下降沿过零点为例
Current_BEMF == BEMF_FALLING;反电势下降沿过零点
bemf_threshold = hNeutralPoint;比较参考值为中点电压值
if( data < bemf_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、Autoswitch mode:
if( Zero_Cross_Count != Last_Zero_Cross_Count )检测到过零点
Commutation_Time = (Previous_Zero_Cross_Time * BEMF_Falling_Factor)计算换相延迟时间BEMF_Falling_Factor;这个参数和速度有关系
u16 GetSpeed_01HZ(void);计算速度函数
{
hTemp = PWM_FREQUENCY;PWM频率
wTemp = (u32)(hTemp) * 10;
wTemp /= (*pcounter_reg);
speedHz10 = (u16)(wTemp);
}
BLDCDelayCoefComputation(u16 Motor_Frequency);速度延迟参数计算函数
计算出的速度和曲线上的点作比较,根据比较的结果来选择速度延迟函数的参数BEMF_Falling_Factor;
Motor_Frequency <= Freq_Min;
BEMF_Rising_Factor = Rising_Fmin;
BEMF_Falling_Factor = Falling_Fmin;
Motor_Frequency <= F_1
BEMF_Rising_Factor=(u8)(Rising_Fmin+(s32)(alpha_Rising_1*(Motor_Frequency-Freq_Min)/1 024));
Motor_Frequency <= F_2
BEMF_Rising_Factor=(u8)(Rising_F_1 + (s16)(alpha_Rising_2*(Motor_Frequency-F_1)/1024)); Motor_Frequency <= Freq_Max
BEMF_Rising_Factor=(u8)(Rising_F_2 + (u16)(alpha_Rising_3*(Motor_Frequency-F_2)/1024));
B stepped mode:
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、换相功能:电机正转的相序表
const Phase_Step_s PhaseSteps_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
};
四、电机启动函数(电机转速达到最小转速要求,可以检测到零点)
void StartMotor( void )
{
Ramp_Step=0;
Commutation_Time = RAMP_TABLE[ Ramp_Step ];
Ramp_Step++;
Current_BEMF = BEMFSteps[Current Step].BEMF_Level;反电势检测沿
Current_BEMF_Channel = BEMFSteps[Current Step].ADC_Channel;反电势检测通道
hTim3Th = Commutation_Time;装载延迟函数
data = ((u32)RAMP_DUTY_CYCLE * (u16)hArrPwmVal);计算PWM占空比
data = data / (u16)100;
temp = (u16)data;
}
五、定时器TIM1中断函数的功能:中断源为计数器更新、计数溢出、触发、刹车中断
void TIM1_UPD_OVF_TRG_BRK_IRQHandler (void)
static u16 bkin_blink_cnt = 0;
if( (TIM1->SR1 & BIT7) == BIT7 );这部分代码主要是刹车中断
else这部分代码是更新中断其功能由两部分组成,触发AD转换,进行软件计数
// Update management only if BRK is not occurred
if ((TIM1->SR1 & BIT0) == BIT0)
if (bEnableSoftwareCounter == 1)软件计数使能
{ hTim3Cnt++;
// Check for match
if (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
#define MEASURED_ROTOR_SPEED 0 // (unit rpm)
// Constant parameters
#define MOTOR_POLE_PAIRS 2 // (unit none):电机极对数
#define MAX_SPEED_RPM 3500 // (unit rpm):电机最大转速
2、电机驱动参数的设置,在这个头文件MC_BLDC_Drive_Param.h
// BLDC configuration default values电机控制方式
#define SPEED_CONTROL_MODE CLOSED_LOOP // (unit none)闭环模式
#define CURRENT_CONTROL_MODE VOLTAGE_MODE // (unit none)电压模式
// Drive param电机驱动参数
#define PWM_FREQUENCY 14400 // (unit Hz)PWM频率
#define DEMAG_TIME 20 // (unit % of the step time)
#define CURRENT_LIMITATION 1000 // (unit mA)
#define MINIMUM_OFF_TIME 9500 // (unit ns)
#define DUTY_CYCLE_TH_TON 81 // Threshold for apply sampling during Ton
#define SAMPLING_POINT_DURING_TOFF 1500 // (unit ns) before Ton
#define SAMPLING_POINT_DURING_TON 9000 // (unit ns) after Ton
// BEMF voltage threshold 采样门槛值
#define BEMF_RISING_THRESHOLD_V 0.2 // (unit V)
#define BEMF_FALLING_THRESHOLD_V 0.2 // (unit V)
7、反电动势采样电路设计
反电势在PWM ON采样时电路
虚拟中点电路,其AD采样值与反电动势AD采样值作比较确定过零点