Calibrate and get energy readings from ADE7758 IC from Analog Devices
Fork of ADE7758 by
Currently this library can be used to calibrate and get VRMS, IRMS, active, and apparent energy. I havent worked on reactive energy measurement.
ade7758.h@4:5547bb32eb32, 2015-04-13 (annotated)
- Committer:
- bonchenko
- Date:
- Mon Apr 13 06:22:08 2015 +0000
- Revision:
- 4:5547bb32eb32
- Parent:
- 3:4fad91cf047a
xIRMS, xVRMS, xWh, xVAh works. Possibly need several calibration
Who changed what in which revision?
User | Revision | Line number | New 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 |