You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
esp32-tm-code/lib/ATM90E36/ATM90E36.h

318 lines
12 KiB

#ifndef ATM90E36_h
#define ATM90E36_h
#include <Arduino.h>
#include <SPI.h>
#define WRITE 0 // WRITE SPI
#define READ 1 // READ SPI
#define DEBUG_SERIAL 1
/* STATUS REGISTERS */
#define SoftReset 0x00 // Software Reset
#define SysStatus0 0x01 // System Status0
#define SysStatus1 0x02 // System Status1
#define FuncEn0 0x03 // Function Enable0
#define FuncEn1 0x04 // Function Enable1
#define ZXConfig 0x07 // Zero-Crossing Config
#define SagTh 0x08 // Voltage Sag Th
#define PhaseLossTh 0x09 // Voltage Phase Losing Th
#define INWarnTh0 0x0A // N Current Line Th
#define INWarnTh1 0x0B // Voltage ADC Th
#define THDNUTh 0x0C // Voltage THD Th
#define THDNITh 0x0D // Current THD Th
#define DMACtrl 0x0E // DMA Int. Control
#define LastSPIData 0x0F // Last Read/Write SPI Value
/* LOW POWER MODE REGISTERS - NOT USED */
#define DetectCtrl 0x10
#define DetectTh1 0x11
#define DetectTh2 0x12
#define DetectTh3 0x13
#define PMOffsetA 0x14
#define PMOffsetB 0x15
#define PMOffsetC 0x16
#define PMPGA 0x17
#define PMIrmsA 0x18
#define PMIrmsB 0x19
#define PMIrmsC 0x1A
#define PMConfig 0x10B
#define PMAvgSamples 0x1C
#define PMIrmsLSB 0x1D
/* CONFIGURATION REGISTERS */
#define ConfigStart 0x30 // Configuration Start
#define PLconstH 0x31 // High Word of PL_Constant
#define PLconstL 0x32 // Low Word of PL_Constant
#define MMode0 0x33 // Metering Mode Config
#define MMode1 0x34 // Metering Mode Config
#define PStartTh 0x35 // Startup Power Th (P)
#define QStartTh 0x36 // Startup Power Th (Q)
#define SStartTh 0x37 // Startup Power Th (S)
#define PPhaseTh 0x38 // Startup Power Accum Th (P)
#define QPhaseTh 0x39 // Startup Power Accum Th (Q)
#define SPhaseTh 0x3A // Startup Power Accum Th (S)
#define CSZero 0x3B // Checksum 0
/* CALIBRATION REGISTERS */
#define CalStart 0x40 // Cal Start
#define PoffsetA 0x41 // A Line Power Offset (P)
#define QoffsetA 0x42 // A Line Power Offset (Q)
#define PoffsetB 0x43 // B Line Power Offset (P)
#define QoffsetB 0x44 // B Line Power Offset (Q)
#define PoffsetC 0x45 // C Line Power Offset (P)
#define QoffsetC 0x46 // C Line Power Offset (Q)
#define GainA 0x47 // A Line Calibration Gain
#define PhiA 0x48 // A Line Calibration Angle
#define GainB 0x49 // B Line Calibration Gain
#define PhiB 0x4A // B Line Calibration Angle
#define GainC 0x4B // C Line Calibration Gain
#define PhiC 0x4C // C Line Calibration Angle
#define CSOne 0x4D // Checksum 1
/* HARMONIC & ENERGY REGISTERS */
#define HarmStart 0x50 // Harmonic Cal Start
#define POffsetAF 0x51 // A Fund Power Offset (P)
#define POffsetBF 0x52 // B Fund Power Offset (P)
#define POffsetCF 0x53 // C Fund Power Offset (P)
#define PGainAF 0x54 // A Fund Power Gain (P)
#define PGainBF 0x55 // B Fund Power Gain (P)
#define PGainCF 0x56 // C Fund Power Gain (P)
#define CSTwo 0x57 // Checksum 2
/* MEASUREMENT CALIBRATION REGISTERS */
#define AdjStart 0x60 // Measurement Cal Start
#define UgainA 0x61 // A Voltage RMS Gain
#define IgainA 0x62 // A Current RMS Gain
#define UoffsetA 0x63 // A Voltage Offset
#define IoffsetA 0x64 // A Current Offset
#define UgainB 0x65 // B Voltage RMS Gain
#define IgainB 0x66 // B Current RMS Gain
#define UoffsetB 0x67 // B Voltage Offset
#define IoffsetB 0x68 // B Current Offset
#define UgainC 0x69 // C Voltage RMS Gain
#define IgainC 0x6A // C Current RMS Gain
#define UoffsetC 0x6B // C Voltage Offset
#define IoffsetC 0x6C // C Current Offset
#define IgainN 0x6D // N Current Gain
#define IoffsetN 0x6E // N Current Offset
#define CSThree 0x6F // Checksum 3
/* ENERGY REGISTERS */
#define APenergyT 0x80 // Total Forward Active
#define APenergyA 0x81 // A Forward Active
#define APenergyB 0x82 // B Forward Active
#define APenergyC 0x83 // C Forward Active
#define ANenergyT 0x84 // Total Reverse Active
#define ANenergyA 0x85 // A Reverse Active
#define ANenergyB 0x86 // B Reverse Active
#define ANenergyC 0x87 // C Reverse Active
#define RPenergyT 0x88 // Total Forward Reactive
#define RPenergyA 0x89 // A Forward Reactive
#define RPenergyB 0x8A // B Forward Reactive
#define RPenergyC 0x8B // C Forward Reactive
#define RNenergyT 0x8C // Total Reverse Reactive
#define RNenergyA 0x8D // A Reverse Reactive
#define RNenergyB 0x8E // B Reverse Reactive
#define RNenergyC 0x8F // C Reverse Reactive
#define SAenergyT 0x90 // Total Apparent Energy
#define SenergyA 0x91 // A Apparent Energy
#define SenergyB 0x92 // B Apparent Energy
#define SenergyC 0x93 // C Apparent Energy
#define SVenergyT 0x94 // Total Apparent Energy (Arit)
#define EnStatus0 0x95 // Metering Status 0
#define EnStatus1 0x96 // Metering Status 1
///////////////// 0x97 // Reserved Register
#define SVmeanT 0x98 // Total Apparent Energy (Vect)
#define SVmeanTLSB 0x99 // LSB of Vector Sum
/* FUNDAMENTAL / HARMONIC ENERGY REGISTERS */
#define APenergyTF 0xA0 // Total Forward Fund. Energy
#define APenergyAF 0xA1 // A Forward Fund. Energy
#define APenergyBF 0xA2 // B Forward Fund. Energy
#define APenergyCF 0xA3 // C Forward Fund. Energy
#define ANenergyTF 0xA4 // Total Reverse Fund Energy
#define ANenergyAF 0xA5 // A Reverse Fund. Energy
#define ANenergyBF 0xA6 // B Reverse Fund. Energy
#define ANenergyCF 0xA7 // C Reverse Fund. Energy
#define APenergyTH 0xA8 // Total Forward Harm. Energy
#define APenergyAH 0xA9 // A Forward Harm. Energy
#define APenergyBH 0xAA // B Forward Harm. Energy
#define APenergyCH 0xAB // C Forward Harm. Energy
#define ANenergyTH 0xAC // Total Reverse Harm. Energy
#define ANenergyAH 0xAD // A Reverse Harm. Energy
#define ANenergyBH 0xAE // B Reverse Harm. Energy
#define ANenergyCH 0xAF // C Reverse Harm. Energy
/* POWER & P.F. REGISTERS */
#define PmeanT 0xB0 // Total Mean Power (P)
#define PmeanA 0xB1 // A Mean Power (P)
#define PmeanB 0xB2 // B Mean Power (P)
#define PmeanC 0xB3 // C Mean Power (P)
#define QmeanT 0xB4 // Total Mean Power (Q)
#define QmeanA 0xB5 // A Mean Power (Q)
#define QmeanB 0xB6 // B Mean Power (Q)
#define QmeanC 0xB7 // C Mean Power (Q)
#define SmeanT 0xB8 // Total Mean Power (S)
#define SmeanA 0xB9 // A Mean Power (S)
#define SmeanB 0xBA // B Mean Power (S)
#define SmeanC 0xBB // C Mean Power (S)
#define PFmeanT 0xBC // Mean Power Factor
#define PFmeanA 0xBD // A Power Factor
#define PFmeanB 0xBE // B Power Factor
#define PFmeanC 0xBF // C Power Factor
#define PmeanTLSB 0xC0 // Lower Word (Tot. Act. Power)
#define PmeanALSB 0xC1 // Lower Word (A Act. Power)
#define PmeanBLSB 0xC2 // Lower Word (B Act. Power)
#define PmeanCLSB 0xC3 // Lower Word (C Act. Power)
#define QmeanTLSB 0xC4 // Lower Word (Tot. React. Power)
#define QmeanALSB 0xC5 // Lower Word (A React. Power)
#define QmeanBLSB 0xC6 // Lower Word (B React. Power)
#define QmeanCLSB 0xC7 // Lower Word (C React. Power)
#define SAmeanTLSB 0xC8 // Lower Word (Tot. App. Power)
#define SmeanALSB 0xC9 // Lower Word (A App. Power)
#define SmeanBLSB 0xCA // Lower Word (B App. Power)
#define SmeanCLSB 0xCB // Lower Word (C App. Power)
/* FUND/HARM POWER & V/I RMS REGISTERS */
#define PmeanTF 0xD0 // Total Active Fund. Power
#define PmeanAF 0xD1 // A Active Fund. Power
#define PmeanBF 0xD2 // B Active Fund. Power
#define PmeanCF 0xD3 // C Active Fund. Power
#define PmeanTH 0xD4 // Total Active Harm. Power
#define PmeanAH 0xD5 // A Active Harm. Power
#define PmeanBH 0xD6 // B Active Harm. Power
#define PmeanCH 0xD7 // C Active Harm. Power
#define IrmsN1 0xD8 // N Sampled Current
#define UrmsA 0xD9 // A RMS Voltage
#define UrmsB 0xDA // B RMS Voltage
#define UrmsC 0xDB // C RMS Voltage
#define IrmsN0 0xDC // N Calculated Current
#define IrmsA 0xDD // A RMS Current
#define IrmsB 0xDE // B RMS Current
#define IrmsC 0xDF // C RMS Current
#define PmeanTFLSB 0xE0 // Lower Word (Tot. Act. Fund. Power)
#define PmeanAFLSB 0xE1 // Lower Word (A Act. Fund. Power)
#define PmeanBFLSB 0xE2 // Lower Word (B Act. Fund. Power)
#define PmeanCFLSB 0xE3 // Lower Word (C Act. Fund. Power)
#define PmeanTHLSB 0xE4 // Lower Word (Tot. Act. Harm. Power)
#define PmeanAHLSB 0xE5 // Lower Word (A Act. Harm. Power)
#define PmeanBHLSB 0xE6 // Lower Word (B Act. Harm. Power)
#define PmeanCHLSB 0xE7 // Lower Word (C Act. Harm. Power)
///////////////// 0xE8 // Reserved Register
#define UrmsALSB 0xE9 // Lower Word (A RMS Voltage)
#define UrmsBLSB 0xEA // Lower Word (B RMS Voltage)
#define UrmsCLSB 0xEB // Lower Word (C RMS Voltage)
///////////////// 0xEC // Reserved Register
#define IrmsALSB 0xED // Lower Word (A RMS Current)
#define IrmsBLSB 0xEE // Lower Word (B RMS Current)
#define IrmsCLSB 0xEF // Lower Word (C RMS Current)
/* THD, FREQUENCY, ANGLE & TEMP REGISTERS*/
#define THDNUA 0xF1 // A Voltage THD+N
#define THDNUB 0xF2 // B Voltage THD+N
#define THDNUC 0xF3 // C Voltage THD+N
///////////////// 0xF4 // Reserved Register
#define THDNIA 0xF5 // A Current THD+N
#define THDNIB 0xF6 // B Current THD+N
#define THDNIC 0xF7 // V Current THD+N
#define Freq 0xF8 // Frequency
#define PAngleA 0xF9 // A Mean Phase Angle
#define PAngleB 0xFA // B Mean Phase Angle
#define PAngleC 0xFB // C Mean Phase Angle
#define Temp 0xFC // Measured Temperature
#define UangleA 0xFD // A Voltage Phase Angle
#define UangleB 0xFE // B Voltage Phase Angle
#define UangleC 0xFF // C Voltage Phase Angle
class ATM90E36
{
private:
unsigned short CommEnergyIC(unsigned char RW, unsigned short address, unsigned short val);
int _energy_CS;
unsigned short _lineFreq;
unsigned short _pgagain;
unsigned short _ugain;
unsigned short _igainA;
unsigned short _igainB;
unsigned short _igainC;
unsigned short _igainN;
int Read32Register(signed short regh_addr, signed short regl_addr);
public:
/* Construct */
ATM90E36(void);
/* Destruct */
~ATM90E36(void);
/* Initialization Functions */
void begin(int pin, unsigned short lineFreq, unsigned short pgagain, unsigned short ugain, unsigned short igainA, unsigned short igainB, unsigned short igainC, unsigned short igainN);
uint16_t checkSum(int start, int end);
/* Main Electrical Parameters (GET)*/
double GetLineVoltageA();
double GetLineVoltageB();
double GetLineVoltageC();
double GetLineCurrentA();
double GetLineCurrentB();
double GetLineCurrentC();
double GetLineCurrentN();
double GetCalcLineCurrentN();
double GetActivePowerA();
double GetActivePowerB();
double GetActivePowerC();
double GetTotalActivePower();
double GetReactivePowerA();
double GetReactivePowerB();
double GetReactivePowerC();
double GetTotalReactivePower();
double GetApparentPowerA();
double GetApparentPowerB();
double GetApparentPowerC();
double GetTotalApparentPower();
double GetFrequency();
double GetPowerFactorA();
double GetPowerFactorB();
double GetPowerFactorC();
double GetTotalPowerFactor();
double GetVHarmA();
double GetVHarmB();
double GetVHarmC();
double GetCHarmA();
double GetCHarmB();
double GetCHarmC();
double GetPhaseA();
double GetPhaseB();
double GetPhaseC();
double GetTemperature();
/* Gain Parameters (GET)*/
unsigned short GetValueRegister(unsigned short registerRead);
/* Energy Consumption */
double GetImportEnergy();
double GetExportEnergy();
/* System Status */
unsigned short GetSysStatus0();
unsigned short GetSysStatus1();
unsigned short GetMeterStatus0();
unsigned short GetMeterStatus1();
/* Checksum Function */
bool calibrationError();
double CalibrateVI(unsigned short reg, unsigned short actualVal);
};
#endif