欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32無刷電機EMF過零檢測程序源碼模板(注釋很詳細)求大神完善
[打印本頁]
作者:
kometlp
時間:
2018-5-9 15:32
標題:
STM32無刷電機EMF過零檢測程序源碼模板(注釋很詳細)求大神完善
最近在研究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 上傳
點擊文件名下載附件
作者:
lushp88
時間:
2018-8-12 23:14
兄弟 有源碼嗎? 求源碼!!
作者:
zxgpy
時間:
2018-8-22 16:21
謝謝分享
作者:
zxgpy
時間:
2018-8-22 16:21
謝謝分享
作者:
huafeixue8
時間:
2018-11-4 17:18
感謝樓主
作者:
chenyixian
時間:
2019-7-23 14:59
對無傳感控制有好的參考價值!
作者:
a20084666
時間:
2019-8-15 21:19
謝謝提供,話說這個是哪個上面的程序
作者:
lf642411
時間:
2019-9-25 09:48
大俠,能提供源碼嗎?
作者:
bowaterbo
時間:
2020-2-10 22:53
正在學習,參考一下,謝謝無私分享。
作者:
bowaterbo
時間:
2020-2-10 23:05
剛剛下載了,看了下,只有定義,沒有程序。如10樓問:話說哪個程序在哪里?
作者:
鑫1996
時間:
2020-8-14 16:14
這是個啥,放了一堆定義,大家一起完善一下吧
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1