📄 energy.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 + -