<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 電源與新能源 > 設計應用 > 電表在不同供電模式下的安全過渡

          電表在不同供電模式下的安全過渡

          作者: 時間:2012-05-14 來源:網(wǎng)絡 收藏

           摘要:本文介紹了兩個固件,用作Teridian? 71M6521IC的演示程序,版本號為4.8p.這些固件有助于改善71M6521在功率之間轉換時的可靠性,并在器件恢復工作后提供適當?shù)膶崟r時鐘(RTC)修正。文章討論了程序修改及設計細節(jié),便于用戶對現(xiàn)有固件進行必要的更新。

          本文引用地址:http://www.ex-cimer.com/article/177261.htm

          概述

          微調保險絲

          微調保險絲實際上指的是一組非易失(NV)存儲器,在Maxim的TeridianIC生產(chǎn)過程中用于調整IC的模擬和數(shù)字特征參數(shù)。器件出廠后,微調保險絲內存儲的內容不再改變,用于后續(xù)產(chǎn)品中的參數(shù)補償,例如,用來微調VREF電壓,使其穩(wěn)定在1.195 VDC ,誤差不超過±1mV;還可用于調整VBIAS內部電壓,使其穩(wěn)定在目標值。

          IC工作期間,按照固定的時間間隔讀取微調保險絲的數(shù)值,由IC內部的硬件電路進行適當?shù)膮?shù)調整。從保險絲讀取的數(shù)據(jù)送入硬件控制電路和位于I/O RAM的保險絲寄存器(圖1)。71M6521系列產(chǎn)品中共包含7個獨立的微調保險絲數(shù)值,向I/O RAM寄存器0x20FD (TRIMSEL)寫入1-7之間的任何數(shù)值,可從I/O RAM寄存器0x20FF (TRIM)中讀取相應的保險絲數(shù)據(jù)。

          20124109343832.gif

          圖1. 微調保險絲工作原理

          錯誤讀取微調保險絲

          71M6521 IC支持三種低功耗(休眠模式、LCD單獨有效模式以及關斷模式)。低功耗模式下,無法支持IC正常工作的電流消耗。

          在極端的電磁干擾(EMI)環(huán)境下,或者是當電源超乎尋常地反復斷電的情況下,可能會影響到保險絲數(shù)據(jù)的讀取和參數(shù)調整,錯誤地讀取到某個保險絲數(shù)據(jù)。發(fā)生這種情況時,可能導致幾種錯誤結果。當電源發(fā)生高速振蕩,使得71M6521在工作模式與關斷模式之間反復切換時,將會提高器件故障的概率,當交流電緩慢爬升、下降,而后續(xù)使用的是軟電源時,很容易發(fā)生這種狀況。電源振蕩導致71M6521在正常(正常工作模式)和低功耗(關斷)模式之間頻繁切換,由于保險絲讀取錯誤導致器件故障的可能性非常小,只有當在長達若干天,甚至幾個星期的時間內頻繁斷電時,才有可能看到故障狀況。

          保險絲讀取錯誤導致IC工作故障可能有幾種的表現(xiàn)形式,具體取決于錯誤讀取的保險絲數(shù)據(jù)。故障現(xiàn)象可能是以下幾種情況之一:

          MPU軟件運行在未知狀態(tài),但依據(jù)固件的,有些情況下可能終止內部時鐘,使看門狗定時器無法復位電表。

          產(chǎn)生未知的內部電源電壓和檢測門限,這種情況下可能導致外部電源作用到V1引腳,在喚醒時鐘尚未建立的前提下進入休眠模式。有些情況下,不恰當?shù)爻跏蓟瘍炔侩娫催_到一個超時限制時,可能導致RTC計時錯誤。

          在電表中從根本上消除EMI可能不太現(xiàn)實,但是,在器件進入關斷模式時通過測試IC的微調保險絲,固件可以檢測并避免發(fā)生上述故障。

          新版本演示程序解決的另一問題是RTC時間偏移的修正。早期軟件中所包含的RTC程序集成了長期抖動導致RTC偏差的修正,復位后進行調整。

          改進程序的應用示例

          本應用筆記介紹的程序支持所有版本的71M6521,包括71M6521BE、71M6521DE和71M6521FE.Maxim推薦在帶有備份電池的新設計中采用固件修正。

          功率模式切換期間可能產(chǎn)生的失效

          71M6521中的微調保險絲由控制邏輯保證,重復上電或極端EMI可能影響微調保險絲的數(shù)據(jù)讀取。失效原因包括:

          電表頻繁斷電或出現(xiàn)極端EMI.

          電表從工作狀態(tài)進入關斷模式,新的鋰電池的情況下,錯誤地讀取微調保險絲的數(shù)據(jù)。電池電壓(典型值為3.6 VDC)與71M6521正常工作時的電壓(典型值為3.3 VDC),導致失效。

          配備電池的電表似乎更容易受到影響,因為不帶電池的電表在主電源斷電并再次上電后,能夠經(jīng)歷一次干凈的復位(POR)過程。

          模式轉換期間,可能引發(fā)上文提及的失效現(xiàn)象,但很難準確定位具體故障,因為這取決于諸多因素:斷電或EMI、電表固件、電池選擇、電源設計等,這些都會影響到微調保險絲的讀取錯誤。大多數(shù)電表即使在極端測試條件下,也不會發(fā)生故障。

          當電表返回正常工作模式時,電源能夠支持更大的工作電流,即可提供微調自校準數(shù)據(jù)。但可能需要重新恢復電表的工作狀態(tài)。

          RTC失效事件

          RTC程序用于補償電表在低功耗模式下產(chǎn)生的時間偏差,但并非在啟動時同步調整,而會累計抖動產(chǎn)生的漂移。

          4.8p演示程序

          程序測試

          實際測試時為演示板配備了新電池,配置顯示默認值(顯示RTC的時鐘)。然后,在8周內每隔10秒重復一次交流電的斷電/上電。簡單地把電源穩(wěn)定在標稱交流電壓,然后開始測試。好的設計應該能夠正確地恢復系統(tǒng)工作,合理顯示時間信息。程序經(jīng)過8周測試后沒有出現(xiàn)失效。

          軟件的影響

          4.8p演示程序能夠在運行main()之前出發(fā)PLL_OK中斷,保證在固件初始化期間能夠檢測到掉電故障并進行相應的處理。必須謹慎管理其它中斷操作,以避免出現(xiàn)嚴重的故障現(xiàn)象。

          任何情況下,4.8p演示軟件都可以在喚醒定時器中保持一個非零數(shù)值。正常工作時,喚醒定時器不會計數(shù)或觸發(fā)喚醒過程,除非IC意外進入休眠或僅顯示LCD模式。發(fā)生這種事件時,將觸發(fā)喚醒定時器工作,喚醒電表并從故障狀態(tài)下恢復電表工作。

          程序存儲位置

          目標代碼應該把修正程序放置在閃存的前8KB.Keil? IDE中,可以在項目平臺更改目標程序,選擇點擊鼠標右鍵>optionsBL_51 Locate TabCode Space.演示程序中,該指令置于存儲器盡可能低的位置:

          C_C51STARTUP,?PR?_?PLL_ISR?BATMODES_20,?PR?_?BATMODE_CHANGE?BATMODES_20, rest of the link commands for code space>

          C_C51STARTUP包含演示程序的啟動代碼。

          PR?_?PLL_ISR?BATMODES_20SAFE,?PR?_?BATMODE_CHANGE?BATMODES_20SAFE執(zhí)行PLL_OK中斷例程時需要。

          PLL_OK中斷

          以下程序應該置于PLL_OK中斷例程,檢測到關斷模式時運行。4.8p mainbatmodes_20.c中給出了經(jīng)過測試的程序代碼。

          extern void trim_Test(void) small reentrant;

          EA = 0;

          CONFIG0 = 0; // Make sure we are running as fast as we can.

          IFLAGS = (~IE_PLLFALL_) (~IE_PLLRISE_); // force an edge to occur

          WAKE = 0x81; // force a wake timer wake if sleep is forced

          trim_test(); // From start-up code.
          啟動程序

          以下啟動程序用來替代startup.a51,Maxim提供經(jīng)過測試的軟件代碼(4.8p演示軟件中,啟動程序位于utilstartup_n_safe.a51),以下列出了程序代碼。

          第一次在工廠運行程序時,微調寄存器的內容被復制到閃存內。之后,對微調寄存器進行測試。一旦測試中發(fā)生失效,程序將簡單地把IC置于休眠模式,然后重新讀取微調數(shù)據(jù)。喚醒器件操作后,IC會自動讀取微調保險絲內的數(shù)值。復位期間調用保險絲測試程序,將重新讀取微調保險絲的數(shù)據(jù)并進行修正。

          ;/***************************************************************************
          ; * This code and information is provided as is without warranty of any *
          ; * kind, either expressed or implied, including but not limited to the *
          ; * implied warranties of merchantability and/or fitness for a particular *
          ; * purpose. *
          ; * *
          ; * Copyright (C) 2011 Maxim Integrated Products, Inc. All Rights Reserved. *
          ; ***************************************************************************/
          ;//**************************************************************************
          ;//
          ;// DESCRIPTION: 71M652x POWER METER - STARTUP Code.
          ;//
          ;//**************************************************************************
          ;//
          ;// File: STARTUP_N_SAFE.A51.
          ;//
          $NOMOD51
          ;------------------------------------------------------------------------------
          ; This file is part of the C51 Compiler package
          ; Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
          ;------------------------------------------------------------------------------
          ; STARTUP.A51: This code is executed after processor reset.
          ;
          ; To translate this file use A51 with the following invocation:
          ;
          ; A51 STARTUP_N_SAFE.A51
          ;
          ; To link the modified STARTUP_N_SAFE.OBJ file to your application use the following
          ; BL51 invocation:
          ;
          ; BL51 your object file list>, STARTUP_N_SAFE.OBJ controls>
          ;
          ;------------------------------------------------------------------------------
          ;
          ; User-defined Power-On Initialization of Memory
          ; With the following EQU statements the initialization of memory
          ; at processor reset can be defined:
          ;
          ; ; the absolute start-address of IDATA memory is always 0
          IDATALEN EQU 100H ; the length of IDATA memory in bytes.
          ;
          XDATASTART EQU 0H ; the absolute start-address of XDATA memory
          XDATALEN EQU 000H ; the length of XDATA memory in bytes.
          ;
          PDATASTART EQU 0H ; the absolute start-address of PDATA memory
          PDATALEN EQU 0H ; the length of PDATA memory in bytes.
          ;
          ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the
          ; 8051 CPU. At minimum the memory space occupied from the C51
          ; run-time routines must be set to zero.
          ;------------------------------------------------------------------------------
          ;
          ; Reentrant Stack Initialization
          ;
          ; The following EQU statements define the stack pointer for reentrant
          ; functions and initialized it:
          ;
          ; Stack Space for reentrant functions in the SMALL model.
          IBPSTACK EQU 1 ; set to 1 if small reentrant is used.
          IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1.
          ;
          ; Stack Space for reentrant functions in the LARGE Model.
          XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
          XBPSTACKTOP EQU 07FFH+1; set top of stack to highest location+1.
          ;
          ; Stack Space for reentrant functions in the COMPACT model.
          PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
          PBPSTACKTOP EQU 07FFH+1; set top of stack to highest location+1.
          ;
          ;------------------------------------------------------------------------------
          ; Page Definition for Using the Compact Model with 64 KByte xdata RAM
          ;
          ; The following EQU statements define the xdata page used for pdata
          ; variables. The EQU PPAGE must conform with the PPAGE control used
          ; in the linker invocation.
          ;
          PPAGEENABLE EQU 1 ; set to 1 if pdata object are used.
          ;
          PPAGE EQU 7 ; define PPAGE number.
          PUBLIC PPAGE_SFR
          PPAGE_SFR DATA 0BFH ; SFR that supplies uppermost address byte
          ; (most 8051 variants use P2 as uppermost address byte)
          ;------------------------------------------------------------------------------

          ; Switch to M6520 when chip is available.

          ; Standard SFR Symbols
          ACC DATA 0E0H
          B DATA 0F0H
          SP DATA 81H
          DPL DATA 82H
          DPH DATA 83H
          USER1 DATA 90H
          DIR1 DATA 91H
          FCTRL DATA 0B2H
          IPH DATA 0B9H
          IPL DATA 0A9H
          IRCON DATA 0C0H
          IEN0 DATA 0A8H
          IEN1 DATA 0B8H

          NAME ?C_STARTUP

          ?C_C51STARTUP SEGMENT CODE
          ?STACK SEGMENT IDATA

          RSEG ?STACK
          DS 1

          EXTRN CODE (?C_START)
          PUBLIC ?C_STARTUP
          PUBLIC _?TRIM_TEST

          CSEG AT 0
          ?C_STARTUP: LJMP STARTUP1
          RSEG ?C_C51STARTUP
          STARTUP1:
          CLR IEN0^7 ; Disable interrupts
          ; To enable secure mode, remove the semicolon of the next line
          ; ORL FCTRL,#40H ; set secure bit
          MOV 0E8h,#0FFh ; Refresh nonmaskable watchdog.

          ; Set system interrupt priorities; more frequent are higher priority.
          MOV IPH,#01DH ; From code in options_gbl.h, main.c
          MOV IPL,#00AH ; From code in options_gbl.h
          ; Clear PLL_OK interrupt (bit3), and others
          MOV IRCON,#0
          ; Enable PLL_OK interrupt
          MOV DPTR,#2007H ; Set EX_PLL
          MOV A,#20H
          MOVX @DPTR,A
          ; Enable interrupts
          MOV IEN1,#08H ; Enable INT4, the PLL_OK interrupt
          MOV IEN0,#80H ; Enable all interrupts

          ACALL _?TRIM_TEST ; Test 6521's trims

          IF IDATALEN > 0
          MOV R0,#IDATALEN - 1
          CLR A
          IDATALOOP: MOV @R0,A
          DJNZ R0,IDATALOOP
          ENDIF

          IF XDATALEN > 0
          MOV DPTR,#XDATASTART
          MOV R7,#LOW (XDATALEN)
          IF (LOW (XDATALEN)) > 0
          MOV R6,#(HIGH (XDATALEN)) +1
          ELSE
          MOV R6,#HIGH (XDATALEN)
          ENDIF
          CLR A
          XDATALOOP: MOVX @DPTR,A
          INC DPTR
          DJNZ R7,XDATALOOP
          DJNZ R6,XDATALOOP
          ENDIF

          IF PPAGEENABLE > 0
          MOV PPAGE_SFR,#PPAGE
          ENDIF

          IF PDATALEN > 0
          MOV R0,#LOW (PDATASTART)
          MOV R7,#LOW (PDATALEN)
          CLR A
          PDATALOOP: MOVX @R0,A
          INC R0
          DJNZ R7,PDATALOOP
          ENDIF

          IF IBPSTACK > 0
          EXTRN DATA (?C_IBP)
          MOV ?C_IBP,#LOW IBPSTACKTOP
          ENDIF

          IF XBPSTACK > 0
          EXTRN DATA (?C_XBP)
          MOV ?C_XBP,#HIGH XBPSTACKTOP
          MOV ?C_XBP+1,#LOW XBPSTACKTOP
          ENDIF

          IF PBPSTACK > 0
          EXTRN DATA (?C_PBP)
          MOV ?C_PBP,#LOW PBPSTACKTOP
          ENDIF

          MOV SP,#?STACK-1
          LJMP ?C_START

          ; Read a trim whose index is in A. Return the trim in A.
          CSEG AT 100H
          FUSE_TABLE:
          DB 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff

          ; Trim test. Prefix _? tells Keil C it's reentrant.
          _?TRIM_TEST:
          PUSH IEN0
          PUSH PSW ; Save registers, so it's reentrant.
          MOV PSW,00H ; Select registers before saving them
          PUSH DPL
          PUSH DPH
          PUSH ACC
          MOV A,R7 ; Save R7 from the current register set.
          PUSH ACC
          MOV A,R6 ; Save R6 from the current register set.
          PUSH ACC

          CLR IEN0.7

          ; Wait for all fuses to be read once before checking fuses
          ; Complete fuse read takes 45 xtal clock cycles (1 fuse per xtal clock)
          MOV R7,#21 ; Wait 21x4 = 48 cycles
          loop_inner: DJNZ R7,loop_inner ; 4 cycles (in brownout, 1 cycle/clk)

          mov DPH, #HIGH(FUSE_TABLE)

          fuse_test_frst: ; check if values previously stored
          mov DPL,#LOW(FUSE_TABLE)
          clr a
          movc a,@a+dptr ; read fuse table
          xrl a,#55H
          jnz fuse_save

          MOV DPTR,#2003H ; Check if in brownout mode
          MOVX A,@DPTR
          JB ACC.6,PASS ; Mission mode, so don't check.
          fuse_test:
          mov r7,#8 ; byte counter
          fuse_test_lp1:
          mov DPTR,#FUSE_TABLE ; load pointer to fuse table
          mov a,r7
          movc a,@a+dptr ; read fuse table
          mov r6,a

          mov a,r7

          MOV DPTR,#20FDH ; TRIMSEL address
          MOVX @DPTR,A ; load reg to read trim
          MOV DPL,#0FFH ; TRIM value address

          MOVX A,@DPTR ; Get trim value

          cjne a,06H,FAIL ; test if flash read and trim ==
          djnz r7,fuse_test_lp1

          JMP PASS
          fuse_save:
          MOV DPTR,#2003H ; Check if in brownout mode
          MOVX A,@DPTR
          ; If brownout mode, don't save them and enter sleep.
          JNB ACC.6,FAIL

          ; mov 84H,#LOW(FUSE_TABLE)
          mov r7,#8 ; byte counter
          fuse_save_lp1:
          mov a,r7

          MOV DPTR,#20FDH ; TRIMSEL address
          MOVX @DPTR,A ; load reg to read trim
          MOV DPL,#0FFH ; TRIM value address

          MOVX A,@DPTR ; Get trim value
          mov r6,a

          mov a,r7
          mov dptr,#FUSE_TABLE
          add a,DPL
          mov DPL,a
          mov a,r6

          orl 0B2H,#01H ; set to flash write
          movx @dptr,a ; write fuse table byte
          djnz r7,fuse_save_lp1

          mov a,#55H ; control byte to mark

          mov dptr,#FUSE_TABLE
          orl 0B2H,#01H ; set to flash write
          movx @dptr,a ; write fuse table byte

          jmp PASS

          FAIL:
          MOV DPTR,#20A9H ; WAKE address
          MOV A,#0C1H ; SLEEP forces wake and fuse re-read
          MOVX @DPTR,A

          PASS: CLR A ; Select 0
          MOV DPTR,#20FDH ; TRIMSEL address
          MOVX @DPTR,A ; clear trim select register.

          POP ACC
          MOV R6,A ; Restore R7 in this register set
          POP ACC
          MOV R7,A ; Restore R7 in this register set
          POP ACC
          POP DPH
          POP DPL
          POP PSW ; Restore registers, so it's reentrant.
          POP IEN0
          RET

          END
            RTC例程

            復位后,軟件不應該馬上調節(jié)時鐘修正休眠模式下時差,而是首先計算需要消除的時間偏差,然會設置時鐘進行補償。



          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();