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 08 13:25:39 2015 +0000
Revision:
0:cf3dc3c5156b
Child:
1:f5e8c8591449
Initial commit - Can talk to ADE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bonchenko 0:cf3dc3c5156b 1 #include "mbed.h"
bonchenko 0:cf3dc3c5156b 2 #include "ade7758.h"
bonchenko 0:cf3dc3c5156b 3 #include "SWSPI.h"
bonchenko 0:cf3dc3c5156b 4
bonchenko 0:cf3dc3c5156b 5 // public
bonchenko 0:cf3dc3c5156b 6 ADE7758::ADE7758(PinName mosi, PinName miso, PinName sclk, PinName cs):
bonchenko 0:cf3dc3c5156b 7 _ADE7758SPI(mosi, miso, sclk), _ADESS(cs)
bonchenko 0:cf3dc3c5156b 8 {
bonchenko 0:cf3dc3c5156b 9 _ADESS = 1;
bonchenko 0:cf3dc3c5156b 10 }
bonchenko 0:cf3dc3c5156b 11
bonchenko 0:cf3dc3c5156b 12 void ADE7758::begin()
bonchenko 0:cf3dc3c5156b 13 {
bonchenko 0:cf3dc3c5156b 14 enableChip();
bonchenko 0:cf3dc3c5156b 15 //normal mode
bonchenko 0:cf3dc3c5156b 16 _ADE7758SPI.format(8);
bonchenko 0:cf3dc3c5156b 17 write8bits(OPMODE, 0x04);
bonchenko 0:cf3dc3c5156b 18 }
bonchenko 0:cf3dc3c5156b 19
bonchenko 0:cf3dc3c5156b 20 int ADE7758::getWattHR(char phase)
bonchenko 0:cf3dc3c5156b 21 {
bonchenko 0:cf3dc3c5156b 22 return read16bits(AWATTHR+phase);
bonchenko 0:cf3dc3c5156b 23 }
bonchenko 0:cf3dc3c5156b 24
bonchenko 0:cf3dc3c5156b 25 int ADE7758::getVARHR(char phase)
bonchenko 0:cf3dc3c5156b 26 {
bonchenko 0:cf3dc3c5156b 27 return read16bits(AVARHR+phase);
bonchenko 0:cf3dc3c5156b 28 }
bonchenko 0:cf3dc3c5156b 29
bonchenko 0:cf3dc3c5156b 30 int ADE7758::getVAHR(char phase)
bonchenko 0:cf3dc3c5156b 31 {
bonchenko 0:cf3dc3c5156b 32 return read16bits(AVAHR+phase);
bonchenko 0:cf3dc3c5156b 33 }
bonchenko 0:cf3dc3c5156b 34
bonchenko 0:cf3dc3c5156b 35 int ADE7758::WattHR(char phase)
bonchenko 0:cf3dc3c5156b 36 {
bonchenko 0:cf3dc3c5156b 37 return getWattHR(phase);
bonchenko 0:cf3dc3c5156b 38 }
bonchenko 0:cf3dc3c5156b 39
bonchenko 0:cf3dc3c5156b 40 int ADE7758::VARHR(char phase)
bonchenko 0:cf3dc3c5156b 41 {
bonchenko 0:cf3dc3c5156b 42 return getVARHR(phase);
bonchenko 0:cf3dc3c5156b 43 }
bonchenko 0:cf3dc3c5156b 44
bonchenko 0:cf3dc3c5156b 45 int ADE7758::VAHR(char phase)
bonchenko 0:cf3dc3c5156b 46 {
bonchenko 0:cf3dc3c5156b 47 return getVAHR(phase);
bonchenko 0:cf3dc3c5156b 48 }
bonchenko 0:cf3dc3c5156b 49
bonchenko 0:cf3dc3c5156b 50 long ADE7758::VRMS(char phase)
bonchenko 0:cf3dc3c5156b 51 {
bonchenko 0:cf3dc3c5156b 52 char i=0;
bonchenko 0:cf3dc3c5156b 53 long volts=0;
bonchenko 0:cf3dc3c5156b 54 getVRMS(phase);//Ignore first reading
bonchenko 0:cf3dc3c5156b 55 for(i=0;i<10;++i){
bonchenko 0:cf3dc3c5156b 56 volts+=getVRMS(phase);
bonchenko 0:cf3dc3c5156b 57 wait_us(50);
bonchenko 0:cf3dc3c5156b 58 }
bonchenko 0:cf3dc3c5156b 59 //average
bonchenko 0:cf3dc3c5156b 60 return volts/10;
bonchenko 0:cf3dc3c5156b 61 }
bonchenko 0:cf3dc3c5156b 62
bonchenko 0:cf3dc3c5156b 63 long ADE7758::IRMS(char phase)
bonchenko 0:cf3dc3c5156b 64 {
bonchenko 0:cf3dc3c5156b 65 char i=0;
bonchenko 0:cf3dc3c5156b 66 long current=0;
bonchenko 0:cf3dc3c5156b 67 getIRMS(phase);//Ignore first reading
bonchenko 0:cf3dc3c5156b 68 for(i=0;i<10;++i){
bonchenko 0:cf3dc3c5156b 69 current+=getIRMS(phase);
bonchenko 0:cf3dc3c5156b 70 wait_us(50);
bonchenko 0:cf3dc3c5156b 71 }
bonchenko 0:cf3dc3c5156b 72 //average
bonchenko 0:cf3dc3c5156b 73 return current/10;
bonchenko 0:cf3dc3c5156b 74 }
bonchenko 0:cf3dc3c5156b 75
bonchenko 0:cf3dc3c5156b 76 void accumulateEnergy()
bonchenko 0:cf3dc3c5156b 77 {
bonchenko 0:cf3dc3c5156b 78
bonchenko 0:cf3dc3c5156b 79 }
bonchenko 0:cf3dc3c5156b 80
bonchenko 0:cf3dc3c5156b 81 long ADE7758::waveform(char phase,char source)
bonchenko 0:cf3dc3c5156b 82 {
bonchenko 0:cf3dc3c5156b 83 return 1;
bonchenko 0:cf3dc3c5156b 84 }
bonchenko 0:cf3dc3c5156b 85
bonchenko 0:cf3dc3c5156b 86 void ADE7758::powerOff()
bonchenko 0:cf3dc3c5156b 87 {
bonchenko 0:cf3dc3c5156b 88
bonchenko 0:cf3dc3c5156b 89 }
bonchenko 0:cf3dc3c5156b 90
bonchenko 0:cf3dc3c5156b 91 void ADE7758::powerON()
bonchenko 0:cf3dc3c5156b 92 {
bonchenko 0:cf3dc3c5156b 93
bonchenko 0:cf3dc3c5156b 94 }
bonchenko 0:cf3dc3c5156b 95
bonchenko 0:cf3dc3c5156b 96 void ADE7758::sleep()
bonchenko 0:cf3dc3c5156b 97 {
bonchenko 0:cf3dc3c5156b 98
bonchenko 0:cf3dc3c5156b 99 }
bonchenko 0:cf3dc3c5156b 100
bonchenko 0:cf3dc3c5156b 101 void ADE7758::wakeUp()
bonchenko 0:cf3dc3c5156b 102 {
bonchenko 0:cf3dc3c5156b 103
bonchenko 0:cf3dc3c5156b 104 }
bonchenko 0:cf3dc3c5156b 105
bonchenko 0:cf3dc3c5156b 106 long ADE7758::getInterruptStatus(void){
bonchenko 0:cf3dc3c5156b 107 return read24bits(STATUS);
bonchenko 0:cf3dc3c5156b 108 }
bonchenko 0:cf3dc3c5156b 109
bonchenko 0:cf3dc3c5156b 110
bonchenko 0:cf3dc3c5156b 111 long ADE7758::getResetInterruptStatus(void){
bonchenko 0:cf3dc3c5156b 112 return read24bits(RSTATUS);
bonchenko 0:cf3dc3c5156b 113 }
bonchenko 0:cf3dc3c5156b 114
bonchenko 0:cf3dc3c5156b 115
bonchenko 0:cf3dc3c5156b 116 int ADE7758::lineFreq(char phase){
bonchenko 0:cf3dc3c5156b 117 uint8_t mmode;
bonchenko 0:cf3dc3c5156b 118 mmode = read8bits(MMODE);
bonchenko 0:cf3dc3c5156b 119 write8bits(MMODE,(mmode&0x11111100 )| phase);
bonchenko 0:cf3dc3c5156b 120 wait_ms(10);
bonchenko 0:cf3dc3c5156b 121 return read16bits(FREQ);
bonchenko 0:cf3dc3c5156b 122 }
bonchenko 0:cf3dc3c5156b 123 // private
bonchenko 0:cf3dc3c5156b 124
bonchenko 0:cf3dc3c5156b 125 void ADE7758::enableChip()
bonchenko 0:cf3dc3c5156b 126 {
bonchenko 0:cf3dc3c5156b 127 _ADESS = 0;
bonchenko 0:cf3dc3c5156b 128 }
bonchenko 0:cf3dc3c5156b 129
bonchenko 0:cf3dc3c5156b 130 void ADE7758::disableChip()
bonchenko 0:cf3dc3c5156b 131 {
bonchenko 0:cf3dc3c5156b 132 _ADESS = 1;
bonchenko 0:cf3dc3c5156b 133 }
bonchenko 0:cf3dc3c5156b 134
bonchenko 0:cf3dc3c5156b 135 void ADE7758::write8bits(char reg, unsigned char data)
bonchenko 0:cf3dc3c5156b 136 {
bonchenko 0:cf3dc3c5156b 137 enableChip();
bonchenko 0:cf3dc3c5156b 138
bonchenko 0:cf3dc3c5156b 139 wait_ms(10);
bonchenko 0:cf3dc3c5156b 140 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 0:cf3dc3c5156b 141 wait_ms(2);
bonchenko 0:cf3dc3c5156b 142
bonchenko 0:cf3dc3c5156b 143 _ADE7758SPI.write(data);
bonchenko 0:cf3dc3c5156b 144
bonchenko 0:cf3dc3c5156b 145 wait_ms(1);
bonchenko 0:cf3dc3c5156b 146
bonchenko 0:cf3dc3c5156b 147 disableChip();
bonchenko 0:cf3dc3c5156b 148 }
bonchenko 0:cf3dc3c5156b 149
bonchenko 0:cf3dc3c5156b 150 void ADE7758::write16bits(char reg, unsigned int data)
bonchenko 0:cf3dc3c5156b 151 {
bonchenko 0:cf3dc3c5156b 152 enableChip();
bonchenko 0:cf3dc3c5156b 153
bonchenko 0:cf3dc3c5156b 154 wait_ms(10);
bonchenko 0:cf3dc3c5156b 155 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 0:cf3dc3c5156b 156 wait_ms(2);
bonchenko 0:cf3dc3c5156b 157 _ADE7758SPI.write((unsigned char)((data>>8)&0xFF));
bonchenko 0:cf3dc3c5156b 158 wait_ms(2);
bonchenko 0:cf3dc3c5156b 159 _ADE7758SPI.write((unsigned char)(data&0xFF));
bonchenko 0:cf3dc3c5156b 160 wait_ms(1);
bonchenko 0:cf3dc3c5156b 161
bonchenko 0:cf3dc3c5156b 162 disableChip();
bonchenko 0:cf3dc3c5156b 163 }
bonchenko 0:cf3dc3c5156b 164
bonchenko 0:cf3dc3c5156b 165 unsigned char ADE7758::read8bits(char reg)
bonchenko 0:cf3dc3c5156b 166 {
bonchenko 0:cf3dc3c5156b 167 enableChip();
bonchenko 0:cf3dc3c5156b 168
bonchenko 0:cf3dc3c5156b 169 unsigned char ret;
bonchenko 0:cf3dc3c5156b 170 wait_ms(10);
bonchenko 0:cf3dc3c5156b 171 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 172 wait_ms(2);
bonchenko 0:cf3dc3c5156b 173 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 174 wait_ms(1);
bonchenko 0:cf3dc3c5156b 175
bonchenko 0:cf3dc3c5156b 176 disableChip();
bonchenko 0:cf3dc3c5156b 177
bonchenko 0:cf3dc3c5156b 178 return ret;
bonchenko 0:cf3dc3c5156b 179 }
bonchenko 0:cf3dc3c5156b 180
bonchenko 0:cf3dc3c5156b 181 unsigned int ADE7758::read16bits(char reg)
bonchenko 0:cf3dc3c5156b 182 {
bonchenko 0:cf3dc3c5156b 183 enableChip();
bonchenko 0:cf3dc3c5156b 184 unsigned int ret=0;
bonchenko 0:cf3dc3c5156b 185 unsigned char ret0=0;
bonchenko 0:cf3dc3c5156b 186 wait_ms(10);
bonchenko 0:cf3dc3c5156b 187 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 188 wait_ms(2);
bonchenko 0:cf3dc3c5156b 189 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 190 wait_ms(2);
bonchenko 0:cf3dc3c5156b 191 ret0=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 192 wait_ms(1);
bonchenko 0:cf3dc3c5156b 193
bonchenko 0:cf3dc3c5156b 194 disableChip();
bonchenko 0:cf3dc3c5156b 195 ret= (ret<<8)|ret0;
bonchenko 0:cf3dc3c5156b 196 return ret;
bonchenko 0:cf3dc3c5156b 197 }
bonchenko 0:cf3dc3c5156b 198
bonchenko 0:cf3dc3c5156b 199 unsigned long ADE7758::read24bits(char reg)
bonchenko 0:cf3dc3c5156b 200 {
bonchenko 0:cf3dc3c5156b 201 enableChip();
bonchenko 0:cf3dc3c5156b 202 unsigned long ret=0;
bonchenko 0:cf3dc3c5156b 203 unsigned int ret1=0;
bonchenko 0:cf3dc3c5156b 204 unsigned char ret0=0;
bonchenko 0:cf3dc3c5156b 205 wait_ms(10);
bonchenko 0:cf3dc3c5156b 206 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 207 wait_ms(2);
bonchenko 0:cf3dc3c5156b 208 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 209 wait_ms(2);
bonchenko 0:cf3dc3c5156b 210 ret1=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 211 wait_ms(2);
bonchenko 0:cf3dc3c5156b 212 ret0=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 213 wait_ms(1);
bonchenko 0:cf3dc3c5156b 214
bonchenko 0:cf3dc3c5156b 215 disableChip();
bonchenko 0:cf3dc3c5156b 216 ret= (ret<<16)|(ret1<<8)|ret0;
bonchenko 0:cf3dc3c5156b 217 return ret;
bonchenko 0:cf3dc3c5156b 218 }
bonchenko 0:cf3dc3c5156b 219
bonchenko 0:cf3dc3c5156b 220 long ADE7758::getIRMS(char phase)
bonchenko 0:cf3dc3c5156b 221 {
bonchenko 0:cf3dc3c5156b 222 return read24bits(AIRMS+phase);
bonchenko 0:cf3dc3c5156b 223 }
bonchenko 0:cf3dc3c5156b 224
bonchenko 0:cf3dc3c5156b 225 long ADE7758::getVRMS(char phase)
bonchenko 0:cf3dc3c5156b 226 {
bonchenko 0:cf3dc3c5156b 227 return read24bits(AVRMS+phase);
bonchenko 0:cf3dc3c5156b 228 }
bonchenko 0:cf3dc3c5156b 229
bonchenko 0:cf3dc3c5156b 230 // ADE7758 ADE(mosi, miso, sclk, cs);