当前位置:文档之家› 基于STM8官方库控制BLDC应用说明

基于STM8官方库控制BLDC应用说明

基于STM8官方库控制BLDC应用说明
基于STM8官方库控制BLDC应用说明

基于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采样值作比较确定过零点

相关主题
文本预览
相关文档 最新文档