|
|
最近在研究BLDC電機(jī)的控制,四處搜集資料,附件中是基于EMF過(guò)零檢測(cè)控制BLDC的程序,目前只有用到的結(jié)構(gòu)體變量定義部分,可以提供些程序框架思路。
帶有詳細(xì)注釋的單片機(jī)源程序框架如下:
- 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; //過(guò)零檢測(cè)用時(shí)間計(jì)數(shù)器,時(shí)基為50us
- u8 state; //過(guò)零檢測(cè)狀態(tài)
- u16 compare; //過(guò)零換向延遲30°的時(shí)間
- u16 period; //兩個(gè)cntr之間的時(shí)間(60°電角度)
- u16 oldPeriod; //記錄上一次的Period
- u16 periodARY[6]; //存儲(chǔ)過(guò)去6次的period
- u8 CmtnPointer; //存儲(chǔ)經(jīng)由zerocross計(jì)算出的cntr,用于向pwm1.cntr賦值
- u8 detected**; //過(guò)零點(diǎn)檢測(cè)標(biāo)志位,在檢測(cè)到過(guò)零點(diǎn)之后被置為T(mén)RUE,然后在等待30°換向的過(guò)程中被置FALSE(有效時(shí)間很短)
- u8 diodeDelayTimer; //用于表示換向去磁階段(由續(xù)流二極管引起)不檢測(cè)反電勢(shì)的時(shí)間
- u16 periodAcc; //用于存儲(chǔ)之前6次的period之和,用于計(jì)算period平均值averagePeriod6
- u16 averagePeriod6; //等于periodAcc/6,算出平均period的值
- u8 phaseAdvance; //超前換向補(bǔ)償,這個(gè)值用于補(bǔ)償因?yàn)V波導(dǎo)致過(guò)零點(diǎn)的滯后,以減小延遲30°的時(shí)間,需要根據(jù)實(shí)際的硬件電路進(jìn)行校正
- //FIR階數(shù)的一半為FIR引入的群延遲時(shí)間,在換向時(shí)要進(jìn)行補(bǔ)償
- u16 neutral; //估算的中性點(diǎn)電壓
- u32 CmtnPointerChangeCounter;//記錄兩次換向之間的時(shí)間,如果過(guò)大,則認(rèn)為速度為0
- u16 Revolutions; //記錄了zerocross的換向次數(shù)
- u16 StopTimeProtected; //該值根據(jù)SPEEDMIN計(jì)算出的最大值,以50us(20K的中斷頻率下)為單位的次數(shù)
- } ZEROCROSS_OTYP;
- typedef ZEROCROSS_OTYP *ZEROCROSS_handle;
- typedef struct
- {
- //Statemachine 內(nèi)部使用變量
- u8 GuideState; //當(dāng)前狀態(tài)機(jī)的狀態(tài)
- u16 uwStmTimebase; //statemachine 時(shí)基(50us)
- u16 uwStartAttemptCount; //記錄接收到啟動(dòng)命令之后,進(jìn)入OFF_STATE的次數(shù)
- u16 uwBemfThreshold; //啟動(dòng)過(guò)程中,反電勢(shì)過(guò)零比較時(shí)使用的閾值電壓,默認(rèn)為100mv
- u16 uwThreeComuThrehold; //三步換向時(shí),換向點(diǎn)的電平值
- u16 uwBemf; //啟動(dòng)過(guò)程中,記錄不通電那一相的端電壓
- u32 uwAlignTime; //轉(zhuǎn)子對(duì)位時(shí)間,默認(rèn)為1.6s
- u8 uwShortCycles; //記錄剎車(chē)次數(shù)(一個(gè)OFF_STATE到另外一個(gè)OFF_STATE之間)
- u16 uwSixStepCount; //開(kāi)環(huán)脈沖換向計(jì)數(shù)器,記錄了開(kāi)環(huán)階段的換向次數(shù),等于START_PLUSE_TOTALNUM
- u8 CheckType; //在START_PULSE_STATE使用,==1說(shuō)明是電機(jī)未通電時(shí)轉(zhuǎn)速過(guò)高跳轉(zhuǎn)過(guò)來(lái)的,則進(jìn)行過(guò)零點(diǎn)周期計(jì)算(類(lèi)似于FIND_PERIOD),否則就發(fā)送3步換向脈沖
- u16 BemfPrdSUM_SixStep;
- u16 BemfPrdAVG_SixStep; //記錄3步換向時(shí),兩個(gè)BEMF的間隔值(50us時(shí)基),由BemfPrdSUM_SixStep平均而來(lái)
- u16 BemfPrdAVG_OpenPulse; //記錄OPEN_PULSE時(shí),兩個(gè)BEMF的間隔值(50us時(shí)基),由BemfPrd_OpenPulse平均而來(lái)
- u16 MaxDutyForStart; //對(duì)應(yīng)于最大限流值的占空比,用于開(kāi)環(huán)啟動(dòng)使用
- u16 BemfPrd_SixStep; //3步換向時(shí),記錄兩個(gè)BEMF的間隔值(50us時(shí)基)
- u16 BemfPrd_OpenPulse; //OPEN_PULSE時(shí),記錄兩個(gè)BEMF的間隔值(50us時(shí)基)
- u16 uwCmtPRD_OpenPulse; //OPEN_PULSE時(shí)換向間隔(50us時(shí)基),600=30ms
- u8 SampleBemfEn_OpenPulse; //==TRUE時(shí)可以采集過(guò)零點(diǎn),每個(gè)cmtnpointer只采集一次
-
- //Statemachine 外部使用變量
- u16 dutyCycleCmd; //命令占空比,將在statemachine函數(shù)之后送入ramp模塊
- u16 AvoidCommuteTimer; //在OPEN_PULSE階段,每次檢測(cè)BEMF的時(shí)候,要避開(kāi)二極管續(xù)流的那個(gè)點(diǎn),
- //換向后,當(dāng)這個(gè)值大于START_PLUSE_COMMUTATE_TIME時(shí)才開(kāi)始采樣BEMF
- u8 CmtPtrKeep_OpenPulse; //跳轉(zhuǎn)到STOP_1S_STATE之前,保存當(dāng)前的cmtpointer值,在返回RUN_2S_STATE時(shí),恢復(fù)cmtpointer.
- u8 CmtPtrKeep_SixStep; //在Three_step階段,保存pwm.cmtpointer的值
- u32 Timer2S_trigger; //在OPEN_PULSE階段,運(yùn)行2S,觸發(fā)一次,跳入STOP_1S_STATE
- u16 VirtualTimerKeep; //在Three_step階段,用于計(jì)算BemfPeriod
- u8 ExtenAdcSample; //在電機(jī)啟動(dòng)的部分中,ENABLE=采樣非關(guān)鍵ADC通道,例如母線電流,外部模擬量,模塊溫度等,序列采樣
- // DISABLE=采集反電動(dòng)勢(shì)
- }MOTORSTART_OTYP;
復(fù)制代碼
框架思路下載,還只是半成品,很多程序還未寫(xiě)完:
structure define.zip
(2.39 KB, 下載次數(shù): 215)
2018-5-9 15:32 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|