當(dāng)前位置:首頁(yè) > 電源 > 數(shù)字電源
[導(dǎo)讀]MAXQ3120電表(EM)參考設(shè)計(jì)構(gòu)建了一款多功能、多費(fèi)率電表,它符合世界范圍的全部可用標(biāo)準(zhǔn)。參考設(shè)計(jì)構(gòu)成了一款能夠適合各地要求和各種性能要求的電表原型。這篇文檔將指導(dǎo)軟件工程師,通過(guò)定制代碼實(shí)現(xiàn)一些特殊的需求

MAXQ3120電表(EM)參考設(shè)計(jì)構(gòu)建了一款多功能、多費(fèi)率電表,它符合世界范圍的全部可用標(biāo)準(zhǔn)。參考設(shè)計(jì)構(gòu)成了一款能夠適合各地要求和各種性能要求的電表原型。這篇文檔將指導(dǎo)軟件工程師,通過(guò)定制代碼實(shí)現(xiàn)一些特殊的需求。

目標(biāo)讀者

本文檔假定讀者熟悉C語(yǔ)言、MAXQ20微控制器架構(gòu)以及匯編語(yǔ)言。讀者也需熟知全電子式電表的基理。

工具

電表參考設(shè)計(jì)采用IAR Embedded Workbench工具進(jìn)行編譯。為便于將軟件移植到其它開(kāi)發(fā)環(huán)境中,除了一種例外情況外,整個(gè)軟件避免了與IAR相關(guān)的語(yǔ)言特性。這種例外情況位于匯編語(yǔ)言文件中,其中包括了一些對(duì)標(biāo)準(zhǔn)匯編偽指令集的特定IAR擴(kuò)展。這些特定IAR擴(kuò)展命令,不僅可告知連接器各不同段的分配情況,而且告知調(diào)試器有關(guān)某些機(jī)器資源的變化情況。在其它開(kāi)發(fā)環(huán)境下構(gòu)建工程,可將這些偽指令去除。

高層硬件描述

硬件的核心器件是MAXQ3120微控制器。MAXQ3120幾乎囊括了實(shí)現(xiàn)多功能、多費(fèi)率電表所需要的所有功能,這些功能包括:雙通道、高精度A/D轉(zhuǎn)換器(ADC),一個(gè)乘法累加器(MAC),通信端口和一個(gè)顯示控制器。完成一個(gè)電表設(shè)計(jì),僅需要少量的外部元件。

在參考設(shè)計(jì)中,提供兩個(gè)通信通道:一路紅外通道,包含一個(gè)可解碼38kHz載波頻率的接收模塊和一個(gè)直接由微控制器驅(qū)動(dòng)的紅外LED,一路完全隔離的RS-485通道;用作非易失存儲(chǔ)器的128kb I2C EEPROM;一個(gè)可視LED和一路隔離光耦通道,用于指示電表脈沖;一個(gè)用于設(shè)置網(wǎng)絡(luò)地址的按鈕;和一個(gè)用于顯示的LCD。

這種硬件構(gòu)成預(yù)示著以下一些應(yīng)用信息。選擇一個(gè)外置I2C EEPROM,意味著系統(tǒng)中必須包含I2C軟件,而不提供硬件I2C主機(jī)。電表脈沖硬件意味著軟件必須能夠產(chǎn)生極為精確的脈沖定時(shí)。兩路通信端口表明,微控制器有限的資源要被兩路通道所共享。

軟件系統(tǒng)綜述

軟件系統(tǒng)必須同時(shí)跟蹤多個(gè)進(jìn)程。首先也是最重要的一點(diǎn),軟件系統(tǒng)必須監(jiān)測(cè)ADC,計(jì)算用電量并報(bào)告其它額外信息,這些信息包括RMS電壓和電流、功率因數(shù)和峰值功率。這個(gè)基本進(jìn)程非常關(guān)鍵,其它任何進(jìn)程都不能干擾這個(gè)最重要的基礎(chǔ)任務(wù)。在持續(xù)監(jiān)視用電量的同時(shí),軟件還必須驅(qū)動(dòng)顯示、監(jiān)視兩路通信端口、監(jiān)視按鈕以及電力線路上的電源失效事件,完成從外部EEPROM獲取信息的請(qǐng)求,并跟蹤費(fèi)率時(shí)段的變化。

任務(wù)管理方式

初始一看,要完成以上多個(gè)實(shí)時(shí)任務(wù),迫切需要某種實(shí)時(shí)操作系統(tǒng)(RTOS)來(lái)進(jìn)行調(diào)度管理和資源分配。但進(jìn)一步分析后,就會(huì)發(fā)現(xiàn)不用傳統(tǒng)RTOS的兩個(gè)充分理由。

首先,要求即時(shí)響應(yīng)ADC中斷。當(dāng)ADC有可用的采樣數(shù)據(jù)時(shí),必須在48μs內(nèi)提取該采樣數(shù)據(jù)。并且,當(dāng)檢測(cè)到一個(gè)過(guò)零點(diǎn)時(shí),電源周期處理程序?yàn)榱嗽谙乱粋€(gè)電源周期之前完成執(zhí)行操作,必須獨(dú)占CPU資源。(電源周期處理程序?qū)⒄加肅PU運(yùn)算能力的25%到30%。) 盡管RTOS可以滿足這些要求,卻不能最有效地利用資源。

其次,用于保存任務(wù)上下文的空間非常有限。大多數(shù)RTOS都要給每個(gè)任務(wù)提供一個(gè)完整的虛擬處理器,以在其中執(zhí)行操作,而這需要保存各個(gè)任務(wù)的上下文。由于僅有256個(gè)16位字RAM可供使用,少量任務(wù)就會(huì)耗盡存儲(chǔ)器空間。

所以,本參考設(shè)計(jì)選擇了一個(gè)簡(jiǎn)單的任務(wù)輪。在這種配置方式下,任務(wù)會(huì)被按順序調(diào)用,而每個(gè)任務(wù)在鎖定事件發(fā)生時(shí),都要釋放CPU的控制權(quán)。鎖定事件是指所有其它任務(wù)都必須等待的事件,它包括:從EEPROM中提取數(shù)據(jù),等待一個(gè)電源周期或是等待通信通道上的字符。如果當(dāng)前任務(wù)需要等待其它任務(wù)完成時(shí)才能結(jié)束自身任務(wù),這時(shí)也會(huì)產(chǎn)生一個(gè)鎖定事件。在任何鎖定事件中,任務(wù)必須存儲(chǔ)它的當(dāng)前狀態(tài)并返回任務(wù)輪。這種協(xié)作式多任務(wù)機(jī)制,使得一個(gè)處理能力相對(duì)低些的控制器就能夠勝任工作。

任務(wù)間的通信是通過(guò)一組公共數(shù)據(jù)結(jié)構(gòu)來(lái)完成的,這些數(shù)據(jù)結(jié)構(gòu)要根據(jù)一套嚴(yán)格的規(guī)則才允許被修改。這些數(shù)據(jù)結(jié)構(gòu)中最重要的部分是消息板,當(dāng)發(fā)生某個(gè)事件時(shí),一個(gè)任務(wù)要設(shè)置消息板中的一組數(shù)據(jù)位以通知另一個(gè)任務(wù)。例如,假設(shè)接收到一個(gè)消息并將其正確譯碼,則消息譯碼器任務(wù)會(huì)告知另一個(gè)需要該消息的任務(wù)(比如寄存器管理器)已經(jīng)收到了消息,并要求第二個(gè)任務(wù)必須執(zhí)行某些操作。

缺省任務(wù)列表

以下是參考設(shè)計(jì)中采用的缺省任務(wù)列表:  

DSP:對(duì)應(yīng)每個(gè)電源周期,這個(gè)程序會(huì)計(jì)算電力線路的所有參數(shù),并累加本電源周期的用電量。  

串口驅(qū)動(dòng)器:檢測(cè)兩路通信通道的狀態(tài),并將第一個(gè)發(fā)出字符的通道置為“活動(dòng)”通道。在消息檢查器任務(wù)確定消息完成或產(chǎn)生超時(shí)之前,通道將始終保持活動(dòng)狀態(tài)。

消息檢查器:驗(yàn)證輸入字符串符合協(xié)議規(guī)范,并在完整接收消息后通知消息譯碼器。  

消息譯碼器:解釋接受到的消息并執(zhí)行相應(yīng)的請(qǐng)求操作。  

異步事件管理器:執(zhí)行那些不是按照時(shí)間表進(jìn)行的事件任務(wù),比如峰值檢測(cè)和電能累計(jì)。  

時(shí)段表管理器:周期性檢查時(shí)鐘,并按照時(shí)段表調(diào)整費(fèi)率寄存器的值。
顯示管理器:根據(jù)時(shí)間和其它事件刷新LCD顯示。  

消息格式器:為消息譯碼器解釋的消息準(zhǔn)備回復(fù)信息。  

消息構(gòu)建器:接收格式化后的消息并加上用于傳輸?shù)南㈩^和消息尾。

寄存器管理器:執(zhí)行讀/寫(xiě)EEPROM操作。  

計(jì)時(shí)管理器:通告按固定時(shí)基啟動(dòng)的任務(wù)。  

負(fù)載曲線記錄器:被請(qǐng)求時(shí),向EEPROM記入用電量,便于將來(lái)報(bào)告這些數(shù)據(jù)。

添加任務(wù)

如電表參考設(shè)計(jì)中所定義,任務(wù)是一段單線程代碼,它執(zhí)行電表要求的某項(xiàng)功能,并快速(通常只有幾毫秒)返回調(diào)用函數(shù)。然而,大多數(shù)任務(wù)都需要比這更長(zhǎng)的時(shí)間才能完成。比如,在任何合理的速率下發(fā)送一個(gè)消息都需要多個(gè)周期。因此,大多數(shù)任務(wù)都需要一個(gè)狀態(tài)變量,以便將其分解為數(shù)個(gè)子任務(wù)。

一旦任務(wù)編寫(xiě)完成,你就可以在spintaskwheel.c文件的任務(wù)列表中加入該調(diào)用。注意,你可以將任務(wù)加在執(zhí)行流程的任何位置,并根據(jù)你的需要多次頻繁調(diào)用它。你將發(fā)現(xiàn),DSP任務(wù)調(diào)用非常頻繁,串口驅(qū)動(dòng)器SerialPortDriver任務(wù)也被調(diào)用了幾次。因?yàn)橐3蛛娔軠y(cè)量的完整性,DSP任務(wù)不允許被擱置數(shù)個(gè)周期,同時(shí)不允許SerialPortDriver任務(wù)錯(cuò)過(guò)輸入字符。

最后,測(cè)試你的代碼。任務(wù)輪循環(huán)時(shí),你的新任務(wù)將伴隨其它任務(wù)被調(diào)用。

全局變量

由于未使用真正意義上的多任務(wù)操作系統(tǒng),也就意味著不會(huì)有編程人員所熟知的、真正意義上的消息傳遞、信號(hào)量或其它機(jī)制。通信是通過(guò)上文提到的消息板以及一組全局變量實(shí)現(xiàn)的,各個(gè)任務(wù)必須按照嚴(yán)格的規(guī)則來(lái)設(shè)置和讀取這些變量信息。這些全局變量列舉如下:  

g_CommSystEMState: 這個(gè)變量包括一組通信通道控制位。具體來(lái)說(shuō),每個(gè)通道包括:一個(gè)active (活動(dòng))位,用于指明某個(gè)特定通道處于活動(dòng)狀態(tài)(從而可丟棄到達(dá)另一個(gè)通道的字符);一個(gè)TBE位,用于使閑置通道做好工作準(zhǔn)備;以及一個(gè)data loss (數(shù)據(jù)丟失)位,當(dāng)閑置通道收到字符而另一通道正忙于通信時(shí),該位被置高。

g_TransmitByte; g_ReceiveByte: 分別保存著下一個(gè)要傳送的字節(jié)和最新接收到的字節(jié)。

g_CommBuffer: 一個(gè)50字節(jié)數(shù)組,包含剛接收到的消息或要發(fā)送的消息。注意系統(tǒng)僅有一個(gè)通信緩存。它不僅被兩個(gè)通信通道所共享,也被發(fā)送和接收通道所共享。

g_MeterAddress: 一個(gè)包含電表網(wǎng)絡(luò)地址的6字節(jié)數(shù)組。初始化時(shí)從EEPROM內(nèi)讀取該信息,并存放在RAM中。

g_MessageFormatterData; g_DispFormatterData; g_ScheduleManagerData; g_AEMData; g_LCLRegData: 這些寄存器在寄存器管理器和各種任務(wù)間傳送數(shù)據(jù)。例如,一個(gè)需要發(fā)送的寄存器內(nèi)容,會(huì)被寄存器管理器放入g_MessageFormatterData中。

g_AEMRegisterNeeded; g_DispFormatterRegRequest; g_RequestScheduleManager; g_LCLRegRequest: 這些寄存器里,包含了特定任務(wù)需要讀或?qū)懙募拇嫫?。注意,消息譯碼器沒(méi)有全局地址寄存器:寄存器管理器可以智能地從消息緩存中找出這個(gè)信息。

g_LCDMode: 包含顯示器的模式字節(jié)。見(jiàn)下面的顯示定制部分。

g_TariffInEffect: 包含當(dāng)前有效的費(fèi)率號(hào)碼。這個(gè)函數(shù)有自己的全局變量,以便每次累計(jì)電能時(shí),無(wú)需通過(guò)多次EEPROM讀操作來(lái)確定將采樣值存在什么位置。[!--empirenews.page--]

g_PW: 包含當(dāng)前有效的各個(gè)通信通道的口令號(hào)碼。

g_irTimer; g_rsTimer: 用于計(jì)數(shù)各個(gè)通道口令有效時(shí)間的定時(shí)器。一旦接收到口令后,它的有效期限是60秒。一個(gè)口令的有效時(shí)間結(jié)束后,g_PW中相關(guān)的4位數(shù)據(jù)就會(huì)被清零。

g_LoadCurveUsage; g_LoadCurvePeak; g_LoadCurveTimeStamp: 與負(fù)載曲線記錄任務(wù)相關(guān)的變量。g_LoadCurveUsage累計(jì)用電量,并會(huì)最終報(bào)告給負(fù)載曲線記錄任務(wù)。負(fù)載曲線記錄任務(wù)會(huì)定
期地將該值寫(xiě)入EEPROM并隨后清除該變量。

g_LoadCurvePeak和g_LoadCurveTimeStamp跟蹤負(fù)載曲線的最大功率值,并記錄峰值功率產(chǎn)生的間隔和時(shí)間。

AEMState: 包含一組與異步事件相關(guān)的變量。當(dāng)接收到一個(gè)設(shè)置電表地址消息時(shí),msg_rx標(biāo)志被置為高。地址設(shè)置邏輯電路被激活后,變量timer包含恢復(fù)正常顯示所需的秒數(shù)。DSPState和Register變量跟蹤寄存器用電量信息從DSP邏輯傳送到用電量報(bào)告函數(shù)的過(guò)程。通常,寄存器變量包括所有用電類型(有功、無(wú)功、正功率和負(fù)功率等)。

g_new_baud: DL/T 645協(xié)議規(guī)范提供了一種只改變單個(gè)消息波特率的機(jī)制。當(dāng)收到波特率變更請(qǐng)求并得到確認(rèn)后,下一個(gè)消息就會(huì)以更高的波特率傳送。隨后,波特率恢復(fù)到正常值(本設(shè)計(jì)中采用1,200bps)。g_new_baud總是保存下一個(gè)消息的波特率。

g_TransmitDelay: 一些RS-485轉(zhuǎn)換器在發(fā)送完最后一個(gè)字符后會(huì)延遲一段固定時(shí)間,隨后切換回接收模式。因此,當(dāng)主機(jī)傳送完一個(gè)請(qǐng)求后,它可能會(huì)丟失電表發(fā)送的前幾個(gè)字符,因?yàn)榕c主機(jī)串口相連的RS-485轉(zhuǎn)換器仍處在發(fā)送模式下。這個(gè)變量保存了發(fā)送狀態(tài)保持的固定延時(shí),延時(shí)結(jié)束后主機(jī)的RS-485轉(zhuǎn)換器切換回接收模式。

current_temp: 如果引用該變量,它將包含從DS3231 RTC/溫度傳感器中讀出的最新數(shù)值。

定制功能

本參考設(shè)計(jì)符合DL/T 645-多功能、瓦時(shí)電表通信協(xié)議。但這篇文檔不僅僅對(duì)通信協(xié)議進(jìn)行說(shuō)明。DL/T 645確實(shí)對(duì)一個(gè)多功能電表需要執(zhí)行的操作進(jìn)行了規(guī)定,包括測(cè)量、時(shí)段管理和報(bào)告功能。因此,如果你要選擇其它電表協(xié)議,你必須替換掉寄存器管理器以及除串口管理器之外的所有消息函數(shù),或者至少對(duì)其進(jìn)行重大修改。修改的細(xì)節(jié)不在本文討論范疇內(nèi)。

本文檔將著重討論三個(gè)定制領(lǐng)域:顯示定制、寄存器映射定制和DSP函數(shù)定制。


顯示定制

顯示器完全由顯示管理器控制。其它任何任務(wù)都不會(huì)向MAXQ3120的LCD寄存器寫(xiě)入數(shù)據(jù)。DisplayFormatter.c模塊包含了顯示管理器及其主要子程序UpdateLCD。

如果你只是想在電表中使用一個(gè)不同的LCD模塊,則只需修改UpdateLCD。所以我們將從這個(gè)模塊的定制開(kāi)始說(shuō)起。如果你想改變顯示信息的類型,你就要修改DisplayManager,并且可能需要給電表的其它部分提供額外的鉤子(hook)函數(shù)。

定制UpdateLCD

UpdateLCD接收兩個(gè)參數(shù):一個(gè)待顯示的32位數(shù)值和一個(gè)8位信號(hào)指示器數(shù)值 。32位顯示值包括8個(gè)4位數(shù)值。因此,UpdateLCD支持8位、7段顯示器。注意,MAXQ3120支持112段顯示,所以可以定制該程序以支持更大規(guī)模的顯示器。 如果想用不同的顯示器,你需要修改LCDFont結(jié)構(gòu)。它被定義為static const類型。這樣定義的結(jié)構(gòu)進(jìn)行編譯和連接后,將駐留在程序空間,而不是數(shù)據(jù)空間。

LCD空間分配表:  

 



這里有個(gè)重要的假設(shè):每個(gè)字符都可填入一個(gè)LCD寄存器。如果所采用的LCD結(jié)構(gòu)中,屬于1位顯示的某些段要占用多個(gè)LCD寄存器,則需要修改整個(gè)UpdateLCD。  

數(shù)字的顯示順序是什么?

程序假設(shè)最右端的顯示數(shù)字,是32位顯示參數(shù)的低四位。這是最自然的順序;如果你將“123456”傳遞給參數(shù),則顯示器會(huì)顯示“123456”。

信號(hào)指示器

如果你想在顯示特定信息的情況下,同時(shí)點(diǎn)亮特定的信號(hào)指示器,則需要另外一個(gè)8位變量來(lái)存儲(chǔ)指示信息。UpdateLCD程序使用一個(gè)switch結(jié)構(gòu),以在顯示數(shù)字之后馬上點(diǎn)亮這些指示器。  

特殊狀態(tài)顯示

在displayformatter.c文件的最后還有一組程序。這些程序控制特殊狀態(tài)顯示,例如電表初始化、EEPROM初始化和程序故障(異常)。它們被直接寫(xiě)入LCD寄存器,而且要針對(duì)不同的顯示進(jìn)行定制。  

定制顯示管理器

除了顯示用電量、時(shí)間和日期以外,如果你還想顯示其它信息,則需要修改顯示管理器。  

顯示管理器的第一部分,處理電表地址設(shè)置信息的顯示。僅當(dāng)?shù)刂吩O(shè)置按鈕被按下時(shí)才起作用,不需要修改這一部分。

顯示管理器的其它部分,通過(guò)全局變量g_LCDMode來(lái)獲取類別。為確定要顯示的下一個(gè)條目,這個(gè)變量在一個(gè)字節(jié)內(nèi)包括了所有必要的信息。它的格式如下所示:  

總會(huì)顯示電表使用過(guò)程中累計(jì)的總用電量,并顯示由g_LCDMode字節(jié)所指定的條目。在本參考設(shè)計(jì)中,這個(gè)變量被固定為1―除了顯示總用電量以外,只顯示時(shí)間和日期。  

控制變量

顯示管理器由狀態(tài)變量disp所控制,該變量有兩個(gè)元素:ItEM和State。由名字可以得知,disp.State存放顯示控制器的當(dāng)前狀態(tài),而disp.Item跟蹤將要顯示的信息,具體含義如下:

 

[!--empirenews.page--]



定制這個(gè)程序提供兩種選項(xiàng)。你可以選擇改變disp.Item的賦值,以及改變程序中它們的選擇順序,或者你可以選擇完全替換掉該程序。后一種選擇可能更好。如果為可能顯示的每個(gè)條目指定一個(gè)獨(dú)立位,或?yàn)榭娠@示條目分配一個(gè)列表索引,顯然這樣的條目選擇結(jié)構(gòu)更加靈活。選擇上面的結(jié)構(gòu)是因?yàn)樗枰腞AM空間最小。

添加寄存器

DL/T 645規(guī)定了大量寄存器,用于控制電表運(yùn)行的各個(gè)方面。每個(gè)寄存器由一個(gè)16位寄存器號(hào)指定。在參考設(shè)計(jì)中,增加了很多寄存器來(lái)控制電表運(yùn)行的各個(gè)方面;在代碼中給出了這些寄存器的說(shuō)明。本討論內(nèi)容提供了必要的信息,以便通過(guò)擴(kuò)展寄存器映射從電表中獲取更多信息,或者控制新的電表運(yùn)行特性。

寄存器管理器如何工作

所有任務(wù)都不能掛起正常的任務(wù)輪操作,寄存器管理器任務(wù)要遵循這一原則有很大難度。這是因?yàn)榧拇嫫鞴芾砥魇俏ㄒ荒軌蜃x/寫(xiě)EEPROM的任務(wù),并且EEPROM寫(xiě)操作需要(相對(duì))較長(zhǎng)的時(shí)間―幾個(gè)毫秒。因?yàn)槊?0ms (60Hz環(huán)境下是16.7ms)就要為DSP程序提供處理器時(shí)間,寄存器管理器在EEPROM寫(xiě)周期過(guò)程中,絕不允許將系統(tǒng)掛起幾十毫秒的。  

要解決EEPROM寫(xiě)入時(shí)間問(wèn)題,一個(gè)顯而易見(jiàn)的方法是將I2C程序置為中斷處理方式。這樣一來(lái),寄存器管理器可以啟動(dòng)一個(gè)EEPROM傳輸過(guò)程,隨即返回主函數(shù)入口main();之后每次被調(diào)用時(shí),寄存器管理器都會(huì)通過(guò)檢查EEPROM子系統(tǒng)的狀態(tài),來(lái)確定任務(wù)是否已經(jīng)完成。采用這種方案帶來(lái)一個(gè)問(wèn)題,ADC周期非常短,以至于ADC中斷服務(wù)程序需要獨(dú)占中斷子系統(tǒng)。因此,必須采取一些其它保障機(jī)制。

解決的方法是采用一個(gè)全局標(biāo)志位:EEPROMOpPending。當(dāng)這個(gè)標(biāo)志位為低時(shí),任務(wù)輪實(shí)質(zhì)上是一個(gè)無(wú)限循環(huán)過(guò)程,反復(fù)調(diào)用系統(tǒng)中的每一個(gè)任務(wù)。當(dāng)標(biāo)志位為高時(shí),任務(wù)輪被調(diào)用時(shí)執(zhí)行一次并返回,并不調(diào)用寄存器管理器。這樣有什么幫助嗎?

當(dāng)寄存器管理器需要執(zhí)行一個(gè)耗時(shí)很長(zhǎng)的功能時(shí),它啟動(dòng)這個(gè)功能并通過(guò)輪詢來(lái)確定其是否完成。在輪詢期間,寄存器管理器將EEPROMOpPending置為高,并遞歸調(diào)用任務(wù)輪。下面的代碼給出了一個(gè)實(shí)際例子:  

01: uint8 ReadEEPROM(uint16 Address, uint8 Length, uint8 *pData)
02: {
03: int i;
04: g_MessageBoard.EEPROMOpPending = 1;
05: for(i=0; i<length; i++)
06: {
07: if(i>0)SpinTaskWheel();
08: eeprom_address = Address++;
09: while(eeprom_read_byte())
10: S
pinTaskWheel();
11: *pData++ = eeprom_data;
12: } // for
13: g_MessageBoard.EEPROMOpPending = 0;
14: return 1;
15: }

在上面的第4行,EEPROMOpPending標(biāo)志位被置為高。在第7和10行中,SpinTaskWheel被調(diào)用。如果EEPROM標(biāo)志位為高時(shí)調(diào)用任務(wù)輪,則SpinTaskWheel函數(shù)運(yùn)行一次,并在不調(diào)用寄存器管理器的情況下返回。這樣,即使由于寄存器管理器等候EEPROM完成操作而停止下來(lái),電表的其它部分仍可持續(xù)正常運(yùn)行。  

哪些任務(wù)知曉這些寄存器?

只有兩個(gè)任務(wù)知道寄存器號(hào):寄存器管理器和消息譯碼器。這些程序中,通常只需要對(duì)寄存器管理器進(jìn)行修改。消息譯碼器識(shí)別出與口令管理和其它監(jiān)控功能有關(guān)的寄存器,并且必須在采用正常處理規(guī)則之前獲取這些信息。因此,要構(gòu)建自己的寄存器,只需要熟悉寄存器管理器。 三類寄存器

通常,有三類寄存器:只讀、讀寫(xiě)和具有額外功能的讀寫(xiě)寄存器。只讀寄存器的一個(gè)例子是B611,RMS Volts、phase A。主機(jī)向這個(gè)寄存器寫(xiě)數(shù)據(jù)是不能執(zhí)行的;實(shí)際上,如果電表收到寫(xiě)數(shù)據(jù)會(huì)將其丟棄。而且,多數(shù)只讀寄存器都不在EEPROM中:通常,在線計(jì)算這些寄存器的結(jié)果,并根據(jù)需要報(bào)告結(jié)果。  

讀寫(xiě)寄存器的一個(gè)例子是C032,Meter Number (電表號(hào))。寫(xiě)入數(shù)值不會(huì)對(duì)電表操作產(chǎn)生任何影響,而且可以隨時(shí)提取該數(shù)據(jù)。最后,一個(gè)具有額外功能的讀寫(xiě)寄存器例子是C030,Meter Constant, active (有效電表常數(shù))。當(dāng)這個(gè)寄存器被寫(xiě)入數(shù)據(jù)時(shí),寄存器管理器不僅要更新EEPROM,同時(shí)也要更新DSP程序使用的電表常數(shù)。

哪些任務(wù)需要寄存器信息?

下表列出了需要寄存器信息的任務(wù)。



通常,你主要考慮添加可通過(guò)消息譯碼器訪問(wèn)的寄存器。你可以增加用于顯示的寄存器(或者用于其它任務(wù)的寄存器,但是依據(jù)慣例,你會(huì)主要考慮那些可通過(guò)通信端口檢索的寄存器)。

讀寫(xiě)寄存器

首先考慮第一種情況,即存儲(chǔ)和讀取無(wú)額外功能的讀寫(xiě)寄存器。為了添加一個(gè)存儲(chǔ)于EEPROM內(nèi)的寄存器,你必須添加兩處信息:MAXQ3120RD.h文件和寄存器管理器中的ProcessRegisterNumber程序。

MAXQ3120RD.h包含一個(gè)由typedef定義的名為EEPROM_DATA的數(shù)據(jù)類型。這個(gè)定義并沒(méi)有被真正實(shí)例化;而僅僅是作為模板,用于定義數(shù)據(jù)如何存入EEPROM。在EEPROM_DATA定義的下面,還定義了兩個(gè)宏,用來(lái)返回兩個(gè)值,分別是結(jié)構(gòu)中某成員的偏移地址和某成員占用的字節(jié)數(shù)。定義新寄存器的第一步,是在結(jié)構(gòu)中添加成員(最好是在尾部),從而為寄存器分配EEPROM存儲(chǔ)空間。  

下一步是定義寄存器號(hào)。這需要編輯寄存器管理器中定義的RegParmTable結(jié)構(gòu)。這個(gè)表包含了電表中定義的每個(gè)寄存器,并按編號(hào)排序。每個(gè)成員包括:  

寄存器號(hào),16位無(wú)符號(hào)值。

物理數(shù)據(jù)單元編號(hào),用于計(jì)算實(shí)際寄存器值。例如,寄存器9110請(qǐng)求當(dāng)月總的正向無(wú)功用電量。它是兩個(gè)電能累加器的和:包括1象限的用電量和4象限的用電量。因此,物理單元的個(gè)數(shù)是二。寄存器管理器必須提取指定單元(CurrentQuadrant1AccumTariff)和下一個(gè)單元(CurrentQuadrant4AccumTariff)的數(shù)據(jù),并求和以獲得所需信息。

每個(gè)單元的長(zhǎng)度,以字節(jié)為單位。

存儲(chǔ)的數(shù)據(jù)類型:INT_REG,表示寄存器包含被視為整數(shù)的二進(jìn)制數(shù)據(jù);

BCD_REG,表示寄存器包含的是傳輸前無(wú)需進(jìn)一步轉(zhuǎn)換的BCD碼數(shù)據(jù);或者M(jìn)DH_REG,表示寄存器包含的是日期信息(月:日:小時(shí))。

EEPROM中數(shù)據(jù)的偏移量(單位為字節(jié)數(shù))。

為了節(jié)約處理時(shí)間,ProcessRegisterNumber程序采用二元搜索算法找出寄存器地址。因此,表格保持排序狀態(tài)是非常重要的。如果寄存器表變得無(wú)序,結(jié)果就無(wú)法預(yù)料了。

一旦表格被更新,新的寄存器可以通過(guò)通信通道進(jìn)行讀寫(xiě)。電表到底如何處理該信息,是下一部分的主要內(nèi)容。

具有額外功能的讀寫(xiě)寄存器

還有一種應(yīng)用情況,即你想讓一個(gè)寫(xiě)事件觸發(fā)額外的功能。為了達(dá)到這種效果,必須讓寄存器管理器向額外任務(wù)發(fā)送一個(gè)消息,或者更新執(zhí)行額外功能所涉及的RAM內(nèi)容。作為樣例說(shuō)明,可在寄存器管理器中搜索C030,你會(huì)找到下面這段代碼:  

switch(Register.Word)
{
case 0xC030: // Meter constant, real
action_value = 0;
for(i=4; i>1; i--)
{
action_value *= 100;
action_value += (g_CommBuffer.Message[ i] & 0xf) +
(g_CommBuffer.Message [ i] >> 4) * 10;
}
set_E_pulse(action_value); // this will set E_pulse
break; [!--empirenews.page--]

這段代碼在EEPROM的寄存器數(shù)據(jù)更新完畢之后運(yùn)行。在這個(gè)條件下,主機(jī)請(qǐng)求改變電表常數(shù)。存儲(chǔ)在EEPROM中的電表常數(shù)寄存器更新過(guò)后,傳輸?shù)酵ㄐ啪彌_器的毫秒數(shù)值被轉(zhuǎn)換成內(nèi)部電表單位,并通過(guò)set_E_pulse函數(shù)發(fā)送給DSP程序。

只讀寄存器

一些只讀寄存器只是簡(jiǎn)單地從EEPROM中讀取數(shù)據(jù)(如用電量),并通過(guò)電表的其它進(jìn)程來(lái)更新其中的數(shù)據(jù)。然而,另外一些只讀寄存器(如RMS電壓)并未存儲(chǔ)在EEPROM內(nèi)。這些寄存器數(shù)據(jù)存儲(chǔ)在EEPROM內(nèi)是沒(méi)有任何意義的,而且如果這樣做并連續(xù)更新數(shù)據(jù),會(huì)迅速損耗EEPROM!你可以在ProcessRegisterNumber中的表格注釋里找到這些寄存器,表述為“not stored in EEPROM”(未存儲(chǔ)在EEPROM內(nèi))。

這些寄存器由寄存器管理器的GetSpecialRegister程序來(lái)控制。對(duì)應(yīng)每個(gè)只讀寄存器,程序都在switch分支選擇語(yǔ)句中提供相應(yīng)的條件。例如:  

case 0xB611:// voltage (phase A)
g_MessageBoard.EEPROMOpPending = 1;
Request_RMS(RMS_VOLTAGE_REQUEST);
SpinTaskWheel();
while(!(DSP_CTRL & 0x20))
SpinTaskWheel();
*value = Get_RMS() / 1000;
g_MessageBoard.EEPROMOpPending = 0;
*size = 2;
break;  

這個(gè)例子闡明了一個(gè)重要事實(shí),即任何任務(wù)都不能掛起任務(wù)輪。case的第一條語(yǔ)句將消息板中的EEPROMOpPending標(biāo)志位置為高。然后它要求DSP函數(shù)計(jì)算RMS電壓值,并在DSP函數(shù)忙時(shí)遞歸調(diào)用任務(wù)輪。當(dāng)EEPROMOpPending標(biāo)志位置為高后,執(zhí)行一次任務(wù)輪循環(huán),并且不調(diào)用寄存器管理器,從而避免了無(wú)限遞歸。一旦DSP函數(shù)完成,將提取RMS值并清除EEPROMOpPending標(biāo)志位。

請(qǐng)注意,對(duì)于這種類型的只讀寄存器,不必在MAXQ3120RD.h文件中添加結(jié)構(gòu)來(lái)保留EEPROM存儲(chǔ)空間。也不必向ProcessRegisterNumber表添加成員。在處理基于EEPROM的寄存器之前,寄存器管理器主程序總要調(diào)用GetSpecialRegister。

定制DSP程序

參考設(shè)計(jì)的DSP程序是一套匯編語(yǔ)言模塊,它負(fù)責(zé)處理從ADC到脈沖生成以及報(bào)告電壓、電流、功率和用電量的整個(gè)信號(hào)流。大部分程序不需要修改,但也許你希望修改以下方面:

采用一個(gè)不同的電流或電壓變換器,從而需要不同的增益因子。

改 變系統(tǒng)生成電表脈沖的方式。

改變前端濾波。

DSP程序是如何工作的,以及你可以安全地改變哪些單元,以下部分從較高的層次對(duì)此進(jìn)行了說(shuō)明。

注意:DSP模塊以預(yù)編譯的目標(biāo)文件形式公開(kāi)發(fā)布。只有在簽署了保密協(xié)議(NDA)的情況下才可以提供匯編語(yǔ)言源代碼。更多信息,請(qǐng)聯(lián)系Dallas SEMiconductor/Maxim。

存儲(chǔ)

DSP程序用到RAM空間的低地址部分。在DSP模塊中搜索“Data Memory Map”,可以看到DSP程序用到的一系列RAM變量。前兩個(gè)字節(jié)是一組控制DSP函數(shù)運(yùn)行的數(shù)據(jù)位。

常數(shù)

可通過(guò)調(diào)整兩個(gè)常數(shù)來(lái)設(shè)置電壓和電流通道的滿量程讀數(shù)。它們分別是W_V_Scale和W_I_Scale。缺省情況下,這兩個(gè)常量被設(shè)置為400V和250A。電壓被設(shè)置為正常條件下不會(huì)超越的電平值(280VRMS以上),而電流設(shè)定值與可能的電表分流值相一致(250μ至500μ,典型值)。

接口程序

用戶程序可以直接使用一些內(nèi)置程序的返回值。如果可能,你應(yīng)該通過(guò)這些內(nèi)置程序與DSP函數(shù)接口,而不是直接與DSP函數(shù)使用的內(nèi)部變量接口。  

Get_and_Clear_Usage: 這是C代碼用來(lái)提取電量累計(jì)值的主程序。通常情況下,需要對(duì)用電量進(jìn)行累計(jì)時(shí),DSP程序會(huì)通知異步事件管理器。然而,隨時(shí)都可以調(diào)用這個(gè)程序以獲取精確的用電量讀數(shù)(截至當(dāng)前)。注意,IAR編譯器會(huì)自動(dòng)傳遞A[0]內(nèi)的函數(shù)參數(shù),并將結(jié)果返回給A[0]。

Get_Frequency: 返回0.1mHz步長(zhǎng)的線路頻率。值得注意的是,這個(gè)子程序缺省情況下并未加載;DL/T 645標(biāo)準(zhǔn)并未要求頻率結(jié)果。

Get_Power_Factor: 返回負(fù)載的功率因子。

Get_Power: 根據(jù)參數(shù)不同,返回?zé)o功或有功功率。

Get_MaxD: 返回自上次調(diào)用該函數(shù)后,電表記錄的最大需量(功率)值。

Request_RMS: 根據(jù)參數(shù)不同,要求DSP計(jì)算RMS電流或電壓值。

Get_RMS: 返回最近一次請(qǐng)求的RMS值。

set_E_pulse: 接受一個(gè)電表常數(shù),并設(shè)置適當(dāng)?shù)腄SP變量以使該電表常數(shù)生效。

中斷服務(wù)程序

參考設(shè)計(jì)只使能了一個(gè)中斷:就是AFE中斷,ADC上有一組新的采樣數(shù)據(jù)時(shí)產(chǎn)生該中斷。因?yàn)锳DC采樣周期為48μs,實(shí)際上中斷服務(wù)程序會(huì)很快地結(jié)束它的工作,并返回到主代碼中―在兩個(gè)中斷之間只有384個(gè)指令周期!

中斷服務(wù)程序執(zhí)行以下功能:  

生成輸出脈沖:如果需要一個(gè)脈沖,則啟動(dòng)它。如果脈沖正在進(jìn)行中,則遞減持續(xù)時(shí)間計(jì)數(shù)器的值,并在計(jì)數(shù)器回零時(shí)終止脈沖。

累加求和:將最近的能量采樣值累加到所有適當(dāng)?shù)?strong>寄存器中。

累計(jì)RMS值:如果被請(qǐng)求,則累計(jì)I2或V2。

檢查電壓下限:如果電壓低于門(mén)限值,則遞增一個(gè)計(jì)數(shù)器值。

過(guò)零檢測(cè):如果電壓信號(hào)正向過(guò)零,則設(shè)置一個(gè)標(biāo)志位。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉