Microchip有一篇Application Note "Sensorless BLDC Control with Back-EMF Filtering Using a Majority Fuction" 此篇有許多複雜的表格和演算法 困惑了我一段時間,所以我分享一下我對這篇的理解
AN1160 前半段篇幅都在講解Sensorless基礎,我相信仔細閱讀的話不難理解,所以我重點就放在Page 9之後的數位濾波(Digital Filter)技巧與演算法實現的部分 註:閱讀此篇文章建議搭配看程式碼
Majority Function : 簡單說是一種布林函數(Boolean Function),輸出只會是 1 或 0 , 從下表可以看出,假設有3個輸入,有兩個1(66%) 輸出就是1 ,反之有兩個0(66%) ,輸出就是0。
Majority Function不難理解,此文章最難理解的莫屬於下面這張表格,需要拆開來慢慢說明。
以下圖為例 Logical test 何時為0 何時為1??
BEMF Phase: 因為偵測反電動勢是否有過零點(Zero - Crossing) ,因此需要先將反電動勢訊號數位化 ,BEMF那欄只有0跟1 ,至於何時會是0,何時會是1 ,讀者自己推敲一下既可明白。
XOR Masked: 用來判斷BEMF是上升或下降(註:XOR那欄的0代表BEMF處於下降,1處於上升) , 對BEMF做XOR運算,例如 Angle 3時 BEMF CBA 是 110 ,XOR Masked 是000
因此 110
XOR 000
-----------------
110 (運算完之後接著運算AND)
AND Masked :用來判斷哪個過零點要偵測哪一個phase,(註:AND那欄的1代表過零點在那一Phase判斷)
剛才經過XOR運算完的結果再放到AND Masked做運算,
110
AND 010
--------------------
010
經過XOR 、AND運算後的結果 稱為 " Active-Masked BEMF "
Active-Masked BEMF 3個位元在經過OR運算 結果稱為"Logical Test"
0 | 1 | 0 => 1 (Logical Test)
AN1160範例程式下面這段,就是在判斷(Logical Test)
if((ComparatorOutputs^ADC_XOR[ADCCommState])& ADC_MASK[ADCCommState]){ //ACTIVE BEMF signal
adcBackEMFFilter|=0x01; //logical test
}
濾波器會不斷查找Logical Test 從 1(真) 變成 0(假) 的變化,一但查找到之後,會在查找連續3個假 ,才會判斷Zero-Cross Event 為有效
參考下圖就能明白整體的運作方式。
接下來的重點是如何用程式實現數位濾波器
程式的濾波器寫法只用兩個判斷式,就實現數位濾波器的功能
if((ComparatorOutputs^ADC_XOR[ADCCommState])& ADC_MASK[ADCCommState]){ //ACTIVE BEMF signal
adcBackEMFFilter|=0x01; //logical test
}
adcBackEMFFilter = ADC_BEMF_FILTER[adcBackEMFFilter]; //Majority detection filter
LATAbits.LATA10 = 0;
if (adcBackEMFFilter&0b00000001) { //如果成立 就判斷Zero-Corssing 有效
..........................
}
請注意在def.c 的這個濾波器表格,其中0x01代表過零點為有效(Ture)
const unsigned char ADC_BEMF_FILTER_CLKW[64]= //unique index is 24,25,26,28,40,41,42,44,48,49,50,52,56,57,58,60
{0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x1C,0x1E,
0x20,0x22,0x24,0x26,0x28,0x2A,0x2C,0x2E,0x01,0x01,0x01,0x36,0x01,0x3A,0x3C,0x3E, //first half
0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x01,0x01,0x01,0x16,0x01,0x1A,0x1C,0x1E,
0x01,0x01,0x01,0x26,0x01,0x2A,0x2C,0x2E,0x01,0x01,0x01,0x36,0x01,0x3A,0x3C,0x3E }; //second half
請注意,假設目前的ADC_BEMF_FILTER[adcBackEMFFilter]; 是指向最後一個元素 0x3E(62) index = 63;
當logical test |= 1不成立時,
adcBackEMFFilter = ADC_BEMF_FILTER[ 0x3E(62) ] // adcBackEMFFilter = 0x3C
logical test |= 1 還是不成立,
adcBackEMFFilter = ADC_BEMF_FILTER[ 0x3C(60) ] // adcBackEMFFilter = 0x01
此時下列就成立(注:AN1160是說會判斷3個假的logical test,但是按照程式的邏輯推敲只會判斷2次假)
if (adcBackEMFFilter&0b00000001) { //如果成立 就判斷Zero-Corssing 有效
..........................
}
注意: 由於Sersorless啟動的過程,首先馬達在正常運轉狀態之前,會有個啟動模式,此時會讓馬達轉子進行定位、加速(ramp-up)和穩定運轉,期間偵測ZC
由於無感測是用反電動勢偵測ZC,因此速度不能太慢。
所以可以看到程式碼有個BLANKING_COUNT,這個時間就是在等待馬達ramp-up的時間

Mr. Motor Mr. Motor 您好 我現在也在研究Microchip AN1160 請教幾個問題 1.在AN1160B 文件第12頁中 角度60度時,所算出的Filter Output應該為60 但卻在下一筆才變化1.在AN1160B 文件第12頁中 角度60度時,所算出的Filter Output應該為60 但卻在下一筆才變化,請問是否有延遲一筆運算? 2.在AN1160B 文件第13頁中 角度21度時,所算出的Filter Output為1 就應該是交越點嗎? 我所推算的Filter Output跟表中的值不一樣 我算出的值為Filter[47]=30 請問文件中的數值是否有誤?
1.照程式的邏輯推敲應該要填60 ,因為程式的寫法是先做邏輯測試 在帶濾波器 ,且角度3時 , filter output也應是2,但卻是0,我也不知道為甚麼表格是這樣填 2.你說的交越點是指 Zero-crossing嗎? 從程式來看 adcBackEMFFilter = 1時 的確就算Zero-crossing, 從程式的表格來看 Filter[47]=30沒有錯。page13的表 我覺得疑點太多,就沒有仔細看了 如有人能解惑,歡迎留言
謝謝你的回答 原來不只我對這個問題抱持疑問 另外在程式中 利用Timer1中斷來延遲換相30度電氣角時間 請問以馬達驅動的觀點 電壓超前電流 相電流零交越須做超前 相電壓零交越須做落後??
你好, 依我所了解的 Zero-Crossing,在過30度電器角,才是實際的換相點(可以比對Hall訊號) Zero-Crossing只是取代Hall的一種技術。 不太清楚你的問題
了解 以為到交越點就要立刻換相 所以與hall差30度 謝謝指點