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