以下結合自己的理解,如有錯誤請幫忙及時指正。
轉速的計算我現在是通過一定時間內,霍爾訊號的邊沿數量來計算的。這裡每隔50ms在滴答定時器中斷服務函式裡面計算一次。霍爾訊號每變化一次,就產生一次霍爾觸發中斷。因為我的電機是2對極,所以在一圈內有12個霍爾狀態,即電機轉動一圈會觸發12次中斷。假設在50ms內,霍爾觸發了 n 次中斷,我們可以得到轉速 x 的公式:
50ms內,
\[x=n/12 (rpms)
\]則1ms內
\[x=n/12/50 (rpms)
\]1s內
\[x=(n/12/50)*1000 (rps)
\]1min內
\[x=(n/12/50)*1000*60=100n (rpm)
\]根據這個式子就能計算出轉速。
在標頭檔案中宣告電機引數結構體
typedef struct
motor_device;
巨集定義
#define bldc_pole_num 2 //極對數
對電機引數初始化
motor_device bldc_dev; //電機引數結構體
void motor_init(void)
定時器初始化,每1ms中斷一次
void systick_init(void)
編寫滴答定時器中斷服務函式,每50ms計算一次轉速
void systick_handler(void)
}
在霍爾中斷服務函式中加入計步引數,測量50ms內霍爾感測器脈衝數量,用於計算轉速
void hall_tim_irqhandler(void)
}
通過串列埠除錯助手檢視轉速資訊。
用的24v電機最高轉速有33000rpm,這裡在開環20%占空比下,有100rpm的波動。為什麼是100?其實這就是這種計算方法的侷限性,我們通過一段時間內霍爾變化次數計算轉速,每次變化我們就加1,所以誤差的原因就在這裡,我們每次只能加1,誤差1通過公式中係數100(2對極)進行了放大,就變成了誤差100rpm.
後續將嘗試另一種通過兩個霍爾狀態之間時間差計算轉速的方式。
IPLE 開發筆記 4
10 月 16 日 經過總結得出了一點api設計經驗,即傳識別符號,不穿指標。最初的設計 void demoapi pbyte pfiledata,int width,int height 改良後的設計 void demoapi handle hfile 這樣的好處是,我們只需要在函式外部管理乙個檔...
ios開發筆記 4
title ios開發筆記 4 date 2016 02 21 01 11 55 categories ios tags ios,筆記 一般此問題 都是由inte ce build與 中iboutlet的連線所引起的。可能是在 中對iboutlet的名稱進行了修改,導致inte ce build中的...
iOS開發筆記(4) 反射
反射的強大之處在於,我們可以將物件與依賴物件之間完全解耦,建立物件可以不引用標頭檔案,操作屬性 方法可以不依賴於物件,操作物件可以不依賴於型別,操作型別可以不依賴於引用等等等等。最直觀的效果是,即使不引用標頭檔案亦可操作型別 物件及對應屬性與方法。借助強大的runtime特性,在ios平台上我們也得...