Calibrate and get energy readings from ADE7758 IC from Analog Devices

Fork of ADE7758 by Emma

Currently this library can be used to calibrate and get VRMS, IRMS, active, and apparent energy. I havent worked on reactive energy measurement.

Committer:
bonchenko
Date:
Wed Apr 22 10:21:55 2015 +0000
Revision:
7:54310bde2e53
Parent:
4:5547bb32eb32
Able to read VRMS, IRMS, active and apparent energy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bonchenko 0:cf3dc3c5156b 1 #ifndef MBED_ADE7758_H
bonchenko 0:cf3dc3c5156b 2 #define MBED_ADE7758_H
bonchenko 0:cf3dc3c5156b 3
bonchenko 0:cf3dc3c5156b 4 #include "mbed.h"
bonchenko 0:cf3dc3c5156b 5 #include "SWSPI.h"
bonchenko 0:cf3dc3c5156b 6
bonchenko 0:cf3dc3c5156b 7 #define AWATTHR 0x01
bonchenko 0:cf3dc3c5156b 8 #define BWATTHR 0x02
bonchenko 0:cf3dc3c5156b 9 #define CWATTHR 0x03
bonchenko 0:cf3dc3c5156b 10 #define AVARHR 0x04
bonchenko 0:cf3dc3c5156b 11 #define BVARHR 0x05
bonchenko 0:cf3dc3c5156b 12 #define CVARHR 0x06
bonchenko 0:cf3dc3c5156b 13 #define AVAHR 0x07
bonchenko 0:cf3dc3c5156b 14 #define BVAHR 0x08
bonchenko 0:cf3dc3c5156b 15 #define CVAHR 0x09
bonchenko 0:cf3dc3c5156b 16 #define AIRMS 0x0A
bonchenko 0:cf3dc3c5156b 17 #define BIRMS 0x0B
bonchenko 0:cf3dc3c5156b 18 #define CIRMS 0x0C
bonchenko 0:cf3dc3c5156b 19 #define AVRMS 0x0D
bonchenko 0:cf3dc3c5156b 20 #define BVRMS 0x0E
bonchenko 0:cf3dc3c5156b 21 #define CVRMS 0x0F
bonchenko 0:cf3dc3c5156b 22 #define FREQ 0x10
bonchenko 0:cf3dc3c5156b 23 #define TEMP 0x11
bonchenko 0:cf3dc3c5156b 24 #define WFORM 0x12
bonchenko 0:cf3dc3c5156b 25 #define OPMODE 0x13
bonchenko 0:cf3dc3c5156b 26 #define MMODE 0x14
bonchenko 0:cf3dc3c5156b 27 #define WAVMODE 0x15
bonchenko 0:cf3dc3c5156b 28 #define COMPMODE 0x16
bonchenko 0:cf3dc3c5156b 29 #define LCYCMODE 0x17
bonchenko 0:cf3dc3c5156b 30 #define MASK 0x18
bonchenko 0:cf3dc3c5156b 31 #define STATUS 0x19
bonchenko 0:cf3dc3c5156b 32 #define RSTATUS 0x1A
bonchenko 0:cf3dc3c5156b 33 #define ZXTOUT 0x1B
bonchenko 0:cf3dc3c5156b 34 #define LINECYC 0x1C
bonchenko 0:cf3dc3c5156b 35 #define SAGCYC 0x1D
bonchenko 0:cf3dc3c5156b 36 #define SAGLVL 0x1E
bonchenko 0:cf3dc3c5156b 37 #define VPINTLVL 0x1F
bonchenko 0:cf3dc3c5156b 38 #define IPINTLVL 0x20
bonchenko 0:cf3dc3c5156b 39 #define VPEAK 0x21
bonchenko 0:cf3dc3c5156b 40 #define IPEAK 0x22
bonchenko 0:cf3dc3c5156b 41 #define GAIN 0x23
bonchenko 0:cf3dc3c5156b 42 #define AVRMSGAIN 0x24
bonchenko 0:cf3dc3c5156b 43 #define BVRMSGAIN 0x25
bonchenko 0:cf3dc3c5156b 44 #define CVRMSGAIN 0x26
bonchenko 0:cf3dc3c5156b 45 #define AIGAIN 0x27
bonchenko 0:cf3dc3c5156b 46 #define BIGAIN 0x28
bonchenko 0:cf3dc3c5156b 47 #define CIGAIN 0x29
bonchenko 0:cf3dc3c5156b 48 #define AWG 0x2A
bonchenko 0:cf3dc3c5156b 49 #define BWG 0x2B
bonchenko 0:cf3dc3c5156b 50 #define CWG 0x2C
bonchenko 0:cf3dc3c5156b 51 #define AVARG 0x2D
bonchenko 0:cf3dc3c5156b 52 #define BVARG 0x2E
bonchenko 0:cf3dc3c5156b 53 #define CVARG 0x2F
bonchenko 0:cf3dc3c5156b 54 #define AVAG 0x30
bonchenko 0:cf3dc3c5156b 55 #define BVAG 0x31
bonchenko 0:cf3dc3c5156b 56 #define CVAG 0x32
bonchenko 0:cf3dc3c5156b 57 #define AVRMSOS 0x33
bonchenko 0:cf3dc3c5156b 58 #define BVRMSOS 0x34
bonchenko 0:cf3dc3c5156b 59 #define CVRMSOS 0x35
bonchenko 0:cf3dc3c5156b 60 #define AIRMSOS 0x36
bonchenko 0:cf3dc3c5156b 61 #define BIRMSOS 0x37
bonchenko 0:cf3dc3c5156b 62 #define CIRMSOS 0x38
bonchenko 0:cf3dc3c5156b 63 #define AWAITOS 0x39
bonchenko 0:cf3dc3c5156b 64 #define BWAITOS 0x3A
bonchenko 0:cf3dc3c5156b 65 #define CWAITOS 0x3B
bonchenko 0:cf3dc3c5156b 66 #define AVAROS 0x3C
bonchenko 0:cf3dc3c5156b 67 #define BVAROS 0x3D
bonchenko 0:cf3dc3c5156b 68 #define CVAROS 0x3E
bonchenko 0:cf3dc3c5156b 69 #define APHCAL 0x3F
bonchenko 0:cf3dc3c5156b 70 #define BPHCAL 0x40
bonchenko 0:cf3dc3c5156b 71 #define CPHCAL 0x41
bonchenko 0:cf3dc3c5156b 72 #define WDIV 0x42
bonchenko 0:cf3dc3c5156b 73 #define VADIV 0x44
bonchenko 0:cf3dc3c5156b 74 #define VARDIV 0x43
bonchenko 0:cf3dc3c5156b 75 #define APCFNUM 0x45
bonchenko 0:cf3dc3c5156b 76 #define APCFDEN 0x46
bonchenko 0:cf3dc3c5156b 77 #define VARCFNUM 0x47
bonchenko 0:cf3dc3c5156b 78 #define VARCFDEN 0x48
bonchenko 0:cf3dc3c5156b 79 #define CHKSUM 0x7E
bonchenko 0:cf3dc3c5156b 80 #define VERSION 0x7F
bonchenko 0:cf3dc3c5156b 81
bonchenko 0:cf3dc3c5156b 82 #define REG_READ(reg) reg
bonchenko 0:cf3dc3c5156b 83 #define REG_WRITE(reg) (unsigned char)((reg) | 0x80)
bonchenko 0:cf3dc3c5156b 84
bonchenko 0:cf3dc3c5156b 85 //PHASE_SEL
bonchenko 0:cf3dc3c5156b 86 #define PHASE_A 0
bonchenko 0:cf3dc3c5156b 87 #define PHASE_B 1
bonchenko 0:cf3dc3c5156b 88 #define PHASE_C 2
bonchenko 0:cf3dc3c5156b 89
bonchenko 0:cf3dc3c5156b 90 //WAV_SEL
bonchenko 0:cf3dc3c5156b 91 #define CURRENT 0
bonchenko 0:cf3dc3c5156b 92 #define VOLTAGE 1
bonchenko 0:cf3dc3c5156b 93 #define ACT_PWR 2
bonchenko 0:cf3dc3c5156b 94 #define REACT_PWR 3
bonchenko 0:cf3dc3c5156b 95 #define APP_PWR 4
bonchenko 0:cf3dc3c5156b 96
bonchenko 0:cf3dc3c5156b 97 //interrupt mask/status bit
bonchenko 0:cf3dc3c5156b 98 #define AEHF 0
bonchenko 0:cf3dc3c5156b 99 #define REHF 1
bonchenko 0:cf3dc3c5156b 100 #define VAEHF 2
bonchenko 0:cf3dc3c5156b 101 #define SAGA 3
bonchenko 0:cf3dc3c5156b 102 #define SAGB 4
bonchenko 0:cf3dc3c5156b 103 #define SAGC 5
bonchenko 0:cf3dc3c5156b 104 #define ZXTOA 6
bonchenko 0:cf3dc3c5156b 105 #define ZXTOB 7
bonchenko 0:cf3dc3c5156b 106 #define ZXTOC 8
bonchenko 0:cf3dc3c5156b 107 #define ZXA 9
bonchenko 0:cf3dc3c5156b 108 #define ZXB 10
bonchenko 0:cf3dc3c5156b 109 #define ZXC 11
bonchenko 0:cf3dc3c5156b 110 #define LENERGY 12
bonchenko 0:cf3dc3c5156b 111 #define RESET 13
bonchenko 0:cf3dc3c5156b 112 #define PKV 14
bonchenko 0:cf3dc3c5156b 113 #define PKI 15
bonchenko 0:cf3dc3c5156b 114 #define WFSM 16
bonchenko 0:cf3dc3c5156b 115 #define REVPAP 17
bonchenko 0:cf3dc3c5156b 116 #define REVPRP 18
bonchenko 0:cf3dc3c5156b 117 #define SEQERR 19
bonchenko 0:cf3dc3c5156b 118
bonchenko 0:cf3dc3c5156b 119 #define WAVMODE_VALUE(phase, wave) (((wave)<<2)|(phase))
bonchenko 0:cf3dc3c5156b 120
bonchenko 4:5547bb32eb32 121 #define NUMSAMPLES 20
bonchenko 2:ea36884772ae 122
bonchenko 3:4fad91cf047a 123 #define ITEST 0.6
bonchenko 3:4fad91cf047a 124 #define VNOM 220
bonchenko 3:4fad91cf047a 125 #define WHREXPECTED 1.2
bonchenko 3:4fad91cf047a 126 #define VAHREXPECTED 1.2
bonchenko 3:4fad91cf047a 127
bonchenko 0:cf3dc3c5156b 128 class ADE7758
bonchenko 1:f5e8c8591449 129 {
bonchenko 1:f5e8c8591449 130 public:
bonchenko 1:f5e8c8591449 131 ADE7758 (PinName mosi, PinName miso, PinName sclk, PinName cs, PinName interrupt);
bonchenko 1:f5e8c8591449 132 void begin();
bonchenko 2:ea36884772ae 133 void calibrateVI(uint8_t numSamples);
bonchenko 4:5547bb32eb32 134 void writeRMSOffset(uint16_t AIRMSOSValue, uint16_t BIRMSOSValue, uint16_t CIRMSOSValue, uint16_t AVRMSOSValue, uint16_t BVRMSOSValue, uint16_t CVRMSOSValue);
bonchenko 2:ea36884772ae 135 void calibrateGain(char phase);
bonchenko 3:4fad91cf047a 136 float getAccumulationTime(char phase);
bonchenko 1:f5e8c8591449 137 int WattHR(char phase);
bonchenko 1:f5e8c8591449 138 int VARHR(char phase);
bonchenko 1:f5e8c8591449 139 int VAHR(char phase);
bonchenko 1:f5e8c8591449 140 long VRMS(char phase);
bonchenko 1:f5e8c8591449 141 long IRMS(char phase);
bonchenko 2:ea36884772ae 142 float calculateVRMS(char phase);
bonchenko 2:ea36884772ae 143 float calculateIRMS(char phase);
bonchenko 4:5547bb32eb32 144 void getEnergy(char phase, uint8_t samplingPeriod, float *AWattHr, float *BWattHr, float *CWattHr, float *AVAHr, float *BVAHr, float *CVAHr);
bonchenko 1:f5e8c8591449 145 long waveform(char phase,char source);
bonchenko 1:f5e8c8591449 146 int lineFreq(char phase);
bonchenko 3:4fad91cf047a 147 void calculateEnergy(char phase);
bonchenko 4:5547bb32eb32 148
bonchenko 1:f5e8c8591449 149 void powerOff();
bonchenko 1:f5e8c8591449 150 void powerON();
bonchenko 1:f5e8c8591449 151 void sleep();
bonchenko 1:f5e8c8591449 152 void wakeUp();
bonchenko 1:f5e8c8591449 153 long getInterruptStatus(void);
bonchenko 1:f5e8c8591449 154 long getResetInterruptStatus(void);
bonchenko 1:f5e8c8591449 155 void enableChip();
bonchenko 1:f5e8c8591449 156 void disableChip();
bonchenko 1:f5e8c8591449 157 void write8bits(char reg, unsigned char data);
bonchenko 1:f5e8c8591449 158 void write16bits(char reg, unsigned int data);
bonchenko 3:4fad91cf047a 159 void write24bits(char reg, unsigned int data);
bonchenko 1:f5e8c8591449 160 unsigned char read8bits(char reg);
bonchenko 1:f5e8c8591449 161 unsigned int read16bits(char reg);
bonchenko 1:f5e8c8591449 162 unsigned long read24bits(char reg);
bonchenko 1:f5e8c8591449 163 float AVRMSCalib;
bonchenko 1:f5e8c8591449 164 float BVRMSCalib;
bonchenko 1:f5e8c8591449 165 float CVRMSCalib;
bonchenko 1:f5e8c8591449 166 float AIRMSCalib;
bonchenko 1:f5e8c8591449 167 float BIRMSCalib;
bonchenko 1:f5e8c8591449 168 float CIRMSCalib;
bonchenko 4:5547bb32eb32 169 float AWGCalib;
bonchenko 4:5547bb32eb32 170 float BWGCalib;
bonchenko 4:5547bb32eb32 171 float CWGCalib;
bonchenko 4:5547bb32eb32 172 float AVAGCalib;
bonchenko 4:5547bb32eb32 173 float BVAGCalib;
bonchenko 4:5547bb32eb32 174 float CVAGCalib;
bonchenko 4:5547bb32eb32 175 float AWhLSB;
bonchenko 4:5547bb32eb32 176 float BWhLSB;
bonchenko 4:5547bb32eb32 177 float CWhLSB;
bonchenko 4:5547bb32eb32 178 float AVAhLSB;
bonchenko 4:5547bb32eb32 179 float BVAhLSB;
bonchenko 4:5547bb32eb32 180 float CVAhLSB;
bonchenko 2:ea36884772ae 181
bonchenko 1:f5e8c8591449 182 private:
bonchenko 1:f5e8c8591449 183 long getIRMS(char phase);
bonchenko 1:f5e8c8591449 184 long getVRMS(char phase);
bonchenko 1:f5e8c8591449 185 int getWattHR(char phase);
bonchenko 1:f5e8c8591449 186 int getVARHR(char phase);
bonchenko 1:f5e8c8591449 187 int getVAHR(char phase);
bonchenko 4:5547bb32eb32 188 void getAccumulatedEnergy(char phase, uint16_t *AWattHr, uint16_t *BWattHr, uint16_t *CWattHr, uint16_t *AVAHr, uint16_t *BVAHr, uint16_t *CVAHr);
bonchenko 1:f5e8c8591449 189 SWSPI _ADE7758SPI;
bonchenko 1:f5e8c8591449 190 DigitalOut _ADESS;
bonchenko 1:f5e8c8591449 191 DigitalIn _ADEINT;
bonchenko 0:cf3dc3c5156b 192 };
bonchenko 0:cf3dc3c5156b 193
bonchenko 0:cf3dc3c5156b 194 extern ADE7758 ADE;
bonchenko 0:cf3dc3c5156b 195 #endif