電動車充電器、無刷電機(jī)控制器軟件應(yīng)用設(shè)計詳細(xì)解剖
本文以MICROCHIP 公司所生產(chǎn)的PIC16F72為基礎(chǔ)說明軟件編程方面所涉及的要點,此文所涉及的源程序均以PIC的匯編語言為例。因電動車充電器涉及電池管理方面的一些知識,本文先不做電動車充電器的講解運用,先初步對控制器進(jìn)行剖析:
我們先列一下電動車無刷馬達(dá)控制器的基本要求:
功能性要求:
1.電子換相
2.無級調(diào)速
3.剎車斷電
4.附加功能
a.限速
b.1+1助力
c.EBS柔性電磁剎車
d.定速巡航
e.其它功能(消除換相噪音,倒車等)
安全性要求:
1.限流驅(qū)動
2.過流保護(hù)
3.堵轉(zhuǎn)保護(hù)
3.電池欠壓保護(hù)
4.節(jié)能和降低溫升
5.附加功能(防盜鎖死,溫升限制等)
6.附加故障檢測功能
從上面的要求來看,功能性要求和安全性要求的前三項用專用的無刷馬達(dá)驅(qū)動芯片加上適當(dāng)?shù)耐鈬娐肪浑y解決,代表芯片是摩托羅拉的MC33035,早期的控制器方案均用該集成塊解決。但后來隨著競爭加劇,很多廠商都增加了不少附加功能,一些附加功能用硬件來實現(xiàn)就比較困難,所以使用單片機(jī)來做控制的控制器迅速取代了硬件電路芯片。
但是硬件控制和軟件控制有很大的區(qū)別,硬件控制的反應(yīng)速度僅僅受限于邏輯門的開關(guān)速度,而軟件的運行則需要時間。要使軟件跟得上電機(jī)控制的需求,就必須要求軟件在最短的時間內(nèi)能夠正確處理換相,電流限制等各種復(fù)雜動作,這就涉及到一個對外部信號的采樣頻率,采樣時機(jī),信號的內(nèi)部處理判斷及處理結(jié)果的輸出,還有一些抗干擾措施等,這些都是軟件設(shè)計中需要再三仔細(xì)考慮的東西。
PIC16F72是一款哈佛結(jié)構(gòu),精簡指令集的MCU,由于其數(shù)據(jù)總線和指令總線分開,總共35條單字指令,0-20M的時鐘速度,所以其運算速度和抗干擾性能都非常出色,2K字長的FLASH程序空間,22個可用的IO口,同時又附加了3個定時/計數(shù)器,5個8位AD口,1個比較/捕捉/脈寬調(diào)制器,8個中斷源,這些優(yōu)異的性能為電動車控制器控制提供了良好的硬件環(huán)境和軟件基礎(chǔ),一經(jīng)推出就贏得眾多設(shè)計人員的熱捧。
那么如何使用PIC16F72來設(shè)計一個電動車控制器呢?我們下面以目前市面流行的硬件設(shè)計為基礎(chǔ),盡量通俗易懂地介紹一下程序設(shè)計思路和注意點。
要使無刷電機(jī)轉(zhuǎn)起來,并且聽從駕駛者的調(diào)速、剎車等基本指揮,最基本的要求就是要實現(xiàn)硬件所能實現(xiàn)的電子換向和調(diào)速,剎車等功能。實際上軟件的整體設(shè)計也和硬件一樣,也是一個模塊化堆砌的過程,問題在于模塊的合理化堆砌,使堆砌后形成的整體能夠堅固,協(xié)調(diào)、高效率運作。我們先說一說各種模塊功能的簡單實現(xiàn),然后再來討論如何使這些模塊協(xié)調(diào)運轉(zhuǎn)。
1.首先說說電子換相模塊
我們知道,直流永磁電機(jī)在運轉(zhuǎn)時需要一對電刷和與線圈相對應(yīng)的換向整流子來使線圈中的電流方向根據(jù)磁場方向來不斷改變,從而轉(zhuǎn)子持續(xù)向一個方向運轉(zhuǎn),我們稱這種電機(jī)為有刷電機(jī),在電動車剛剛面世時一般均使用這種電機(jī),但有刷電機(jī)有一個致命的缺陷,就是用作電刷的碳刷非常容易磨損,換向整流子也非常容易被油污,碳刷碎屑填滿空隙而漏電,而且功率越大,這種毛病越嚴(yán)重,導(dǎo)致有刷電機(jī)維護(hù)量和故障率急劇上升,嚴(yán)重影響其推廣,因此在較大功率的場合,無刷電機(jī)應(yīng)運而生。
無刷電機(jī),顧名思義就是沒有了電刷,不能自動換向,因此要依靠傳感器檢測轉(zhuǎn)子的位置、用電子開關(guān)來改變線圈中電流的方向,所以其控制器要對轉(zhuǎn)子永磁體位置進(jìn)行精確檢測,并用電子開關(guān)切換不同繞組通電以獲得持續(xù)向前的動力。轉(zhuǎn)子位置檢測傳感器有很多,比如光傳感器,磁感應(yīng)傳感器等,電子開關(guān)可以用大功率三極管、功率型場效應(yīng)管、IGBT等制作,在目前的絕大多數(shù)電動車三相無刷電機(jī)中均使用三個開關(guān)式的霍爾傳感器檢測永磁體相對于定子線圈的位置,控制器跟據(jù)三個霍爾傳感器輸出的六種不同信號輸出相應(yīng)的控制信號驅(qū)動功率型場效應(yīng)管(MOSFET)組成的電子開關(guān)向馬達(dá)供電。這就是所謂六步換相法。從電機(jī)原理可以看出,這種電機(jī)是一種特殊的同步電機(jī),因此換相必須及時,否則會導(dǎo)致電機(jī)失步,從而使電機(jī)噪音增大,效率降低,嚴(yán)重的還會導(dǎo)致控制器,電機(jī)燒毀。
鑒于以上要求,我們先必須測一下市面上普通的無刷馬達(dá)在最高轉(zhuǎn)速時(考慮到順風(fēng)和下坡的情況)的換向情況,這個比較簡單,用示波器測量之后得到在最高速時每相霍爾傳感器輸出的頻率大概在140HZ左右,折合到換向的最小時間,那么應(yīng)該是1.2mS左右換相一次,根據(jù)際的使用效果,軟件的反應(yīng)時間必須在0.12mS左右,也就是說在檢測到換相信號的改變并且輸出換相驅(qū)動信號時的過程必須在0.1-0.2mS之內(nèi)完成。
另一個需要考慮的是,電機(jī)驅(qū)動是一個大電流驅(qū)動,又是一個電感性負(fù)載,控制器在運行時不可避免有干擾引入,因此除了在硬件布局,布線上注意外,軟件上也要做相應(yīng)的抗干擾措施以避免錯誤的換向動作??紤]到輸入到單片機(jī)的換相信號容易受干擾,加上線路上濾波電容的影響,單片機(jī)程序在讀取換相信號時應(yīng)至少連續(xù)讀取3次,以3次信號完全一致時才采用該值作為換相信號的真值,如果其中一次不對,那么干脆就重新再讀3次,這就是一個有抗干擾措施的鑒相過程。取得換相信號后,我們將其與上次讀到的值做對比,如果相同,則表示沒有換相,如果不同,則要跟據(jù)這個值去取得一個相對應(yīng)的驅(qū)動信號,從而驅(qū)動電子開關(guān)動作。這個過程可以使用逐項比較法,查表法等來實現(xiàn)。鑒于查表法比較快捷,一般使用查表法。其中需要考慮的是,一旦獲得的信號與所有的六個信號都不相同,可能表示電機(jī)中霍爾元件或者其連接線路出現(xiàn)故障,此時我們應(yīng)該讓電機(jī)斷電以避免誤操作。
市面上有兩種電機(jī),即所謂的120°和60°霍爾信號,這個角度代表三個霍爾器件輸出的三相電信號其相位角相差的角度,其實這里面的區(qū)別僅僅是電平的不一樣,在馬達(dá)內(nèi)部的安裝上,位置沒什么不同,只是中間一相的相位相反,所以仍然是六種信號對應(yīng)六種驅(qū)動,軟件上將表稍作調(diào)整即可。需要提一下的是,在120°的霍爾信號中,不可能出現(xiàn)二進(jìn)制0B000和0B111的編碼,所以在一定程度上避免了因霍爾零件故障而導(dǎo)致的誤操作。因為霍爾元件是開路輸出,高電平依靠電路上的上拉電阻提供,一旦霍爾零件斷電,霍爾信號輸出就是0B111。一旦霍爾零件短路,霍爾信號輸出就是0B000,而60°的霍爾信號在正常工作時這兩種信號均會出現(xiàn),所以一定程度上影響了軟件判斷故障的準(zhǔn)確率。目前市面馬達(dá)已經(jīng)逐漸舍棄60°相位的霍爾排列。
編程提示:
在程序上,我們綜合考慮單片機(jī)的處理速度,采用定時中斷去檢測相位變化,中斷周期采用128μS,中斷源可使用TMR0,或者PWM本身的TMR2中斷。在同一個中斷中,我們還將安排其它更重要的工作,這個在后面的電流控制中再說明。
編程技巧:
從硬件電路圖中我們看到,位置霍爾信號在PORTC口的RC4、RC5、RC6三個口輸入,以120°相位為例,如果直接讀出來,對應(yīng)十六進(jìn)制值是0X10-0X60,考慮到霍爾出錯的可能,那么對應(yīng)的值是0X00-0X70,顯然這個值對今后的查表處理造成非常大的麻煩,我們不可能去弄一個0X70這么大的表格而其中只放僅僅8個元素,所以有必要考慮編程時的優(yōu)化,且看下面一個例程:
讀取相位值的例程:
READHALL:
SWAPF PORTC,W ;將PORTC的高,低半字節(jié)交換后讀至W
ANDLW 0X07 ;屏蔽掉不必要的位,
MOVWF HALLTEMP ;存人暫存器
SWAPF PORTC,W ;再次讀
ANDLW 0X07
SUBWF HALLTEMP,W ;與舊值比較
BTFSS STATUS,Z
GOTO READHALL ;如果與第一次讀取的不一樣,則從頭再來
SWAPF PORTC,W ;第三次讀
ANDLW 0X07
SUBWF HALLTEMP,W ;再次比較
BTFSS STATUS,Z
GOTO READHALL ;不一樣則從頭再來
RETURN ;三次讀取值一致,返回。
這個程序中,最關(guān)鍵是 SWAPF PORTC,W 這句,這句語句一方面讀取了霍爾值,另一方面與下句語句結(jié)合還將此值變?yōu)?-7的最小值,這樣使得我們后面的查表只需要8個空間的元素。
以上程序,也有人認(rèn)為有可能會導(dǎo)致程序陷入死循環(huán),但不必?fù)?dān)心,因為要導(dǎo)致這個程序進(jìn)入死循環(huán)的信號頻率必須非常高,有興趣的讀者可計算一下。
有了上面的霍爾讀取程序,我們下面的查表讀取相應(yīng)驅(qū)動值就會變的比較方便,但查表也有很多種,在PIC16F72中,查表可以用RETLW在程序空間查,也可以用專用的讀取FLASH空間的指令去讀,考慮到我們這個表格一共只有8個元素,我們可以將器放在內(nèi)存寄存器中,利用用FSR去讀取表內(nèi)容。這樣做有好處,就是查表時不用去考慮查表偏移量造成程序計數(shù)器溢出,另一方面是120°和60°可以使用同一個表格而不用切換。這個表格,我們可以放在寄存器空間不太方便使用的BANK1,在程序初始化時預(yù)先寫入正確的換向?qū)?yīng)值。這個程序在時間上并不比其它兩種查表法顯得快多少,而且程序空間也不節(jié)省,在這里只是作為一個方法示例,可以讓我們看到實現(xiàn)同一個功能可以走不同的路。
使用內(nèi)存查表法的驅(qū)動值獲取例程:
;
HALLSTART EQU 0XA1 ;定義霍爾-驅(qū)動表格的起始地址在BANK1的0XA1開始處
;
HALL_DRIVER: ;由霍爾值取得對應(yīng)驅(qū)動值的內(nèi)存查表例程
MOVF HALLTEMP,W ;取得HALL的真值
ADDLW HALLSTART ;加上表格的起始地址
MOVWF FSR ;放到間接讀內(nèi)存的指針中。
MOVF INDF,W ;讀出驅(qū)動值
MOVWF PORTB ;不管返回值如何,先寫入驅(qū)動端口,
SUBLW STOP_D ;與電機(jī)停止值相比較,
BTFSC STATUS,Z
GOTO HALL_ERR ;如果獲得停止電機(jī)值,那么表示霍爾信號有問題
RETURN
無級調(diào)速模塊部分:
由于使用直流電源,電機(jī)的速度得依靠調(diào)節(jié)加在電機(jī)兩端的電壓來調(diào)整,較簡單的辦法是使用PWM脈寬調(diào)制來調(diào)節(jié)加到電機(jī)兩端的電壓。PWM的工作周期根據(jù)電機(jī)的使用環(huán)境,采用64μS,折算成頻率大約15.625KHz,頻率太低了會產(chǎn)生人耳能明顯感覺到的高頻噪聲,電流也不容易控制;太高了又增加電子開關(guān)的開關(guān)損耗;PWM脈沖的寬度是調(diào)節(jié)加到電機(jī)兩端有效電壓高低的手段,直接影響到電機(jī)的輸出功率,我們可以根據(jù)手柄輸出的電壓決定最終應(yīng)該分配給電機(jī)多高的電壓。
手柄電壓檢測比較簡單,人對速度的感覺很遲鈍,所以手柄的檢測不需要很頻繁,這個AD檢測與電源電壓AD等檢測均不需要很快的速度,所以每隔10mS-50mS輪番檢測一次便足夠,AD的檢測在定時中斷中做,而結(jié)果則放在中斷外做,這樣不會占用中斷太多的時間。
編程提示:
由于現(xiàn)在大多采用線性霍爾作為手柄調(diào)節(jié)速度方案,優(yōu)點是無觸電,故障率極低。缺點是在5V供電的情況下,電壓只能在1.1V-4.3V的范圍內(nèi)變化,因此軟件的處理相對復(fù)雜一點。這只需要我們做一點簡單的運算,或者采用查表的方法,將這期間的AD數(shù)值轉(zhuǎn)換成PWM占空比的值即可。雖然講是無級調(diào)速,實際上分32級時人已經(jīng)感覺不出速度的細(xì)微變化了。但是有一點,根據(jù)手柄得出的PWM脈沖寬度不能直接用來控制PWM占空比,需要在電流允許的情況下才能讓占空比達(dá)到設(shè)定值。
程序中所用關(guān)鍵控制寄存器及其作用:
PR2:決定PWM的工作周期,也就是PWM的調(diào)制頻率,工作中其值不斷地與TMR2中的值相比較,當(dāng)TMR2的值等于PR2時TMR2歸零重新開始另一個周期,由于用到TMR2,所以TMR2的預(yù)分頻器也同樣影響到PWM的工作周期。具體計算公式在數(shù)據(jù)手冊上可以找到,下同。
CCPR1L及CCP1CON的第4,5位:決定PWM的占空比,單片機(jī)在運行時TMR2的值不斷與CCPR1L中的值比較,當(dāng)TMR2=CCPR1L時,PWM輸出腳輸出低電平。當(dāng)CCPR1L中的值大于PR2時,PWM輸出腳持續(xù)輸出高電平。注意:CCP1CON中的第4,5位在這里并非無用,在后面的電流調(diào)節(jié)中可以用來微調(diào)PWM的占空比。
T2CON:決定TMR2的預(yù)分頻器和后分頻器的分頻比,預(yù)分頻器和前面講過的PR2共同決定PWM頻率,后分頻器決定TMR2的中斷周期。
剎車斷電模塊:
電動車在剎車手柄附近裝了一個微動開關(guān),一方面在剎車時點亮剎車燈,一方面給控制器提供一個剎車高或低電平信號,各廠家不一定,在電路上作一些電平轉(zhuǎn)換很容易就可以提供給單片機(jī)一個準(zhǔn)確的信號,我們可以采用數(shù)字測量的方法測量這個電平是高還是低,也可以使用AD去測量有幾伏,總之監(jiān)測到這個信號后必須關(guān)閉所有的驅(qū)動輸出和PWM輸出,這樣就可以實現(xiàn)剎車斷電。編程方面我就不多說了。至于如何實現(xiàn)EBS電子剎車,我們后面在附加功能再講。
4。限流驅(qū)動
這是整個控制器的靈魂,如果限流驅(qū)動沒做好,其他功能再好還是一個字:燒!。
電動車控制器的電子開關(guān)均使用功率MOSFET控制,MOSFET的最大允許電流,最大允許功耗都有其限制,如果沒有電流控制,或者電流控制不好,均會導(dǎo)致功率MOSFET的燒毀,從而導(dǎo)致整個控制器報廢,因此電流控制是本程序的重中之重,這個做不好,其它功能一概免談。
說起來嚴(yán)重,其實做起來,摸到竅門也是很簡單的,其秘訣也只有四個字:準(zhǔn)確,及時
電流信號經(jīng)康銅絲采樣之后分兩路,一路送至放大器,一路送至比較器。具體電路見硬件部分。放大器用來實時放大電流信號,放大倍數(shù)大約6.5倍,放大后的信號提供給單片機(jī)進(jìn)行AD采樣轉(zhuǎn)換,轉(zhuǎn)換所得數(shù)字用來控制電流不超過我們所允許的值。另一路信號送至比較器, 當(dāng)電流突然由于某種原因大大超過允許值,比如一只MOSFET擊穿或誤導(dǎo)通時,比較器翻轉(zhuǎn)送出低電平,觸發(fā)單片機(jī)的INT0外部中斷,使單片機(jī)能夠快速關(guān)斷驅(qū)動,從而保護(hù)MOSFET避免更大傷害。我們這里所要講述的準(zhǔn)確,及時兩個要素,主要是針對放大器放大之后的信號處理過程來表述的。