最近在研究BLDC电机的控制,四处搜集资料,附件中是基于EMF过零检测控制BLDC的程序,目前只有用到的结构体变量定义部分,可以提供些程序框架思路。
带有详细注释的单片机源程序框架如下:
- if((uwMspVirtualTimer - uwMspVirtualTimerKeep)>msp->uwCmtPRD_OpenPulse)
- {
- pwm1.CmtnPointer-=1;
- if(pwm1.CmtnPointer>0xF0)
- {
- pwm1.CmtnPointer=5;
- }
- msp->SampleBemfEn_OpenPulse=TRUE;
- msp->ExtenAdcSample=DISABLE;//DETECT BEMF
- msp->AvoidCommuteTimer=0;
- msp->dutyCycleCmd=OPEN_STARTUP_DUTY;//sysVar.InputAnalogRef;//注意ANA_INPUT_MIN限制
- msp->uwSixStepCount++;
- uwMspVirtualTimerKeep = uwMspVirtualTimer;
- }
- //Define the zeroCross structure
- typedef struct
- {
- u16 timer; //过零检测用时间计数器,时基为50us
- u8 state; //过零检测状态
- u16 compare; //过零换向延迟30°的时间
- u16 period; //两个cntr之间的时间(60°电角度)
- u16 oldPeriod; //记录上一次的Period
- u16 periodARY[6]; //存储过去6次的period
- u8 CmtnPointer; //存储经由zerocross计算出的cntr,用于向pwm1.cntr赋值
- u8 detected**; //过零点检测标志位,在检测到过零点之后被置为TRUE,然后在等待30°换向的过程中被置FALSE(有效时间很短)
- u8 diodeDelayTimer; //用于表示换向去磁阶段(由续流二极管引起)不检测反电势的时间
- u16 periodAcc; //用于存储之前6次的period之和,用于计算period平均值averagePeriod6
- u16 averagePeriod6; //等于periodAcc/6,算出平均period的值
- u8 phaseAdvance; //超前换向补偿,这个值用于补偿因滤波导致过零点的滞后,以减小延迟30°的时间,需要根据实际的硬件电路进行校正
- //FIR阶数的一半为FIR引入的群延迟时间,在换向时要进行补偿
- u16 neutral; //估算的中性点电压
- u32 CmtnPointerChangeCounter;//记录两次换向之间的时间,如果过大,则认为速度为0
- u16 Revolutions; //记录了zerocross的换向次数
- u16 StopTimeProtected; //该值根据SPEEDMIN计算出的最大值,以50us(20K的中断频率下)为单位的次数
- } ZEROCROSS_OTYP;
- typedef ZEROCROSS_OTYP *ZEROCROSS_handle;
- typedef struct
- {
- //Statemachine 内部使用变量
- u8 GuideState; //当前状态机的状态
- u16 uwStmTimebase; //statemachine 时基(50us)
- u16 uwStartAttemptCount; //记录接收到启动命令之后,进入OFF_STATE的次数
- u16 uwBemfThreshold; //启动过程中,反电势过零比较时使用的阈值电压,默认为100mv
- u16 uwThreeComuThrehold; //三步换向时,换向点的电平值
- u16 uwBemf; //启动过程中,记录不通电那一相的端电压
- u32 uwAlignTime; //转子对位时间,默认为1.6s
- u8 uwShortCycles; //记录刹车次数(一个OFF_STATE到另外一个OFF_STATE之间)
- u16 uwSixStepCount; //开环脉冲换向计数器,记录了开环阶段的换向次数,等于START_PLUSE_TOTALNUM
- u8 CheckType; //在START_PULSE_STATE使用,==1说明是电机未通电时转速过高跳转过来的,则进行过零点周期计算(类似于FIND_PERIOD),否则就发送3步换向脉冲
- u16 BemfPrdSUM_SixStep;
- u16 BemfPrdAVG_SixStep; //记录3步换向时,两个BEMF的间隔值(50us时基),由BemfPrdSUM_SixStep平均而来
- u16 BemfPrdAVG_OpenPulse; //记录OPEN_PULSE时,两个BEMF的间隔值(50us时基),由BemfPrd_OpenPulse平均而来
- u16 MaxDutyForStart; //对应于最大限流值的占空比,用于开环启动使用
- u16 BemfPrd_SixStep; //3步换向时,记录两个BEMF的间隔值(50us时基)
- u16 BemfPrd_OpenPulse; //OPEN_PULSE时,记录两个BEMF的间隔值(50us时基)
- u16 uwCmtPRD_OpenPulse; //OPEN_PULSE时换向间隔(50us时基),600=30ms
- u8 SampleBemfEn_OpenPulse; //==TRUE时可以采集过零点,每个cmtnpointer只采集一次
-
- //Statemachine 外部使用变量
- u16 dutyCycleCmd; //命令占空比,将在statemachine函数之后送入ramp模块
- u16 AvoidCommuteTimer; //在OPEN_PULSE阶段,每次检测BEMF的时候,要避开二极管续流的那个点,
- //换向后,当这个值大于START_PLUSE_COMMUTATE_TIME时才开始采样BEMF
- u8 CmtPtrKeep_OpenPulse; //跳转到STOP_1S_STATE之前,保存当前的cmtpointer值,在返回RUN_2S_STATE时,恢复cmtpointer.
- u8 CmtPtrKeep_SixStep; //在Three_step阶段,保存pwm.cmtpointer的值
- u32 Timer2S_trigger; //在OPEN_PULSE阶段,运行2S,触发一次,跳入STOP_1S_STATE
- u16 VirtualTimerKeep; //在Three_step阶段,用于计算BemfPeriod
- u8 ExtenAdcSample; //在电机启动的部分中,ENABLE=采样非关键ADC通道,例如母线电流,外部模拟量,模块温度等,序列采样
- // DISABLE=采集反电动势
- }MOTORSTART_OTYP;
复制代码
框架思路下载,还只是半成品,很多程序还未写完:
structure define.zip
(2.39 KB, 下载次数: 215)
|