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