在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 電源與新能源 > 設計應用 > 基于MAXQ3120微控制器的電表(EM)參考設計

            基于MAXQ3120微控制器的電表(EM)參考設計

            作者: 時間:2010-09-21 來源:網絡 收藏



            定制這個程序提供兩種選項。你可以選擇改變disp.Item的賦值,以及改變程序中它們的選擇順序,或者你可以選擇完全替換掉該程序。后一種選擇可能更好。如果為可能顯示的每個條目指定一個獨立位,或為可顯示條目分配一個列表索引,顯然這樣的條目選擇結構更加靈活。選擇上面的結構是因為它需要的RAM空間最小。

            添加寄存器

            DL/T 645規(guī)定了大量寄存器,用于控制運行的各個方面。每個寄存器由一個16位寄存器號指定。在中,增加了很多寄存器來控制運行的各個方面;在代碼中給出了這些寄存器的說明。本討論內容提供了必要的信息,以便通過擴展寄存器映射從中獲取更多信息,或者控制新的電表運行特性。

            寄存器管理器如何工作

            所有任務都不能掛起正常的任務輪操作,寄存器管理器任務要遵循這一原則有很大難度。這是因為寄存器管理器是唯一能夠讀/寫EEPROM的任務,并且EEPROM寫操作需要(相對)較長的時間D幾個毫秒。因為每20ms (60Hz環(huán)境下是16.7ms)就要為DSP程序提供處理器時間,寄存器管理器在EEPROM寫周期過程中,絕不允許將系統(tǒng)掛起幾十毫秒的。

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

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

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

            01: uint8 ReadEEPROM(uint16 Address, uint8 Length, uint8 *pData)
            02: {
            03: int i;
            04: g_MessageBoard.EEPROMOpPending = 1;
            05: for(i=0; ilength; 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標志位被置為高。在第7和10行中,SpinTaskWheel被調用。如果EEPROM標志位為高時調用任務輪,則SpinTaskWheel函數(shù)運行一次,并在不調用寄存器管理器的情況下返回。這樣,即使由于寄存器管理器等候EEPROM完成操作而停止下來,電表的其它部分仍可持續(xù)正常運行。

            哪些任務知曉這些寄存器?

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

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

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

            哪些任務需要寄存器信息?

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



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

            讀寫寄存器

            首先考慮第一種情況,即存儲和讀取無額外功能的讀寫寄存器。為了添加一個存儲于EEPROM內的寄存器,你必須添加兩處信息:RD.h文件和寄存器管理器中的ProcessRegisterNumber程序。

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

            下一步是定義寄存器號。這需要編輯寄存器管理器中定義的RegParmTable結構。這個表包含了電表中定義的每個寄存器,并按編號排序。每個成員包括:

            寄存器號,16位無符號值。

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

            每個單元的長度,以字節(jié)為單位。

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

            BCD_REG,表示寄存器包含的是傳輸前無需進一步轉換的BCD碼數(shù)據;或者MDH_REG,表示寄存器包含的是日期信息(月:日:小時)。

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

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

            一旦表格被更新,新的寄存器可以通過通信通道進行讀寫。電表到底如何處理該信息,是下一部分的主要內容。

            具有額外功能的讀寫寄存器

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

            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;



            評論


            相關推薦

            技術專區(qū)

            關閉