基于MAXQ3120微控制器的電表(EM)參考設(shè)計(jì)
這段代碼在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é)束它的工作,并返回到主代碼中D在兩個(gè)中斷之間只有384個(gè)指令周期!
中斷服務(wù)程序執(zhí)行以下功能:
生成輸出脈沖:如果需要一個(gè)脈沖,則啟動(dòng)它。如果脈沖正在進(jìn)行中,則遞減持續(xù)時(shí)間計(jì)數(shù)器的值,并在計(jì)數(shù)器回零時(shí)終止脈沖。
累加求和:將最近的能量采樣值累加到所有適當(dāng)?shù)募拇嫫髦小?br />
累計(jì)RMS值:如果被請(qǐng)求,則累計(jì)I2或V2。
檢查電壓下限:如果電壓低于門限值,則遞增一個(gè)計(jì)數(shù)器值。
過(guò)零檢測(cè):如果電壓信號(hào)正向過(guò)零,則設(shè)置一個(gè)標(biāo)志位。本文引用地址:http://m.butianyuan.cn/article/180459.htm
評(píng)論