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 10:12:27 2015 +0000
Revision:
2:ea36884772ae
Parent:
1:f5e8c8591449
Child:
3:4fad91cf047a
Calibrate gain using PCFNUM and PCFDEN

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 2:ea36884772ae 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 2:ea36884772ae 42 CIRMSCalib = CIRMSBuffer/numSamples;
bonchenko 2:ea36884772ae 43
bonchenko 2:ea36884772ae 44 // Collect for ITEST & VNOM, IMIN & VMIN
bonchenko 2:ea36884772ae 45 // Calculate these values in an Excel sheet according to page
bonchenko 2:ea36884772ae 46 // Write the results to the xIRMSOS and xVRMSOS registers
bonchenko 2:ea36884772ae 47 // write16bits(AIRMSOS, 0xF5B); // Current channel A
bonchenko 2:ea36884772ae 48 // write16bits(BIRMSOS, 0xF52); // Current channel B
bonchenko 2:ea36884772ae 49 // write16bits(CIRMSOS, 0xF6C); // Current channel C
bonchenko 2:ea36884772ae 50 write16bits(AVRMSOS, 0xF5B); // Voltage channel A
bonchenko 2:ea36884772ae 51 write16bits(BVRMSOS, 0xF52); // Voltage channel B
bonchenko 2:ea36884772ae 52 write16bits(CVRMSOS, 0xF6C); // Voltage channel C
bonchenko 2:ea36884772ae 53 }
bonchenko 2:ea36884772ae 54
bonchenko 2:ea36884772ae 55 void ADE7758::calibrateGain(char phase) { // see datasheet ADE 7758 page 49 of 72
bonchenko 2:ea36884772ae 56 // 1. Clear xWG, xVARG, xVAG
bonchenko 2:ea36884772ae 57 write16bits(AWG, 0x0000);
bonchenko 2:ea36884772ae 58 write16bits(BWG, 0x0000);
bonchenko 2:ea36884772ae 59 write16bits(CWG, 0x0000);
bonchenko 2:ea36884772ae 60 write16bits(AVARG, 0x0000);
bonchenko 2:ea36884772ae 61 write16bits(BVARG, 0x0000);
bonchenko 2:ea36884772ae 62 write16bits(CVARG, 0x0000);
bonchenko 2:ea36884772ae 63 write16bits(AVAG, 0x0000);
bonchenko 2:ea36884772ae 64 write16bits(BVAG, 0x0000);
bonchenko 2:ea36884772ae 65 write16bits(CVAG, 0x0000);
bonchenko 2:ea36884772ae 66
bonchenko 2:ea36884772ae 67 // 2. Select phase for line period measurement
bonchenko 2:ea36884772ae 68 lineFreq(phase);
bonchenko 2:ea36884772ae 69
bonchenko 2:ea36884772ae 70 // 3. Configure LCYCMODE register with 0xBF
bonchenko 2:ea36884772ae 71 write8bits(LCYCMODE, 0xBF);
bonchenko 2:ea36884772ae 72
bonchenko 2:ea36884772ae 73 // 4. Set number of half line cycles
bonchenko 2:ea36884772ae 74 write16bits(LINECYC, 0x800);
bonchenko 2:ea36884772ae 75
bonchenko 2:ea36884772ae 76 // 5. Set LENERGY bit in MASK register for interrupt
bonchenko 2:ea36884772ae 77 uint16_t mask;
bonchenko 2:ea36884772ae 78 mask = read16bits(MASK);
bonchenko 2:ea36884772ae 79 write24bits(MASK, mask | (1<<LENERGY));
bonchenko 2:ea36884772ae 80 wait_ms(10);
bonchenko 2:ea36884772ae 81
bonchenko 2:ea36884772ae 82 // 6. Environment setting
bonchenko 2:ea36884772ae 83 // set environment - ITEST and VNOM
bonchenko 2:ea36884772ae 84
bonchenko 2:ea36884772ae 85 // 7. Reset RSTATUS
bonchenko 2:ea36884772ae 86 read24bits(RSTATUS);
bonchenko 2:ea36884772ae 87
bonchenko 2:ea36884772ae 88 // 8. Wait LENERGY interrupt and read 6 energy registers
bonchenko 2:ea36884772ae 89 while ( _ADEINT != 0 ) { } // wait until INT go low
bonchenko 2:ea36884772ae 90 int AWATTHRTemp = getWattHR(PHASE_A);
bonchenko 2:ea36884772ae 91 int AVAHRTemp = getVAHR(PHASE_A);
bonchenko 2:ea36884772ae 92 int BWATTHRTemp = getWattHR(PHASE_B);
bonchenko 2:ea36884772ae 93 int BVAHRTemp = getVAHR(PHASE_B);
bonchenko 2:ea36884772ae 94 int CWATTHRTemp = getWattHR(PHASE_C);
bonchenko 2:ea36884772ae 95 int CVAHRTemp = getVAHR(PHASE_C);
bonchenko 2:ea36884772ae 96
bonchenko 2:ea36884772ae 97 // 9. Write xWG and xVAG
bonchenko 2:ea36884772ae 98 // Calculate expected WattHr
bonchenko 2:ea36884772ae 99 int APCFDENVal = read16bits(APCFDEN);
bonchenko 2:ea36884772ae 100 int APCFNUMVal = read16bits(APCFNUM);
bonchenko 2:ea36884772ae 101 int WDIVVal = read8bits(WDIV);
bonchenko 2:ea36884772ae 102 int VARCFDENVal = read16bits(VARCFDEN);
bonchenko 2:ea36884772ae 103 int VARCFNUMVal = read16bits(VARCFNUM);
bonchenko 2:ea36884772ae 104 int VADIVVal = read8bits(VADIV);
bonchenko 2:ea36884772ae 105
bonchenko 2:ea36884772ae 106 float AccumTime = getAccumulationTime();
bonchenko 2:ea36884772ae 107 float tempWH = ((4*3200*0.6*220*1*AccumTime)/(1000*3600));
bonchenko 2:ea36884772ae 108 float WattHRExpected = tempWH * (APCFDENVal/APCFNUMVal) * (1/WDIVVal);
bonchenko 2:ea36884772ae 109 float VAHRExpected = tempWH * (VARCFDENVal/VARCFNUMVal) * (1/VADIVVal);
bonchenko 2:ea36884772ae 110
bonchenko 2:ea36884772ae 111 // 9a. Calculate xWG values
bonchenko 2:ea36884772ae 112 int AWGValue = ((WattHRExpected/AWATTHRTemp) - 1)*4096;
bonchenko 2:ea36884772ae 113 int BWGValue = ((WattHRExpected/BWATTHRTemp) - 1)*4096;
bonchenko 2:ea36884772ae 114 int CWGValue = ((WattHRExpected/CWATTHRTemp) - 1)*4096;
bonchenko 2:ea36884772ae 115
bonchenko 2:ea36884772ae 116 // 9b. Calculate xVAG values
bonchenko 2:ea36884772ae 117 int AVAGValue = ((VAHRExpected/AVAHRTemp) - 1)*4096;
bonchenko 2:ea36884772ae 118 int BVAGValue = ((VAHRExpected/BVAHRTemp) - 1)*4096;
bonchenko 2:ea36884772ae 119 int CVAGValue = ((VAHRExpected/CVAHRTemp) - 1)*4096;
bonchenko 2:ea36884772ae 120
bonchenko 2:ea36884772ae 121 // 10. Write the values to xWG and xVAG
bonchenko 2:ea36884772ae 122 write16bits(AWG, AWGValue);
bonchenko 2:ea36884772ae 123 write16bits(BWG, BWGValue);
bonchenko 2:ea36884772ae 124 write16bits(CWG, CWGValue);
bonchenko 2:ea36884772ae 125 write16bits(AVAG, AVAGValue);
bonchenko 2:ea36884772ae 126 write16bits(BVAG, BVAGValue);
bonchenko 2:ea36884772ae 127 write16bits(CVAG, CVAGValue);
bonchenko 2:ea36884772ae 128 }
bonchenko 2:ea36884772ae 129
bonchenko 2:ea36884772ae 130 float ADE7758::getAccumulationTime() {
bonchenko 2:ea36884772ae 131 uint16_t frequency = lineFreq(phase);
bonchenko 2:ea36884772ae 132 uint16_t LineCYC = read16bits(LINECYC);
bonchenko 2:ea36884772ae 133 write8bits(LCYCMODE, 0xBF);
bonchenko 2:ea36884772ae 134 float LineFrequency = 1/(frequency*0.0000096);
bonchenko 2:ea36884772ae 135 return LineCYC/(2*LineFrequency*3);
bonchenko 0:cf3dc3c5156b 136 }
bonchenko 0:cf3dc3c5156b 137
bonchenko 0:cf3dc3c5156b 138 int ADE7758::getWattHR(char phase)
bonchenko 0:cf3dc3c5156b 139 {
bonchenko 0:cf3dc3c5156b 140 return read16bits(AWATTHR+phase);
bonchenko 0:cf3dc3c5156b 141 }
bonchenko 0:cf3dc3c5156b 142
bonchenko 0:cf3dc3c5156b 143 int ADE7758::getVARHR(char phase)
bonchenko 0:cf3dc3c5156b 144 {
bonchenko 0:cf3dc3c5156b 145 return read16bits(AVARHR+phase);
bonchenko 0:cf3dc3c5156b 146 }
bonchenko 0:cf3dc3c5156b 147
bonchenko 0:cf3dc3c5156b 148 int ADE7758::getVAHR(char phase)
bonchenko 0:cf3dc3c5156b 149 {
bonchenko 0:cf3dc3c5156b 150 return read16bits(AVAHR+phase);
bonchenko 0:cf3dc3c5156b 151 }
bonchenko 0:cf3dc3c5156b 152
bonchenko 0:cf3dc3c5156b 153 int ADE7758::WattHR(char phase)
bonchenko 0:cf3dc3c5156b 154 {
bonchenko 2:ea36884772ae 155 return getWattHR(phase);
bonchenko 0:cf3dc3c5156b 156 }
bonchenko 0:cf3dc3c5156b 157
bonchenko 0:cf3dc3c5156b 158 int ADE7758::VARHR(char phase)
bonchenko 0:cf3dc3c5156b 159 {
bonchenko 2:ea36884772ae 160 return getVARHR(phase);
bonchenko 0:cf3dc3c5156b 161 }
bonchenko 0:cf3dc3c5156b 162
bonchenko 0:cf3dc3c5156b 163 int ADE7758::VAHR(char phase)
bonchenko 0:cf3dc3c5156b 164 {
bonchenko 2:ea36884772ae 165 return getVAHR(phase);
bonchenko 0:cf3dc3c5156b 166 }
bonchenko 0:cf3dc3c5156b 167
bonchenko 0:cf3dc3c5156b 168 long ADE7758::VRMS(char phase)
bonchenko 0:cf3dc3c5156b 169 {
bonchenko 2:ea36884772ae 170 char i=0;
bonchenko 2:ea36884772ae 171 long volts=0;
bonchenko 2:ea36884772ae 172 getVRMS(phase);//Ignore first reading
bonchenko 2:ea36884772ae 173 for(i=0;i<10;++i){
bonchenko 2:ea36884772ae 174 volts+=getVRMS(phase);
bonchenko 2:ea36884772ae 175 wait_us(50);
bonchenko 2:ea36884772ae 176 }
bonchenko 2:ea36884772ae 177 //average
bonchenko 2:ea36884772ae 178 return volts/10;
bonchenko 0:cf3dc3c5156b 179 }
bonchenko 0:cf3dc3c5156b 180
bonchenko 0:cf3dc3c5156b 181 long ADE7758::IRMS(char phase)
bonchenko 0:cf3dc3c5156b 182 {
bonchenko 0:cf3dc3c5156b 183 char i=0;
bonchenko 0:cf3dc3c5156b 184 long current=0;
bonchenko 0:cf3dc3c5156b 185 getIRMS(phase);//Ignore first reading
bonchenko 0:cf3dc3c5156b 186 for(i=0;i<10;++i){
bonchenko 0:cf3dc3c5156b 187 current+=getIRMS(phase);
bonchenko 0:cf3dc3c5156b 188 wait_us(50);
bonchenko 0:cf3dc3c5156b 189 }
bonchenko 0:cf3dc3c5156b 190 //average
bonchenko 0:cf3dc3c5156b 191 return current/10;
bonchenko 0:cf3dc3c5156b 192 }
bonchenko 0:cf3dc3c5156b 193
bonchenko 1:f5e8c8591449 194
bonchenko 2:ea36884772ae 195 float ADE7758::calculateIRMS(char phase) {
bonchenko 2:ea36884772ae 196 long IRMSBuffer = 0;
bonchenko 2:ea36884772ae 197 float AvgIRMS = 0;
bonchenko 2:ea36884772ae 198 for (char i=0; i<NUMSAMPLES; i++) {
bonchenko 2:ea36884772ae 199 IRMSBuffer += IRMS(phase);
bonchenko 2:ea36884772ae 200 }
bonchenko 2:ea36884772ae 201 AvgIRMS = IRMSBuffer/NUMSAMPLES;
bonchenko 2:ea36884772ae 202
bonchenko 1:f5e8c8591449 203 if ( phase == PHASE_A ) {
bonchenko 2:ea36884772ae 204 return AvgIRMS * 0.00000967;
bonchenko 1:f5e8c8591449 205 }
bonchenko 1:f5e8c8591449 206 else if ( phase == PHASE_B ) {
bonchenko 2:ea36884772ae 207 return AvgIRMS * 0.00000955;
bonchenko 1:f5e8c8591449 208 }
bonchenko 1:f5e8c8591449 209 else if ( phase == PHASE_C ) {
bonchenko 2:ea36884772ae 210 return AvgIRMS * 0.00000958;
bonchenko 1:f5e8c8591449 211 }
bonchenko 1:f5e8c8591449 212 }
bonchenko 1:f5e8c8591449 213
bonchenko 2:ea36884772ae 214 float ADE7758::calculateVRMS(char phase) {
bonchenko 2:ea36884772ae 215 long VRMSBuffer = 0;
bonchenko 2:ea36884772ae 216 float AvgVRMS = 0;
bonchenko 2:ea36884772ae 217 for (char i=0; i<NUMSAMPLES; i++) {
bonchenko 2:ea36884772ae 218 VRMSBuffer += VRMS(phase);
bonchenko 2:ea36884772ae 219 }
bonchenko 2:ea36884772ae 220 AvgVRMS = VRMSBuffer/NUMSAMPLES;
bonchenko 2:ea36884772ae 221
bonchenko 1:f5e8c8591449 222 if ( phase == PHASE_A ) {
bonchenko 2:ea36884772ae 223 return AvgVRMS * 0.000158;
bonchenko 1:f5e8c8591449 224 }
bonchenko 1:f5e8c8591449 225 else if ( phase == PHASE_B ) {
bonchenko 2:ea36884772ae 226 return AvgVRMS * 0.000157;
bonchenko 1:f5e8c8591449 227 }
bonchenko 1:f5e8c8591449 228 else if ( phase == PHASE_C ) {
bonchenko 2:ea36884772ae 229 return AvgVRMS * 0.000156;
bonchenko 2:ea36884772ae 230 }
bonchenko 1:f5e8c8591449 231 }
bonchenko 1:f5e8c8591449 232
bonchenko 2:ea36884772ae 233 void ADE7758::calculateEnergy()
bonchenko 0:cf3dc3c5156b 234 {
bonchenko 2:ea36884772ae 235 // 1. Set phase used for line zero cross detection
bonchenko 2:ea36884772ae 236 lineFreq(phase);
bonchenko 2:ea36884772ae 237
bonchenko 2:ea36884772ae 238 // 2. Configure LCYCMODE register with 0xBF
bonchenko 2:ea36884772ae 239 write8bits(LCYCMODE, 0xBF);
bonchenko 2:ea36884772ae 240
bonchenko 2:ea36884772ae 241 // 3. Set number of half line cycles
bonchenko 2:ea36884772ae 242 write16bits(LINECYC, 0x800);
bonchenko 2:ea36884772ae 243
bonchenko 2:ea36884772ae 244 // 4. Set LENERGY bit in MASK register for interrupt
bonchenko 2:ea36884772ae 245 uint16_t mask;
bonchenko 2:ea36884772ae 246 mask = read16bits(MASK);
bonchenko 2:ea36884772ae 247 write24bits(MASK, mask | (1<<LENERGY));
bonchenko 2:ea36884772ae 248 wait_ms(10);
bonchenko 2:ea36884772ae 249
bonchenko 2:ea36884772ae 250 // 5. Reset RSTATUS
bonchenko 2:ea36884772ae 251 read24bits(RSTATUS);
bonchenko 0:cf3dc3c5156b 252
bonchenko 2:ea36884772ae 253 // 6. Wait LENERGY interrupt and read 6 energy registers
bonchenko 2:ea36884772ae 254 while ( _ADEINT != 0 ) { } // wait until INT go low
bonchenko 2:ea36884772ae 255 AWATTHRValue = getWattHR(PHASE_A);
bonchenko 2:ea36884772ae 256 AVAHRValue = getVAHR(PHASE_A);
bonchenko 2:ea36884772ae 257 BWATTHRValue = getWattHR(PHASE_B);
bonchenko 2:ea36884772ae 258 BVAHRValue = getVAHR(PHASE_B);
bonchenko 2:ea36884772ae 259 CWATTHRValue = getWattHR(PHASE_C);
bonchenko 2:ea36884772ae 260 CVAHRValue = getVAHR(PHASE_C);
bonchenko 0:cf3dc3c5156b 261 }
bonchenko 0:cf3dc3c5156b 262
bonchenko 0:cf3dc3c5156b 263 long ADE7758::waveform(char phase,char source)
bonchenko 0:cf3dc3c5156b 264 {
bonchenko 0:cf3dc3c5156b 265 return 1;
bonchenko 0:cf3dc3c5156b 266 }
bonchenko 0:cf3dc3c5156b 267
bonchenko 0:cf3dc3c5156b 268 void ADE7758::powerOff()
bonchenko 0:cf3dc3c5156b 269 {
bonchenko 0:cf3dc3c5156b 270
bonchenko 0:cf3dc3c5156b 271 }
bonchenko 0:cf3dc3c5156b 272
bonchenko 0:cf3dc3c5156b 273 void ADE7758::powerON()
bonchenko 0:cf3dc3c5156b 274 {
bonchenko 0:cf3dc3c5156b 275
bonchenko 0:cf3dc3c5156b 276 }
bonchenko 0:cf3dc3c5156b 277
bonchenko 0:cf3dc3c5156b 278 void ADE7758::sleep()
bonchenko 0:cf3dc3c5156b 279 {
bonchenko 0:cf3dc3c5156b 280
bonchenko 0:cf3dc3c5156b 281 }
bonchenko 0:cf3dc3c5156b 282
bonchenko 0:cf3dc3c5156b 283 void ADE7758::wakeUp()
bonchenko 0:cf3dc3c5156b 284 {
bonchenko 0:cf3dc3c5156b 285
bonchenko 0:cf3dc3c5156b 286 }
bonchenko 0:cf3dc3c5156b 287
bonchenko 0:cf3dc3c5156b 288 long ADE7758::getInterruptStatus(void){
bonchenko 0:cf3dc3c5156b 289 return read24bits(STATUS);
bonchenko 0:cf3dc3c5156b 290 }
bonchenko 0:cf3dc3c5156b 291
bonchenko 0:cf3dc3c5156b 292 long ADE7758::getResetInterruptStatus(void){
bonchenko 0:cf3dc3c5156b 293 return read24bits(RSTATUS);
bonchenko 0:cf3dc3c5156b 294 }
bonchenko 0:cf3dc3c5156b 295
bonchenko 0:cf3dc3c5156b 296 int ADE7758::lineFreq(char phase){
bonchenko 0:cf3dc3c5156b 297 uint8_t mmode;
bonchenko 0:cf3dc3c5156b 298 mmode = read8bits(MMODE);
bonchenko 2:ea36884772ae 299 write8bits(MMODE,( mmode&0xFC )| phase);
bonchenko 0:cf3dc3c5156b 300 wait_ms(10);
bonchenko 0:cf3dc3c5156b 301 return read16bits(FREQ);
bonchenko 0:cf3dc3c5156b 302 }
bonchenko 0:cf3dc3c5156b 303 // private
bonchenko 0:cf3dc3c5156b 304
bonchenko 0:cf3dc3c5156b 305 void ADE7758::enableChip()
bonchenko 0:cf3dc3c5156b 306 {
bonchenko 0:cf3dc3c5156b 307 _ADESS = 0;
bonchenko 0:cf3dc3c5156b 308 }
bonchenko 0:cf3dc3c5156b 309
bonchenko 0:cf3dc3c5156b 310 void ADE7758::disableChip()
bonchenko 0:cf3dc3c5156b 311 {
bonchenko 0:cf3dc3c5156b 312 _ADESS = 1;
bonchenko 0:cf3dc3c5156b 313 }
bonchenko 0:cf3dc3c5156b 314
bonchenko 0:cf3dc3c5156b 315 void ADE7758::write8bits(char reg, unsigned char data)
bonchenko 0:cf3dc3c5156b 316 {
bonchenko 0:cf3dc3c5156b 317 enableChip();
bonchenko 0:cf3dc3c5156b 318
bonchenko 0:cf3dc3c5156b 319 wait_ms(10);
bonchenko 0:cf3dc3c5156b 320 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 0:cf3dc3c5156b 321 wait_ms(2);
bonchenko 0:cf3dc3c5156b 322
bonchenko 0:cf3dc3c5156b 323 _ADE7758SPI.write(data);
bonchenko 0:cf3dc3c5156b 324
bonchenko 0:cf3dc3c5156b 325 wait_ms(1);
bonchenko 0:cf3dc3c5156b 326
bonchenko 0:cf3dc3c5156b 327 disableChip();
bonchenko 0:cf3dc3c5156b 328 }
bonchenko 0:cf3dc3c5156b 329
bonchenko 0:cf3dc3c5156b 330 void ADE7758::write16bits(char reg, unsigned int data)
bonchenko 0:cf3dc3c5156b 331 {
bonchenko 0:cf3dc3c5156b 332 enableChip();
bonchenko 0:cf3dc3c5156b 333
bonchenko 0:cf3dc3c5156b 334 wait_ms(10);
bonchenko 0:cf3dc3c5156b 335 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 0:cf3dc3c5156b 336 wait_ms(2);
bonchenko 0:cf3dc3c5156b 337 _ADE7758SPI.write((unsigned char)((data>>8)&0xFF));
bonchenko 0:cf3dc3c5156b 338 wait_ms(2);
bonchenko 0:cf3dc3c5156b 339 _ADE7758SPI.write((unsigned char)(data&0xFF));
bonchenko 0:cf3dc3c5156b 340 wait_ms(1);
bonchenko 0:cf3dc3c5156b 341
bonchenko 0:cf3dc3c5156b 342 disableChip();
bonchenko 0:cf3dc3c5156b 343 }
bonchenko 0:cf3dc3c5156b 344
bonchenko 1:f5e8c8591449 345 void ADE7758::write24bits(char reg, unsigned int data)
bonchenko 1:f5e8c8591449 346 {
bonchenko 1:f5e8c8591449 347 enableChip();
bonchenko 1:f5e8c8591449 348
bonchenko 1:f5e8c8591449 349 wait_ms(10);
bonchenko 1:f5e8c8591449 350 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 1:f5e8c8591449 351 wait_ms(2);
bonchenko 1:f5e8c8591449 352 _ADE7758SPI.write((unsigned char)((data>>16)&0xFF));
bonchenko 1:f5e8c8591449 353 wait_ms(2);
bonchenko 1:f5e8c8591449 354 _ADE7758SPI.write((unsigned char)((data>>8)&0xFF));
bonchenko 1:f5e8c8591449 355 wait_ms(2);
bonchenko 1:f5e8c8591449 356 _ADE7758SPI.write((unsigned char)(data&0xFF));
bonchenko 1:f5e8c8591449 357 wait_ms(1);
bonchenko 1:f5e8c8591449 358
bonchenko 1:f5e8c8591449 359 disableChip();
bonchenko 1:f5e8c8591449 360 }
bonchenko 1:f5e8c8591449 361
bonchenko 0:cf3dc3c5156b 362 unsigned char ADE7758::read8bits(char reg)
bonchenko 0:cf3dc3c5156b 363 {
bonchenko 0:cf3dc3c5156b 364 enableChip();
bonchenko 0:cf3dc3c5156b 365
bonchenko 0:cf3dc3c5156b 366 unsigned char ret;
bonchenko 0:cf3dc3c5156b 367 wait_ms(10);
bonchenko 0:cf3dc3c5156b 368 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 369 wait_ms(2);
bonchenko 0:cf3dc3c5156b 370 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 371 wait_ms(1);
bonchenko 0:cf3dc3c5156b 372
bonchenko 0:cf3dc3c5156b 373 disableChip();
bonchenko 0:cf3dc3c5156b 374
bonchenko 0:cf3dc3c5156b 375 return ret;
bonchenko 0:cf3dc3c5156b 376 }
bonchenko 0:cf3dc3c5156b 377
bonchenko 0:cf3dc3c5156b 378 unsigned int ADE7758::read16bits(char reg)
bonchenko 0:cf3dc3c5156b 379 {
bonchenko 0:cf3dc3c5156b 380 enableChip();
bonchenko 0:cf3dc3c5156b 381 unsigned int ret=0;
bonchenko 0:cf3dc3c5156b 382 unsigned char ret0=0;
bonchenko 0:cf3dc3c5156b 383 wait_ms(10);
bonchenko 0:cf3dc3c5156b 384 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 385 wait_ms(2);
bonchenko 0:cf3dc3c5156b 386 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 387 wait_ms(2);
bonchenko 0:cf3dc3c5156b 388 ret0=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 389 wait_ms(1);
bonchenko 0:cf3dc3c5156b 390
bonchenko 0:cf3dc3c5156b 391 disableChip();
bonchenko 0:cf3dc3c5156b 392 ret= (ret<<8)|ret0;
bonchenko 0:cf3dc3c5156b 393 return ret;
bonchenko 0:cf3dc3c5156b 394 }
bonchenko 0:cf3dc3c5156b 395
bonchenko 0:cf3dc3c5156b 396 unsigned long ADE7758::read24bits(char reg)
bonchenko 0:cf3dc3c5156b 397 {
bonchenko 0:cf3dc3c5156b 398 enableChip();
bonchenko 0:cf3dc3c5156b 399 unsigned long ret=0;
bonchenko 0:cf3dc3c5156b 400 unsigned int ret1=0;
bonchenko 0:cf3dc3c5156b 401 unsigned char ret0=0;
bonchenko 0:cf3dc3c5156b 402 wait_ms(10);
bonchenko 0:cf3dc3c5156b 403 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 404 wait_ms(2);
bonchenko 0:cf3dc3c5156b 405 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 406 wait_ms(2);
bonchenko 0:cf3dc3c5156b 407 ret1=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 408 wait_ms(2);
bonchenko 0:cf3dc3c5156b 409 ret0=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 410 wait_ms(1);
bonchenko 0:cf3dc3c5156b 411
bonchenko 0:cf3dc3c5156b 412 disableChip();
bonchenko 1:f5e8c8591449 413 ret= (ret<<16)|(ret1<<8)| ret0;
bonchenko 0:cf3dc3c5156b 414 return ret;
bonchenko 0:cf3dc3c5156b 415 }
bonchenko 0:cf3dc3c5156b 416
bonchenko 0:cf3dc3c5156b 417 long ADE7758::getIRMS(char phase)
bonchenko 0:cf3dc3c5156b 418 {
bonchenko 0:cf3dc3c5156b 419 return read24bits(AIRMS+phase);
bonchenko 0:cf3dc3c5156b 420 }
bonchenko 0:cf3dc3c5156b 421
bonchenko 0:cf3dc3c5156b 422 long ADE7758::getVRMS(char phase)
bonchenko 0:cf3dc3c5156b 423 {
bonchenko 0:cf3dc3c5156b 424 return read24bits(AVRMS+phase);
bonchenko 0:cf3dc3c5156b 425 }
bonchenko 0:cf3dc3c5156b 426
bonchenko 0:cf3dc3c5156b 427 // ADE7758 ADE(mosi, miso, sclk, cs);