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:
Fri Apr 10 03:58:10 2015 +0000
Revision:
1:f5e8c8591449
Parent:
0:cf3dc3c5156b
Child:
2:ea36884772ae
ADE7758 can read VRMS and IRMS, need energy calibration

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 1:f5e8c8591449 6 ADE7758::ADE7758(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName interrupt):
bonchenko 1:f5e8c8591449 7 _ADE7758SPI(mosi, miso, sclk), _ADESS(cs), _ADEINT(interrupt)
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 1:f5e8c8591449 16 _ADE7758SPI.format(8, 1); // pha 0, pol 1
bonchenko 1:f5e8c8591449 17 _ADE7758SPI.frequency(1000000);
bonchenko 1:f5e8c8591449 18 write8bits(OPMODE, 0x04);
bonchenko 1:f5e8c8591449 19 }
bonchenko 1:f5e8c8591449 20
bonchenko 1:f5e8c8591449 21 void ADE7758::CalibrateVI(uint8_t numSamples)
bonchenko 1:f5e8c8591449 22 {
bonchenko 1:f5e8c8591449 23 write8bits(LCYCMODE, 0x38);
bonchenko 1:f5e8c8591449 24 write24bits(MASK, 0xE00);
bonchenko 1:f5e8c8591449 25 long AVRMSBuffer = 0, BVRMSBuffer = 0, CVRMSBuffer = 0;
bonchenko 1:f5e8c8591449 26 long AIRMSBuffer = 0, BIRMSBuffer = 0, CIRMSBuffer = 0;
bonchenko 1:f5e8c8591449 27 for (uint8_t i=0; i<numSamples; i++) {
bonchenko 1:f5e8c8591449 28 read24bits(RSTATUS);
bonchenko 1:f5e8c8591449 29 while ( _ADEINT != 0 ) { } // wait until INT go low
bonchenko 1:f5e8c8591449 30 AVRMSBuffer += VRMS(PHASE_A);
bonchenko 1:f5e8c8591449 31 BVRMSBuffer += VRMS(PHASE_B);
bonchenko 1:f5e8c8591449 32 CVRMSBuffer += VRMS(PHASE_C);
bonchenko 1:f5e8c8591449 33 AIRMSBuffer += IRMS(PHASE_A);
bonchenko 1:f5e8c8591449 34 BIRMSBuffer += IRMS(PHASE_B);
bonchenko 1:f5e8c8591449 35 CIRMSBuffer += IRMS(PHASE_C);
bonchenko 1:f5e8c8591449 36 }
bonchenko 1:f5e8c8591449 37 AVRMSCalib = AVRMSBuffer/numSamples;
bonchenko 1:f5e8c8591449 38 BVRMSCalib = BVRMSBuffer/numSamples;
bonchenko 1:f5e8c8591449 39 CVRMSCalib = CVRMSBuffer/numSamples;
bonchenko 1:f5e8c8591449 40 AIRMSCalib = AIRMSBuffer/numSamples;
bonchenko 1:f5e8c8591449 41 BIRMSCalib = BIRMSBuffer/numSamples;
bonchenko 1:f5e8c8591449 42 CIRMSCalib = CIRMSBuffer/numSamples;
bonchenko 0:cf3dc3c5156b 43 }
bonchenko 0:cf3dc3c5156b 44
bonchenko 0:cf3dc3c5156b 45 int ADE7758::getWattHR(char phase)
bonchenko 0:cf3dc3c5156b 46 {
bonchenko 0:cf3dc3c5156b 47 return read16bits(AWATTHR+phase);
bonchenko 0:cf3dc3c5156b 48 }
bonchenko 0:cf3dc3c5156b 49
bonchenko 0:cf3dc3c5156b 50 int ADE7758::getVARHR(char phase)
bonchenko 0:cf3dc3c5156b 51 {
bonchenko 0:cf3dc3c5156b 52 return read16bits(AVARHR+phase);
bonchenko 0:cf3dc3c5156b 53 }
bonchenko 0:cf3dc3c5156b 54
bonchenko 0:cf3dc3c5156b 55 int ADE7758::getVAHR(char phase)
bonchenko 0:cf3dc3c5156b 56 {
bonchenko 0:cf3dc3c5156b 57 return read16bits(AVAHR+phase);
bonchenko 0:cf3dc3c5156b 58 }
bonchenko 0:cf3dc3c5156b 59
bonchenko 0:cf3dc3c5156b 60 int ADE7758::WattHR(char phase)
bonchenko 0:cf3dc3c5156b 61 {
bonchenko 0:cf3dc3c5156b 62 return getWattHR(phase);
bonchenko 0:cf3dc3c5156b 63 }
bonchenko 0:cf3dc3c5156b 64
bonchenko 0:cf3dc3c5156b 65 int ADE7758::VARHR(char phase)
bonchenko 0:cf3dc3c5156b 66 {
bonchenko 0:cf3dc3c5156b 67 return getVARHR(phase);
bonchenko 0:cf3dc3c5156b 68 }
bonchenko 0:cf3dc3c5156b 69
bonchenko 0:cf3dc3c5156b 70 int ADE7758::VAHR(char phase)
bonchenko 0:cf3dc3c5156b 71 {
bonchenko 0:cf3dc3c5156b 72 return getVAHR(phase);
bonchenko 0:cf3dc3c5156b 73 }
bonchenko 0:cf3dc3c5156b 74
bonchenko 0:cf3dc3c5156b 75 long ADE7758::VRMS(char phase)
bonchenko 0:cf3dc3c5156b 76 {
bonchenko 0:cf3dc3c5156b 77 char i=0;
bonchenko 0:cf3dc3c5156b 78 long volts=0;
bonchenko 0:cf3dc3c5156b 79 getVRMS(phase);//Ignore first reading
bonchenko 0:cf3dc3c5156b 80 for(i=0;i<10;++i){
bonchenko 0:cf3dc3c5156b 81 volts+=getVRMS(phase);
bonchenko 0:cf3dc3c5156b 82 wait_us(50);
bonchenko 0:cf3dc3c5156b 83 }
bonchenko 0:cf3dc3c5156b 84 //average
bonchenko 0:cf3dc3c5156b 85 return volts/10;
bonchenko 0:cf3dc3c5156b 86 }
bonchenko 0:cf3dc3c5156b 87
bonchenko 0:cf3dc3c5156b 88 long ADE7758::IRMS(char phase)
bonchenko 0:cf3dc3c5156b 89 {
bonchenko 0:cf3dc3c5156b 90 char i=0;
bonchenko 0:cf3dc3c5156b 91 long current=0;
bonchenko 0:cf3dc3c5156b 92 getIRMS(phase);//Ignore first reading
bonchenko 0:cf3dc3c5156b 93 for(i=0;i<10;++i){
bonchenko 0:cf3dc3c5156b 94 current+=getIRMS(phase);
bonchenko 0:cf3dc3c5156b 95 wait_us(50);
bonchenko 0:cf3dc3c5156b 96 }
bonchenko 0:cf3dc3c5156b 97 //average
bonchenko 0:cf3dc3c5156b 98 return current/10;
bonchenko 0:cf3dc3c5156b 99 }
bonchenko 0:cf3dc3c5156b 100
bonchenko 1:f5e8c8591449 101
bonchenko 1:f5e8c8591449 102 float ADE7758::CalculateIRMS(char phase) {
bonchenko 1:f5e8c8591449 103 if ( phase == PHASE_A ) {
bonchenko 1:f5e8c8591449 104 return IRMS(phase) * 0.00000967;
bonchenko 1:f5e8c8591449 105 }
bonchenko 1:f5e8c8591449 106 else if ( phase == PHASE_B ) {
bonchenko 1:f5e8c8591449 107 return IRMS(phase) * 0.00000955;
bonchenko 1:f5e8c8591449 108 }
bonchenko 1:f5e8c8591449 109 else if ( phase == PHASE_C ) {
bonchenko 1:f5e8c8591449 110 return IRMS(phase) * 0.00000958;
bonchenko 1:f5e8c8591449 111 }
bonchenko 1:f5e8c8591449 112 }
bonchenko 1:f5e8c8591449 113
bonchenko 1:f5e8c8591449 114 float ADE7758::CalculateVRMS(char phase) {
bonchenko 1:f5e8c8591449 115 if ( phase == PHASE_A ) {
bonchenko 1:f5e8c8591449 116 return VRMS(phase) * 0.000158;
bonchenko 1:f5e8c8591449 117 }
bonchenko 1:f5e8c8591449 118 else if ( phase == PHASE_B ) {
bonchenko 1:f5e8c8591449 119 return VRMS(phase) * 0.000157;
bonchenko 1:f5e8c8591449 120 }
bonchenko 1:f5e8c8591449 121 else if ( phase == PHASE_C ) {
bonchenko 1:f5e8c8591449 122 return VRMS(phase) * 0.000156;
bonchenko 1:f5e8c8591449 123 }
bonchenko 1:f5e8c8591449 124 }
bonchenko 1:f5e8c8591449 125
bonchenko 0:cf3dc3c5156b 126 void accumulateEnergy()
bonchenko 0:cf3dc3c5156b 127 {
bonchenko 0:cf3dc3c5156b 128
bonchenko 0:cf3dc3c5156b 129 }
bonchenko 0:cf3dc3c5156b 130
bonchenko 0:cf3dc3c5156b 131 long ADE7758::waveform(char phase,char source)
bonchenko 0:cf3dc3c5156b 132 {
bonchenko 0:cf3dc3c5156b 133 return 1;
bonchenko 0:cf3dc3c5156b 134 }
bonchenko 0:cf3dc3c5156b 135
bonchenko 0:cf3dc3c5156b 136 void ADE7758::powerOff()
bonchenko 0:cf3dc3c5156b 137 {
bonchenko 0:cf3dc3c5156b 138
bonchenko 0:cf3dc3c5156b 139 }
bonchenko 0:cf3dc3c5156b 140
bonchenko 0:cf3dc3c5156b 141 void ADE7758::powerON()
bonchenko 0:cf3dc3c5156b 142 {
bonchenko 0:cf3dc3c5156b 143
bonchenko 0:cf3dc3c5156b 144 }
bonchenko 0:cf3dc3c5156b 145
bonchenko 0:cf3dc3c5156b 146 void ADE7758::sleep()
bonchenko 0:cf3dc3c5156b 147 {
bonchenko 0:cf3dc3c5156b 148
bonchenko 0:cf3dc3c5156b 149 }
bonchenko 0:cf3dc3c5156b 150
bonchenko 0:cf3dc3c5156b 151 void ADE7758::wakeUp()
bonchenko 0:cf3dc3c5156b 152 {
bonchenko 0:cf3dc3c5156b 153
bonchenko 0:cf3dc3c5156b 154 }
bonchenko 0:cf3dc3c5156b 155
bonchenko 0:cf3dc3c5156b 156 long ADE7758::getInterruptStatus(void){
bonchenko 0:cf3dc3c5156b 157 return read24bits(STATUS);
bonchenko 0:cf3dc3c5156b 158 }
bonchenko 0:cf3dc3c5156b 159
bonchenko 0:cf3dc3c5156b 160
bonchenko 0:cf3dc3c5156b 161 long ADE7758::getResetInterruptStatus(void){
bonchenko 0:cf3dc3c5156b 162 return read24bits(RSTATUS);
bonchenko 0:cf3dc3c5156b 163 }
bonchenko 0:cf3dc3c5156b 164
bonchenko 0:cf3dc3c5156b 165
bonchenko 0:cf3dc3c5156b 166 int ADE7758::lineFreq(char phase){
bonchenko 0:cf3dc3c5156b 167 uint8_t mmode;
bonchenko 0:cf3dc3c5156b 168 mmode = read8bits(MMODE);
bonchenko 0:cf3dc3c5156b 169 write8bits(MMODE,(mmode&0x11111100 )| phase);
bonchenko 0:cf3dc3c5156b 170 wait_ms(10);
bonchenko 0:cf3dc3c5156b 171 return read16bits(FREQ);
bonchenko 0:cf3dc3c5156b 172 }
bonchenko 0:cf3dc3c5156b 173 // private
bonchenko 0:cf3dc3c5156b 174
bonchenko 0:cf3dc3c5156b 175 void ADE7758::enableChip()
bonchenko 0:cf3dc3c5156b 176 {
bonchenko 0:cf3dc3c5156b 177 _ADESS = 0;
bonchenko 0:cf3dc3c5156b 178 }
bonchenko 0:cf3dc3c5156b 179
bonchenko 0:cf3dc3c5156b 180 void ADE7758::disableChip()
bonchenko 0:cf3dc3c5156b 181 {
bonchenko 0:cf3dc3c5156b 182 _ADESS = 1;
bonchenko 0:cf3dc3c5156b 183 }
bonchenko 0:cf3dc3c5156b 184
bonchenko 0:cf3dc3c5156b 185 void ADE7758::write8bits(char reg, unsigned char data)
bonchenko 0:cf3dc3c5156b 186 {
bonchenko 0:cf3dc3c5156b 187 enableChip();
bonchenko 0:cf3dc3c5156b 188
bonchenko 0:cf3dc3c5156b 189 wait_ms(10);
bonchenko 0:cf3dc3c5156b 190 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 0:cf3dc3c5156b 191 wait_ms(2);
bonchenko 0:cf3dc3c5156b 192
bonchenko 0:cf3dc3c5156b 193 _ADE7758SPI.write(data);
bonchenko 0:cf3dc3c5156b 194
bonchenko 0:cf3dc3c5156b 195 wait_ms(1);
bonchenko 0:cf3dc3c5156b 196
bonchenko 0:cf3dc3c5156b 197 disableChip();
bonchenko 0:cf3dc3c5156b 198 }
bonchenko 0:cf3dc3c5156b 199
bonchenko 0:cf3dc3c5156b 200 void ADE7758::write16bits(char reg, unsigned int data)
bonchenko 0:cf3dc3c5156b 201 {
bonchenko 0:cf3dc3c5156b 202 enableChip();
bonchenko 0:cf3dc3c5156b 203
bonchenko 0:cf3dc3c5156b 204 wait_ms(10);
bonchenko 0:cf3dc3c5156b 205 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 0:cf3dc3c5156b 206 wait_ms(2);
bonchenko 0:cf3dc3c5156b 207 _ADE7758SPI.write((unsigned char)((data>>8)&0xFF));
bonchenko 0:cf3dc3c5156b 208 wait_ms(2);
bonchenko 0:cf3dc3c5156b 209 _ADE7758SPI.write((unsigned char)(data&0xFF));
bonchenko 0:cf3dc3c5156b 210 wait_ms(1);
bonchenko 0:cf3dc3c5156b 211
bonchenko 0:cf3dc3c5156b 212 disableChip();
bonchenko 0:cf3dc3c5156b 213 }
bonchenko 0:cf3dc3c5156b 214
bonchenko 1:f5e8c8591449 215 void ADE7758::write24bits(char reg, unsigned int data)
bonchenko 1:f5e8c8591449 216 {
bonchenko 1:f5e8c8591449 217 enableChip();
bonchenko 1:f5e8c8591449 218
bonchenko 1:f5e8c8591449 219 wait_ms(10);
bonchenko 1:f5e8c8591449 220 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 1:f5e8c8591449 221 wait_ms(2);
bonchenko 1:f5e8c8591449 222 _ADE7758SPI.write((unsigned char)((data>>16)&0xFF));
bonchenko 1:f5e8c8591449 223 wait_ms(2);
bonchenko 1:f5e8c8591449 224 _ADE7758SPI.write((unsigned char)((data>>8)&0xFF));
bonchenko 1:f5e8c8591449 225 wait_ms(2);
bonchenko 1:f5e8c8591449 226 _ADE7758SPI.write((unsigned char)(data&0xFF));
bonchenko 1:f5e8c8591449 227 wait_ms(1);
bonchenko 1:f5e8c8591449 228
bonchenko 1:f5e8c8591449 229 disableChip();
bonchenko 1:f5e8c8591449 230 }
bonchenko 1:f5e8c8591449 231
bonchenko 0:cf3dc3c5156b 232 unsigned char ADE7758::read8bits(char reg)
bonchenko 0:cf3dc3c5156b 233 {
bonchenko 0:cf3dc3c5156b 234 enableChip();
bonchenko 0:cf3dc3c5156b 235
bonchenko 0:cf3dc3c5156b 236 unsigned char ret;
bonchenko 0:cf3dc3c5156b 237 wait_ms(10);
bonchenko 0:cf3dc3c5156b 238 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 239 wait_ms(2);
bonchenko 0:cf3dc3c5156b 240 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 241 wait_ms(1);
bonchenko 0:cf3dc3c5156b 242
bonchenko 0:cf3dc3c5156b 243 disableChip();
bonchenko 0:cf3dc3c5156b 244
bonchenko 0:cf3dc3c5156b 245 return ret;
bonchenko 0:cf3dc3c5156b 246 }
bonchenko 0:cf3dc3c5156b 247
bonchenko 0:cf3dc3c5156b 248 unsigned int ADE7758::read16bits(char reg)
bonchenko 0:cf3dc3c5156b 249 {
bonchenko 0:cf3dc3c5156b 250 enableChip();
bonchenko 0:cf3dc3c5156b 251 unsigned int ret=0;
bonchenko 0:cf3dc3c5156b 252 unsigned char ret0=0;
bonchenko 0:cf3dc3c5156b 253 wait_ms(10);
bonchenko 0:cf3dc3c5156b 254 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 255 wait_ms(2);
bonchenko 0:cf3dc3c5156b 256 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 257 wait_ms(2);
bonchenko 0:cf3dc3c5156b 258 ret0=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 259 wait_ms(1);
bonchenko 0:cf3dc3c5156b 260
bonchenko 0:cf3dc3c5156b 261 disableChip();
bonchenko 0:cf3dc3c5156b 262 ret= (ret<<8)|ret0;
bonchenko 0:cf3dc3c5156b 263 return ret;
bonchenko 0:cf3dc3c5156b 264 }
bonchenko 0:cf3dc3c5156b 265
bonchenko 0:cf3dc3c5156b 266 unsigned long ADE7758::read24bits(char reg)
bonchenko 0:cf3dc3c5156b 267 {
bonchenko 0:cf3dc3c5156b 268 enableChip();
bonchenko 0:cf3dc3c5156b 269 unsigned long ret=0;
bonchenko 0:cf3dc3c5156b 270 unsigned int ret1=0;
bonchenko 0:cf3dc3c5156b 271 unsigned char ret0=0;
bonchenko 0:cf3dc3c5156b 272 wait_ms(10);
bonchenko 0:cf3dc3c5156b 273 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 274 wait_ms(2);
bonchenko 0:cf3dc3c5156b 275 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 276 wait_ms(2);
bonchenko 0:cf3dc3c5156b 277 ret1=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 278 wait_ms(2);
bonchenko 0:cf3dc3c5156b 279 ret0=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 280 wait_ms(1);
bonchenko 0:cf3dc3c5156b 281
bonchenko 0:cf3dc3c5156b 282 disableChip();
bonchenko 1:f5e8c8591449 283 ret= (ret<<16)|(ret1<<8)| ret0;
bonchenko 0:cf3dc3c5156b 284 return ret;
bonchenko 0:cf3dc3c5156b 285 }
bonchenko 0:cf3dc3c5156b 286
bonchenko 0:cf3dc3c5156b 287 long ADE7758::getIRMS(char phase)
bonchenko 0:cf3dc3c5156b 288 {
bonchenko 0:cf3dc3c5156b 289 return read24bits(AIRMS+phase);
bonchenko 0:cf3dc3c5156b 290 }
bonchenko 0:cf3dc3c5156b 291
bonchenko 0:cf3dc3c5156b 292 long ADE7758::getVRMS(char phase)
bonchenko 0:cf3dc3c5156b 293 {
bonchenko 0:cf3dc3c5156b 294 return read24bits(AVRMS+phase);
bonchenko 0:cf3dc3c5156b 295 }
bonchenko 0:cf3dc3c5156b 296
bonchenko 0:cf3dc3c5156b 297 // ADE7758 ADE(mosi, miso, sclk, cs);