隨著中國國家電網(wǎng)公司于2009年年底正式推出了醞釀已久的電表設(shè)計統(tǒng)一招標(biāo)方案之后,整個中國電表行業(yè)掀起了一輪全新的設(shè)計熱潮,以求在最短的時間內(nèi)設(shè)計出完全符合國網(wǎng)新規(guī)約的各種電表。由于此新規(guī)約較以往的設(shè)計相比增加了很多全新的技術(shù)要求,由此給不少廠家?guī)砹嗽O(shè)計方面的諸多挑戰(zhàn)。面對這樣的一個市場需求,飛思卡爾公司結(jié)合自己單片機產(chǎn)品的特點和電表設(shè)計的具體要求,及時推出了一款完全按國網(wǎng)單相多功能表要求設(shè)計的完整解決方案,以方便用戶進行整體性能的綜合評估,并以此為參考來加快自有產(chǎn)品的設(shè)計和開發(fā)。我們在這里就該方案做一些簡要介紹。
系統(tǒng)實現(xiàn)基礎(chǔ)
該方案的核心是飛思卡爾專門針對中國電表市場而推出的系列芯片中最主要的一款8位單片機9S08MZ60,它基于飛思卡爾目前主打的S08內(nèi)核,片內(nèi)有60K的程序空間和2K的RAM空間,外加功能完善的內(nèi)部時鐘模塊;主要的片上外設(shè)包括:64引腳封裝所提供的55個IO端口;2路硬件異步串口;三個16位定時計數(shù)器,總計支持多達10路引腳通道時間控制,其中任意一路均可以通過軟件配置成輸入脈沖沿捕捉、定時比較電平輸出或PWM脈寬調(diào)制;帶總共16路輸入的8位ADC;另外硬件SPI和I2C模塊各一個;還有一個8位的實時計數(shù)器可以在芯片休眠時維持定時計數(shù)并喚醒MCU;內(nèi)部總線最高運行速度達20MHz。片上自帶在線調(diào)試模塊,開發(fā)調(diào)試高效方便。
本設(shè)計方案中充分利用了幾乎所有上述模塊的硬件固有功能,最大限度地簡化外圍設(shè)計,在保證整體設(shè)計功能滿足性能最優(yōu)的同時,降低系統(tǒng)成本。其中:
- MCU工作于內(nèi)部時鐘,摒棄了傳統(tǒng)的片外晶體振蕩,簡化電路,提高可靠性。內(nèi)部時鐘振蕩的精度和穩(wěn)定度通過運行過程中的動態(tài)標(biāo)定來保證。
- 2路硬件串口分別用于485抄表和電力線載波通訊。因這兩路的通訊波特率最高都是9600bps,用硬件串口實現(xiàn)比較容易;
- 16位定時器及其所附的引腳通道實現(xiàn)多種重要功能。首先是產(chǎn)生一個1ms間隔的系統(tǒng)時間節(jié)拍,用于所有軟件任務(wù)的普通定時控制;通道的作用一是實現(xiàn)脈沖輸入捕捉,例如檢測計量芯片輸出的電量脈沖;二是和軟件配合模擬實現(xiàn)相對低速的異步串行通訊,這其中包括紅外抄表通訊,ESAM和IC卡的ISO7816通訊;
- ADC模塊完成兩個重要任務(wù),一是對電池電壓的監(jiān)測,二是交流掉電和交流恢復(fù)供電的狀態(tài)檢測;
- 硬件SPI模塊則用于和前端計量芯片通訊,節(jié)約軟件開銷;
- 8位的實時計數(shù)器在交流掉電后芯片進入低功耗休眠狀態(tài)時維持工作,用來周期性地喚醒MCU,定時檢測并記錄開蓋、按鍵、電池電壓和交流恢復(fù)等狀態(tài);
- 唯一沒有用到的是硬件I2C模塊,本設(shè)計中用芯片的普通IO引腳模擬I2C通訊。這主要是考慮硬件布線的方便,同時因為當(dāng)工作于主模式時,硬件I2C模塊驅(qū)動和純軟件模擬的代碼開銷差不了多少。
當(dāng)然,針對本次特定的國網(wǎng)單相表新規(guī)約設(shè)計,除了MCU外還需其它一些芯片配合實現(xiàn)一些關(guān)鍵功能,其中:
- 計量部分目前設(shè)計采用Cirrus Logic的CS5464實現(xiàn),理論上也支持其它同類的帶SPI接口的計量芯片;
- 實時時鐘則采用業(yè)界流行的RTC8025T;
- EEPROM為24LC512,具體容量可按實際需要選擇;
- 液晶驅(qū)動芯片用的是BU9792。
綜合考慮設(shè)計實現(xiàn)的方便性和靈活性,我們將整個設(shè)計分解成四個獨立的硬件模塊,它們分別是:
- 主板。包含主電源和電池供電系統(tǒng);MCU、實時時鐘、數(shù)據(jù)存儲和ESAM等關(guān)鍵芯片;隔離的485抄表通訊電路;PLC模塊接口;開關(guān)和按鍵輸入等
- 計量板。包含計量電路和斷路控制繼電器。只要改動此計量板,就可以評估不同的計量芯片;
- 顯示板。包含液晶屏及其驅(qū)動電路;電表的狀態(tài)指示LED;紅外抄表接口;
- IC卡讀卡部分。包含IC卡座及其必要的讀卡電路。
主板和其他模塊板之間都通過插針接口互聯(lián)。
電源部分設(shè)計考慮
本設(shè)計采用變壓器降壓供電,次級兩個繞組輸出。一個繞組提供峰值電流1.5A / 12V電源。12V直接提供給PLC模塊;同時經(jīng)7805穩(wěn)壓后一路直接供無需電池備份工作的電路,例如計量芯片,紅外發(fā)射,ESAM等,另一路則通過二極管D2,合并來自二極管D1的電池供電回路,供給MCU,實時時鐘,EEPROM等需電池備份工作的電路。變壓器次級另一個繞組則提供獨立電源給隔離485通訊部分使用。
模擬計量部分和MCU電路是共地的且浮在電網(wǎng)上。這樣做的好處是可以省去計量芯片和MCU之間繁雜的隔離,簡化硬件電路設(shè)計,同時MCU可以用高速SPI和計量芯片進行數(shù)據(jù)通訊,提高了軟件運行效率。但同時也帶來一個安全性的問題,就是在設(shè)計IC卡讀卡模塊時,整個模塊要和MCU部分完全隔離以保證用戶人身安全。當(dāng)然如果所設(shè)計的電表為非IC卡插卡預(yù)付費型,或使用非接觸射頻IC卡,則就無需考慮額外的電路隔離了。
12V電壓通過簡單的電阻分壓電路R8/R9/C10,取樣得到交流掉電檢測信號直接送至MCU的一路AD輸入端。飛思卡爾單片機的ADC模塊都有一個特殊的工作模式,即后臺自動連續(xù)進行AD轉(zhuǎn)換并和事先設(shè)定的閾值做比較,只有超過閾值才產(chǎn)生AD中斷。在此設(shè)計中我們設(shè)定的AD比較閾值對應(yīng)的實際電壓是9V,一旦12V電壓降至9V以下,MCU就立即響應(yīng)AD中斷,保存關(guān)鍵運行數(shù)據(jù)后進入低功耗休眠模式,直到檢測到此電壓恢復(fù)至高于10V以上,系統(tǒng)自行硬件復(fù)位后重新運行。引入電壓檢測回差可以確保交流掉電和供電狀態(tài)的可靠鑒別。
電池供電部分做了些特殊考慮。如果簡單地通過二極管D1進行直流5V和電池3.6V供電切換的話,電池供電時普通硅二極管D1上有約0.4-0.5V的壓降損失。對于標(biāo)稱3.6V的電池來說,0.5V的壓降是相當(dāng)可觀的。在整個電表的使用過程中可能考慮電池電壓降至3V左右系統(tǒng)還要維持工作,這時去掉0.5V壓降后供給MCU的電壓只有2.5V,已經(jīng)不能滿足MZ60最低2.7V供電的基本指標(biāo)。所以在此設(shè)計中額外增加了一個三極管QP1,當(dāng)直流5V消失后,系統(tǒng)在電池供電狀態(tài)下處于低功耗模式,平均功耗僅為幾個微安,QP1通過基極電阻R10得到少許偏置電流就足以使CE極間飽和導(dǎo)通,消除了D1的壓降。當(dāng)直流5V存在時,D1和QP1都被反向偏置,故電池不消耗任何電流。
系統(tǒng)本身需要檢測電池電壓,通過簡單的R1/R2/C5電阻分壓得到電池電壓取樣,也是直接送至單片機的一路AD輸入端。單片機以一定的時間間隔檢測此信號,并換算出實際的電池電壓值。取樣電路的工作過程由單片機的一個引腳控制,檢測間隙期間取樣電阻不消耗任何電流。電池電壓的換算基于ADC模塊內(nèi)部的一個1.2V基準(zhǔn)電壓通道,無論單片機自身的供電電壓如何變化,是直流5V供電還是電池本身供電,都能精確測出電池電壓。
采用這樣的電路設(shè)計實現(xiàn)掉電和電池電壓檢測后,完全省去了傳統(tǒng)設(shè)計所采用的低功耗電壓比較芯片,既簡化了電路,又降低了成本,同時還提升了系統(tǒng)性能和設(shè)計靈活性:因為掉電判斷閾值可以通過軟件自由設(shè)定,電池電壓檢測結(jié)果精細(xì)而直觀。
時鐘芯片選用業(yè)界最常用的RTC8025T,內(nèi)置晶體和溫度補償,使用方便。MCU通過I2C總線對其進行數(shù)據(jù)讀些操作。
在交流供電模式下,軟件配置時鐘芯片輸出標(biāo)準(zhǔn)秒脈沖信號,該信號有兩個作用:一是通過光耦隔離輸出用于外部校時;二是直接送至單片機的一路定時器通道,通過單片機檢測所得的秒脈沖周期,反過來校準(zhǔn)單片機內(nèi)部的時鐘振蕩頻率,這就是所謂的時鐘頻率動態(tài)標(biāo)定。當(dāng)處于電池供電狀態(tài)時,則通過軟件配置關(guān)閉秒脈沖輸出,以節(jié)約功耗。光耦U11實際上對應(yīng)的是一個多功能輸出端子,其他的功能輸出由單片機一個IO引腳控制實現(xiàn),電路上和秒脈沖輸出分享,可通過單片機軟件切換。
數(shù)據(jù)存儲
按規(guī)約要求,國網(wǎng)單相表設(shè)計所需的數(shù)據(jù)存儲大約需32K字節(jié)。實際電路直接采用64K字節(jié)的EEPROM 24LC512,稍留余量。本方案中還預(yù)留了2M字節(jié)SPI接口的串行Flash存儲芯片,需要時可用于其它應(yīng)用評估。串行Flash芯片的讀寫和計量芯片共享同一組SPI總線,不占用單片機額外資源,只需一個獨立的片選信號控制。
液晶顯示電路
液晶顯示為一塊獨立的印板模塊,以插件的方式和主板相連。顯示驅(qū)動芯片選用I2C接口的BU9792,和其它I2C接口芯片共享同一條I2C總線。該芯片支持36x4=144段顯示驅(qū)動,正好滿足國網(wǎng)單相表目前所需的約132段顯示信息。液晶驅(qū)動電路基本按照BU9792的典型應(yīng)用。值得一提的是本設(shè)計中采用的智能對比度控制電路。
當(dāng)交流供電時,MCU輸出一路PWM信號,經(jīng)R44/C23濾波后得到一直流電壓,控制液晶驅(qū)動芯片VLCD引腳電平實現(xiàn)對比度調(diào)整。由于MCU片內(nèi)ADC模塊含有一路1.2V基準(zhǔn)通道,所以任何時候都可以通過對基準(zhǔn)通道做一次AD轉(zhuǎn)換來反推出當(dāng)前實際的芯片供電電壓值,然后就可以調(diào)整PWM輸出占空比使得電源VDD和對比度控制VLCD兩點的壓差始終維持在3V左右,為3V液晶片提供最佳偏壓值。此時R43對應(yīng)的單片機引腳設(shè)置為高阻抗輸入狀態(tài),不參與分壓控制。
當(dāng)處于電池供電狀態(tài)時,MCU基本處于低功耗的休眠狀態(tài),無法維持PWM輸出。在這種情況下,當(dāng)需要液晶顯示時MCU改此PWM引腳為固定低電平輸出,這相當(dāng)于用R44和液晶驅(qū)動芯片內(nèi)置的偏壓分壓電阻進行分壓。電池飽滿時能提供3.6V的電壓,此時R43一端依然設(shè)為高阻抗輸入狀態(tài)而不參與分壓控制,液晶驅(qū)動芯片內(nèi)部三個1M歐電阻和600K歐的R44分壓后,繼續(xù)保持VDD和VLCD兩點間的3V壓差;前面已經(jīng)介紹了在電池供電時我們?nèi)匀豢梢詫崪y出電池電壓值,所以當(dāng)?shù)弥姵仉妷航档偷?.3V后,通過單片機引腳讓100K歐的R43一端也接到0V低電平,從而改變偏壓分壓電路的分壓比,繼續(xù)保持電源和VLCD兩點間接近3V左右的壓差。這樣就保證了在整個電池供電過程中從3.6V到2.8V這個變化區(qū)間內(nèi),液晶顯示對比度基本恒定一致。
采用這種實測供電電壓動態(tài)調(diào)整對比度的方式,電路實現(xiàn)簡單可靠,能自動適應(yīng)寬電壓范圍,大大簡化了生產(chǎn)過程中的調(diào)試流程。
電量計量
國網(wǎng)單相表要求能檢測線路電壓、相線電流和零線電流,故計量芯片必須具備三路模擬信號輸入。本設(shè)計選用了CS5464,因為國內(nèi)電表行業(yè)對它的了解相對比較早,熟悉此芯片的人也比較多。理論上也可以選用任何其它型號的同類的計量芯片。線路電壓直接通過電阻分壓得到,相線電流通過分流片取樣,零線電流則用電流互感器取樣,經(jīng)低通濾波后分別送至CS5464的一路電壓和兩路電流輸入端。
計量芯片和MCU通過SPI口相連進行雙向通訊。對于有功電量信號,配置CS5464直接以脈沖方式輸出,MCU捕捉并累計脈沖;對于電壓、電流和功率等各項參數(shù),計量芯片每做完一次運算周期后就發(fā)出中斷信號,單片機響應(yīng)該中斷,然后通過SPI口直接讀出CS5464內(nèi)部對應(yīng)的寄存器值,軟件乘以事先標(biāo)定的系數(shù),轉(zhuǎn)換成實際對應(yīng)的參數(shù)值后即可用于顯示或控制。MCU通過軟件方式對計量部分所有相關(guān)參數(shù)進行比例校準(zhǔn)和標(biāo)定,實現(xiàn)所需的校表工作。
ESAM和IC卡接口電路
ESAM芯片位于主板之上,和MCU直接連接并通訊。ISO-7816雙向數(shù)據(jù)通訊由MCU的一路定時器通道配合軟件高效模擬實現(xiàn),所需的1-5MHz時鐘也由MCU直接提供。MZ60的一個引腳可以直接輸出分頻后的內(nèi)部系統(tǒng)時鐘,軟件只需事先設(shè)定一個合理的分頻系數(shù),即可控制此時鐘的輸出或禁止。另外ESAM的供電被設(shè)計為程控模式,平時ESAM不工作時可以通過軟件切斷電源,降低系統(tǒng)整體功耗。
IC卡讀寫部分通過主板提供的外擴連接端子來擴展。為了最大限度地實現(xiàn)不同外擴模塊的設(shè)計,接口端子上提供了必要的5V電源,一路軟件模擬的全雙工串行通訊接口,一個1-5MHz的時鐘信號,外加3個普通IO引腳功能。注意:如果是設(shè)計插卡式IC卡讀寫模塊,則該模塊必須要和所有的這些主板端子引腳實現(xiàn)電氣隔離。為了實現(xiàn)這一安全隔離要求,外接模塊可以利用端子提供的5V電源自己產(chǎn)生一組隔離電壓,除高速時鐘外其他的信號則可以用低速光耦隔離,因為高速光耦比較昂貴,所以可以考慮模塊本地自己產(chǎn)生一個時鐘,用于CPU卡的通訊。非接觸式IC卡模塊或外接無線抄表模塊則無需考慮電氣隔離。
RS485抄表接口
按設(shè)計要求,RS485部分完全和其他任何電路實現(xiàn)電氣隔離。電源由變壓器的一個獨立繞組提供,數(shù)據(jù)收發(fā)和方向控制信號則由光耦實現(xiàn)隔離。本電路設(shè)計的通訊速率最高支持19200bps,雖然國網(wǎng)規(guī)約要求的最高速率為9600bps。為了能用低速光耦實現(xiàn)相對高速的數(shù)據(jù)通訊,數(shù)據(jù)接收和發(fā)送時通過三極管電路適當(dāng)增加了光耦的驅(qū)動電流。收發(fā)方向控制信號則無特別的速度要求。通訊線路側(cè)的過壓安全保護采用經(jīng)典的TVS二極管加PTC熱敏電阻的方式實現(xiàn)
紅外抄表接口
紅外發(fā)射調(diào)制直接由單片機的一路定時通道產(chǎn)生38KHz載波,對發(fā)送碼流中的數(shù)據(jù)位0和1進行發(fā)送調(diào)制;紅外接收則用一體化紅外接收頭AT138解調(diào)紅外信號,輸出的是TTL標(biāo)準(zhǔn)串行碼流至MCU的一路定時通道,配合軟件完成串行接收。
本設(shè)計支持紅外通訊的數(shù)據(jù)波特率為1200或2400bps。目前電路設(shè)計暫時沒有考慮電池供電狀態(tài)下的紅外喚醒電表功能,但整個系統(tǒng)在布局上已經(jīng)保留了相關(guān)的控制信號,必要時可以考慮增加實現(xiàn)。
載波通訊接口
按照國網(wǎng)新規(guī)約,對于電力線載波通訊只需在電表固定位置提供標(biāo)準(zhǔn)的插槽接口。載波模塊和MCU以固定的9600bps波特率進行通訊,這通過MCU的一個硬件串口實現(xiàn)。同時MCU還負(fù)責(zé)提供和處理所有相關(guān)的通訊握手信號,這些握手信號都連接至MCU的普通IO引腳。由于載波模塊為獨立的插件,故所有的這些信號連接都考慮了必要的ESD防護,以免插拔時造成ESD損壞。
按鍵和開蓋檢測電路說明:
本參考設(shè)計中提供了兩個按鍵輸入檢測和兩個開蓋信號檢測。在電路實現(xiàn)上是一致的,都是機械開關(guān)的開閉檢測。采用單片機的一個IO引腳控制檢測電路的啟閉,只在需要對開關(guān)進行檢測時才輸出低電平驅(qū)動信號,平時該引腳則保持高電平。這樣在電池供電狀態(tài)下可以防止任意開關(guān)信號長時間處于閉合狀態(tài)而損耗額外的電流。電路中除了上拉電阻外的其它阻容元件則起到ESD保護作用
軟件編程要點
軟件編寫采用模塊化結(jié)構(gòu),除了底層MCU硬件驅(qū)動部分,其它模塊盡量做到和MCU固有資源無關(guān),方便系統(tǒng)移植。
單片機被配置為片內(nèi)時鐘工作模式,系統(tǒng)總線頻率為11MHz。用內(nèi)部時鐘振蕩的好處是無額外成本開銷且工作穩(wěn)定可靠,但相比外部晶體振蕩而言其頻率精度和一致性較差。在沒有做其它特殊校準(zhǔn)的前提下,MZ60內(nèi)部時鐘頻率在全溫度和全電壓范圍內(nèi)的誤差不超過2%,實際上這一指標(biāo)也已經(jīng)滿足電表設(shè)計所需。為了能更好地保證大批量產(chǎn)品長時間工作的一致性和穩(wěn)定性,軟件上利用外部實時時鐘芯片所提供的現(xiàn)成秒脈沖信號對單片機的片內(nèi)時鐘頻率進行動態(tài)微調(diào),通過簡單高效的算法可以保證總線頻率誤差不超過0.5%,進一步提高了任務(wù)定時和串行通訊波特率的精度指標(biāo)。
MZ60單片機內(nèi)部有2K字節(jié)的RAM,對于現(xiàn)在功能復(fù)雜的國網(wǎng)單相表設(shè)計,需要善加規(guī)劃合理利用這些有限的RAM資源。其中RAM開銷最大的是三個通道的自動抄表和ESAM/IC卡讀寫,他們都需要足夠大的緩沖區(qū)來接收和處理一個完整的報文,如果為他們分配各自獨立的靜態(tài)緩沖區(qū),2K字節(jié)的RAM可能比較緊張??紤]到各通道抄表和ESAM/IC卡讀寫幾乎不可能在同一時間段同時發(fā)生,本設(shè)計另辟蹊徑,除了程序模塊必需的全局或靜態(tài)變量和系統(tǒng)堆棧分配,全部剩余的RAM空間被劃分為一個完整的數(shù)據(jù)堆(實際設(shè)計中約為1.3K字節(jié)左右),通過必要的底層驅(qū)動軟件,對這一部分采用內(nèi)存動態(tài)分配和管理,只在任務(wù)實際需要時才申請得到一定長度的內(nèi)存塊,用完即釋放回數(shù)據(jù)堆,以便其它任務(wù)繼續(xù)申請使用。當(dāng)然在任務(wù)軟件編制時必須考慮申請內(nèi)存塊失敗時的處理,雖然這幾乎不可能發(fā)生。
電表在運行時需要同時考慮很多任務(wù)并發(fā)執(zhí)行。在軟件編制時采用事件驅(qū)動,基于分時輪循和狀態(tài)機控制的方式,讓多個任務(wù)同步協(xié)調(diào)運行,確保各任務(wù)間無阻塞。特別編制了相關(guān)的底層驅(qū)動軟件,針對那些偶發(fā)運行的任務(wù),例如抄表,讀卡或電池檢測等,實現(xiàn)了任務(wù)隊列的動態(tài)建立和刪除,避免過多不必要的輪循,集中MCU的處理能力來運行關(guān)鍵任務(wù)。
交流掉電后MCU進入電池備份供電下的低功耗休眠模式。通過內(nèi)部實時計數(shù)器定時喚醒,喚醒時間間隔軟件可編程,在本設(shè)計中為64ms。每次喚醒后進行開關(guān)和交流恢復(fù)檢測,累計間隔5分鐘左右做一次電池電壓檢測。此時整個系統(tǒng)的平均功耗約為7uA。一旦檢測到交流恢復(fù)供電,MCU自身強制發(fā)生一次硬件復(fù)位過程,整個系統(tǒng)在復(fù)位刷新后重新運行。
在本參考設(shè)計中為了調(diào)試改動方便,附帶了一個Boot-loader功能,通過485抄表口可以在線升級軟件。但正式產(chǎn)品中規(guī)定禁止使用Boot-loader。
整個軟件為C語言編寫。
系統(tǒng)升級和移植考慮
飛思卡爾針對單相電表設(shè)計的整個MZ系列產(chǎn)品,從最小的8K/20引腳的RS08MZ8到最大256K/80引腳的51MZ256,很好地覆蓋了從簡單單相表到復(fù)雜單相多功能表甚至三相多功能表的設(shè)計所需。對于此次國網(wǎng)單相表的設(shè)計,初步估計60K程序空間的S08MZ60應(yīng)該基本滿足設(shè)計要求。如果用戶的設(shè)計增加功能需要編寫更多代碼的話,該系統(tǒng)可以在不改變?nèi)魏斡布O(shè)計的前提下,直接換用性能和引腳完全兼容的S08MZ96(96K Flash)或S08MZ128(128K Flash)的芯片。另外,飛思卡爾還可以提供引腳完全兼容的32位內(nèi)核芯片51MZ256(256K Flash)。因此,整個系列的可擴充性和可移植性得到了最大的體現(xiàn)。
結(jié)論
通過上述設(shè)計方案的簡要介紹,充分證明了飛思卡爾的MZ系列單片機能完全滿足國網(wǎng)新規(guī)約要求下的單相電表設(shè)計。飛思卡爾可以提供上述相關(guān)的所有硬件和軟件設(shè)計參考資料,并輔以完善的現(xiàn)場技術(shù)支持,幫助用戶快速完成最終產(chǎn)品的設(shè)計實現(xiàn)。若需了解更多細(xì)節(jié),可以和本文作者進一步聯(lián)系 ([email protected]) 。