⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 energy.c

📁 一个电表的程序
💻 C
字号:
#ifndef _ENERGY_C_
#define _ENERGY_C_
#include "includes.h"
#define KWH_CONST 3200
#define EE_DATA_START       0x00
#define EE_SETTING_START    0x10
#define EE_CAL_START        0x20

__idata EEDATA        EEData;
__idata unsigned int Irms;
__idata unsigned int Vrms;
__idata unsigned int ActivePower;
__idata unsigned int ReactivePower;
__idata unsigned int ApparentPower;
__idata unsigned int PowerFactor;
__idata unsigned int Frequency;
__idata unsigned int Temperature;
__idata unsigned char VGain;
__idata unsigned char IGain;


unsigned char  __idata KvarPwrT[4];	      //当前有功总电量(+A)	(小数一字节,整数三字节**.******)


unsigned char  __idata KWhPwrT[4];	      //当前有功总电量(+A)	(小数一字节,整数三字节**.******)
unsigned char  __idata KWhPwrF1[4];			//当前有功电量费率1
unsigned char  __idata KWhPwrF2[4];			//当前有功电量费率2
unsigned char  __idata KWhPwrF3[4];			//当前有功电量费率3
unsigned char  __idata KWhPwrF4[4];			//当前有功电量费率4


unsigned char  PstvKWhPwrT[4];	   //当前正向有功总电量(+A)	(小数一字节,整数三字节**.******)
unsigned char  PstvKWhPwrF1[4];		//当前正向有功电量费率1
unsigned char  PstvKWhPwrF2[4];		//当前正向有功电量费率2
unsigned char  PstvKWhPwrF3[4];		//当前正向有功电量费率3
unsigned char  PstvKWhPwrF4[4];		//当前正向有功电量费率4

unsigned char  NgtvKWhPwrT[4];	   //当前反向有功总电量(-A)	(小数一字节,整数三字节**.******)
unsigned char  NgtvKWhPwrF1[4];		//当前反向有功电量费率1
unsigned char  NgtvKWhPwrF2[4];		//当前反向有功电量费率2
unsigned char  NgtvKWhPwrF3[4];		//当前反向有功电量费率3
unsigned char  NgtvKWhPwrF4[4];		//当前反向有功电量费率4



void SomeNops(void)
{
    unsigned int i = 2;
    while(i--);
}
void EnergyReload(void)
{

}
void EnergySave(void)
{

}

void EnergyInit(void)
{

    //Config the mode registers
    SetEnergyReg1(MODE2,    (ZXRMS|CF1_WATT|CF2_VAR));
    SetEnergyReg1(MODE1,    0x00);
    SetEnergyReg1(CALMODE,  SEL_ICH_A);
    SetEnergyReg1(NLMODE,   (VANOLOAD_OFF|VARNOLOAD_OFF|APNOLOAD_OFF));
    SetEnergyReg1(GAIN,     (PGA2_X1|PGA1_X16));
    SetEnergyReg1(ACCMODE,  (ABSVARM | ABSAM));
    SetEnergyReg1(LINCYC,   0x64);
    SetEnergyReg2(CF2DEN,   0x01,       0x00);
    SetEnergyReg2(CF1DEN,   0x01,       0x00);

    //Reload the calibration data
    //todo: verify the calibration data before setting to registers
    //Config the interrupts
    MIRQSTH = 0;
    MIRQSTM = 0;
    MIRQSTL = 0;
    MIRQENL = 0;
    MIRQENM = IE_CF2|IE_CF1;
    MIRQENH = IE_CYCEND;
    IEIP2_bit.EADE = 1;
}

void MeasureAll(void)
{
    unsigned long temp32;
    static ADE_REGS temp;

    GetEnergySFR(VRMS,temp.bytes.DataL,temp.bytes.DataM,temp.bytes.DataH);
    temp32 = 0; //temp32 must be cleared before being used again
    temp32 = temp.wordH.high;
    Vrms = (unsigned int)((temp32 * (1007 + VGain))>>11);

    GetEnergySFR(IRMS,temp.bytes.DataL,temp.bytes.DataM,temp.bytes.DataH);
    temp32 = 0; //temp32 must be cleared before being used again
    temp32 = temp.all>>4;
    //Irms = (unsigned int)(temp32 * (9582 + IGain) >> 11);//for ct
    Irms = (unsigned int)(temp32 * (16232 + IGain) >> 15);//for shunt

    GetEnergyReg(LWATTHR,temp.bytes.DataL,temp.bytes.DataM,temp.bytes.DataH);
    temp32 = 0;
    temp32 = temp.all;
    ActivePower = (unsigned int)((temp32*1860)>>11);

    GetEnergyReg(LVARHR,temp.bytes.DataL,temp.bytes.DataM,temp.bytes.DataH);
    temp32 = 0;
    temp32 = temp.all;
    //ReactivePower = (unsigned int)((temp32*1860)>>11);

    GetEnergyReg(PER_FREQ,temp.bytes.DataL,temp.bytes.DataM,temp.bytes.DataH);
    //Frequency = 40983607l/temp.wordL.low;
    if((Frequency > 6500)||(Frequency < 4000))Frequency = 0;
}
#pragma vector = 0x4b
__interrupt void ADE_ISR(void)
{
    //temp    = MIRQSTL;
    if(MIRQSTM & IF_CF1)
    {
        //todo: Count CF1 for Active Energy
        MIRQSTM &= ~IF_CF1;
        CF1Counter++;
   //     P_LED ^= 1;
        if(CF1Counter >= (KWH_CONST/100))
        {
            CF1Counter -= (KWH_CONST/100);
         //   ActiveEnergy = BCD32Inc(ActiveEnergy);
            //todo: set flag to save energy to eeprom
        }
    }
    if(MIRQSTM & IF_CF2)
    {
        //todo: Count CF2 for Reactive Energy
        MIRQSTM &= ~IF_CF2;
        CF2Counter++;
        G_LED ^= 1;
        if(CF2Counter >= (KWH_CONST/100))
        {
            CF2Counter -= (KWH_CONST/100);
            //ReactiveEnergy = BCD32Inc(ReactiveEnergy);
            //todo: set flag to save energy to eeprom
        }
    }
    if(MIRQSTH & IF_CYCEND)
    {
        //todo: Set Linecyc End Flag
       //lagTask_bit.FlagMeasure   = 1;
    }
    MIRQSTH = 0;
    MIRQSTM = 0;
    MIRQSTL = 0;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -