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的時間