最近在研究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)
2018-5-9 15:32 上傳
點擊文件名下載附件
|