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:
Mon Apr 13 02:40:41 2015 +0000
Revision:
3:4fad91cf047a
Parent:
2:ea36884772ae
Child:
4:5547bb32eb32
Energy gain 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 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 3:4fad91cf047a 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 3:4fad91cf047a 97 // 9. Calculate Wh/LSB and VAh/LSB
bonchenko 3:4fad91cf047a 98 float accumTime = getAccumulationTime(PHASE_A);
bonchenko 3:4fad91cf047a 99 float tempEnergy = ITEST*VNOM*accumTime;
bonchenko 3:4fad91cf047a 100 AWhLSB = tempEnergy/(3600*AWATTHRTemp);
bonchenko 3:4fad91cf047a 101 BWhLSB = tempEnergy/(3600*BWATTHRTemp);
bonchenko 3:4fad91cf047a 102 CWhLSB = tempEnergy/(3600*CWATTHRTemp);
bonchenko 3:4fad91cf047a 103 AVAhLSB = tempEnergy/(3600*AVAHRTemp);
bonchenko 3:4fad91cf047a 104 BVAhLSB = tempEnergy/(3600*BVAHRTemp);
bonchenko 3:4fad91cf047a 105 CVAhLSB = tempEnergy/(3600*CVAHRTemp);
bonchenko 2:ea36884772ae 106
bonchenko 3:4fad91cf047a 107 // 10. Wait LENERGY interrupt and read 6 energy registers
bonchenko 3:4fad91cf047a 108 while ( _ADEINT != 0 ) { } // wait until INT go low
bonchenko 3:4fad91cf047a 109 int AWHREXPECTED = getWattHR(PHASE_A);
bonchenko 3:4fad91cf047a 110 int AVAHREXPECTED = getVAHR(PHASE_A);
bonchenko 3:4fad91cf047a 111 int BWHREXPECTED = getWattHR(PHASE_B);
bonchenko 3:4fad91cf047a 112 int BVAHREXPECTED = getVAHR(PHASE_B);
bonchenko 3:4fad91cf047a 113 int CWHREXPECTED = getWattHR(PHASE_C);
bonchenko 3:4fad91cf047a 114 int CVAHREXPECTED = getVAHR(PHASE_C);
bonchenko 2:ea36884772ae 115
bonchenko 3:4fad91cf047a 116 // 11. Calculate xWG and xVAG values
bonchenko 3:4fad91cf047a 117 int AWGValue = ((AWHREXPECTED/AWATTHRTemp) - 1)*4096;
bonchenko 3:4fad91cf047a 118 int BWGValue = ((BWHREXPECTED/BWATTHRTemp) - 1)*4096;
bonchenko 3:4fad91cf047a 119 int CWGValue = ((CWHREXPECTED/CWATTHRTemp) - 1)*4096;
bonchenko 3:4fad91cf047a 120 int AVAGValue = ((AVAHREXPECTED/AVAHRTemp) - 1)*4096;
bonchenko 3:4fad91cf047a 121 int BVAGValue = ((BVAHREXPECTED/BVAHRTemp) - 1)*4096;
bonchenko 3:4fad91cf047a 122 int CVAGValue = ((CVAHREXPECTED/CVAHRTemp) - 1)*4096;
bonchenko 2:ea36884772ae 123
bonchenko 2:ea36884772ae 124 // 10. Write the values to xWG and xVAG
bonchenko 2:ea36884772ae 125 write16bits(AWG, AWGValue);
bonchenko 2:ea36884772ae 126 write16bits(BWG, BWGValue);
bonchenko 2:ea36884772ae 127 write16bits(CWG, CWGValue);
bonchenko 2:ea36884772ae 128 write16bits(AVAG, AVAGValue);
bonchenko 2:ea36884772ae 129 write16bits(BVAG, BVAGValue);
bonchenko 2:ea36884772ae 130 write16bits(CVAG, CVAGValue);
bonchenko 2:ea36884772ae 131 }
bonchenko 2:ea36884772ae 132
bonchenko 3:4fad91cf047a 133 float ADE7758::getAccumulationTime(char phase) {
bonchenko 2:ea36884772ae 134 uint16_t frequency = lineFreq(phase);
bonchenko 2:ea36884772ae 135 uint16_t LineCYC = read16bits(LINECYC);
bonchenko 2:ea36884772ae 136 write8bits(LCYCMODE, 0xBF);
bonchenko 2:ea36884772ae 137 float LineFrequency = 1/(frequency*0.0000096);
bonchenko 2:ea36884772ae 138 return LineCYC/(2*LineFrequency*3);
bonchenko 0:cf3dc3c5156b 139 }
bonchenko 0:cf3dc3c5156b 140
bonchenko 0:cf3dc3c5156b 141 int ADE7758::getWattHR(char phase)
bonchenko 0:cf3dc3c5156b 142 {
bonchenko 0:cf3dc3c5156b 143 return read16bits(AWATTHR+phase);
bonchenko 0:cf3dc3c5156b 144 }
bonchenko 0:cf3dc3c5156b 145
bonchenko 0:cf3dc3c5156b 146 int ADE7758::getVARHR(char phase)
bonchenko 0:cf3dc3c5156b 147 {
bonchenko 0:cf3dc3c5156b 148 return read16bits(AVARHR+phase);
bonchenko 0:cf3dc3c5156b 149 }
bonchenko 0:cf3dc3c5156b 150
bonchenko 0:cf3dc3c5156b 151 int ADE7758::getVAHR(char phase)
bonchenko 0:cf3dc3c5156b 152 {
bonchenko 0:cf3dc3c5156b 153 return read16bits(AVAHR+phase);
bonchenko 0:cf3dc3c5156b 154 }
bonchenko 0:cf3dc3c5156b 155
bonchenko 0:cf3dc3c5156b 156 int ADE7758::WattHR(char phase)
bonchenko 0:cf3dc3c5156b 157 {
bonchenko 2:ea36884772ae 158 return getWattHR(phase);
bonchenko 0:cf3dc3c5156b 159 }
bonchenko 0:cf3dc3c5156b 160
bonchenko 0:cf3dc3c5156b 161 int ADE7758::VARHR(char phase)
bonchenko 0:cf3dc3c5156b 162 {
bonchenko 2:ea36884772ae 163 return getVARHR(phase);
bonchenko 0:cf3dc3c5156b 164 }
bonchenko 0:cf3dc3c5156b 165
bonchenko 0:cf3dc3c5156b 166 int ADE7758::VAHR(char phase)
bonchenko 0:cf3dc3c5156b 167 {
bonchenko 2:ea36884772ae 168 return getVAHR(phase);
bonchenko 0:cf3dc3c5156b 169 }
bonchenko 0:cf3dc3c5156b 170
bonchenko 0:cf3dc3c5156b 171 long ADE7758::VRMS(char phase)
bonchenko 0:cf3dc3c5156b 172 {
bonchenko 2:ea36884772ae 173 char i=0;
bonchenko 2:ea36884772ae 174 long volts=0;
bonchenko 2:ea36884772ae 175 getVRMS(phase);//Ignore first reading
bonchenko 2:ea36884772ae 176 for(i=0;i<10;++i){
bonchenko 2:ea36884772ae 177 volts+=getVRMS(phase);
bonchenko 2:ea36884772ae 178 wait_us(50);
bonchenko 2:ea36884772ae 179 }
bonchenko 2:ea36884772ae 180 //average
bonchenko 2:ea36884772ae 181 return volts/10;
bonchenko 0:cf3dc3c5156b 182 }
bonchenko 0:cf3dc3c5156b 183
bonchenko 0:cf3dc3c5156b 184 long ADE7758::IRMS(char phase)
bonchenko 0:cf3dc3c5156b 185 {
bonchenko 0:cf3dc3c5156b 186 char i=0;
bonchenko 0:cf3dc3c5156b 187 long current=0;
bonchenko 0:cf3dc3c5156b 188 getIRMS(phase);//Ignore first reading
bonchenko 0:cf3dc3c5156b 189 for(i=0;i<10;++i){
bonchenko 0:cf3dc3c5156b 190 current+=getIRMS(phase);
bonchenko 0:cf3dc3c5156b 191 wait_us(50);
bonchenko 0:cf3dc3c5156b 192 }
bonchenko 0:cf3dc3c5156b 193 //average
bonchenko 0:cf3dc3c5156b 194 return current/10;
bonchenko 0:cf3dc3c5156b 195 }
bonchenko 0:cf3dc3c5156b 196
bonchenko 1:f5e8c8591449 197
bonchenko 2:ea36884772ae 198 float ADE7758::calculateIRMS(char phase) {
bonchenko 2:ea36884772ae 199 long IRMSBuffer = 0;
bonchenko 2:ea36884772ae 200 float AvgIRMS = 0;
bonchenko 2:ea36884772ae 201 for (char i=0; i<NUMSAMPLES; i++) {
bonchenko 2:ea36884772ae 202 IRMSBuffer += IRMS(phase);
bonchenko 2:ea36884772ae 203 }
bonchenko 2:ea36884772ae 204 AvgIRMS = IRMSBuffer/NUMSAMPLES;
bonchenko 2:ea36884772ae 205
bonchenko 1:f5e8c8591449 206 if ( phase == PHASE_A ) {
bonchenko 2:ea36884772ae 207 return AvgIRMS * 0.00000967;
bonchenko 1:f5e8c8591449 208 }
bonchenko 1:f5e8c8591449 209 else if ( phase == PHASE_B ) {
bonchenko 2:ea36884772ae 210 return AvgIRMS * 0.00000955;
bonchenko 1:f5e8c8591449 211 }
bonchenko 1:f5e8c8591449 212 else if ( phase == PHASE_C ) {
bonchenko 2:ea36884772ae 213 return AvgIRMS * 0.00000958;
bonchenko 1:f5e8c8591449 214 }
bonchenko 3:4fad91cf047a 215 else { return 0; }
bonchenko 1:f5e8c8591449 216 }
bonchenko 1:f5e8c8591449 217
bonchenko 2:ea36884772ae 218 float ADE7758::calculateVRMS(char phase) {
bonchenko 2:ea36884772ae 219 long VRMSBuffer = 0;
bonchenko 2:ea36884772ae 220 float AvgVRMS = 0;
bonchenko 2:ea36884772ae 221 for (char i=0; i<NUMSAMPLES; i++) {
bonchenko 2:ea36884772ae 222 VRMSBuffer += VRMS(phase);
bonchenko 2:ea36884772ae 223 }
bonchenko 2:ea36884772ae 224 AvgVRMS = VRMSBuffer/NUMSAMPLES;
bonchenko 2:ea36884772ae 225
bonchenko 1:f5e8c8591449 226 if ( phase == PHASE_A ) {
bonchenko 2:ea36884772ae 227 return AvgVRMS * 0.000158;
bonchenko 1:f5e8c8591449 228 }
bonchenko 1:f5e8c8591449 229 else if ( phase == PHASE_B ) {
bonchenko 2:ea36884772ae 230 return AvgVRMS * 0.000157;
bonchenko 1:f5e8c8591449 231 }
bonchenko 1:f5e8c8591449 232 else if ( phase == PHASE_C ) {
bonchenko 2:ea36884772ae 233 return AvgVRMS * 0.000156;
bonchenko 2:ea36884772ae 234 }
bonchenko 3:4fad91cf047a 235 else { return 0; }
bonchenko 1:f5e8c8591449 236 }
bonchenko 1:f5e8c8591449 237
bonchenko 3:4fad91cf047a 238 void ADE7758::calculateEnergy(char phase)
bonchenko 0:cf3dc3c5156b 239 {
bonchenko 2:ea36884772ae 240 // 1. Set phase used for line zero cross detection
bonchenko 2:ea36884772ae 241 lineFreq(phase);
bonchenko 2:ea36884772ae 242
bonchenko 2:ea36884772ae 243 // 2. Configure LCYCMODE register with 0xBF
bonchenko 2:ea36884772ae 244 write8bits(LCYCMODE, 0xBF);
bonchenko 2:ea36884772ae 245
bonchenko 2:ea36884772ae 246 // 3. Set number of half line cycles
bonchenko 2:ea36884772ae 247 write16bits(LINECYC, 0x800);
bonchenko 2:ea36884772ae 248
bonchenko 2:ea36884772ae 249 // 4. Set LENERGY bit in MASK register for interrupt
bonchenko 2:ea36884772ae 250 uint16_t mask;
bonchenko 2:ea36884772ae 251 mask = read16bits(MASK);
bonchenko 2:ea36884772ae 252 write24bits(MASK, mask | (1<<LENERGY));
bonchenko 2:ea36884772ae 253 wait_ms(10);
bonchenko 2:ea36884772ae 254
bonchenko 2:ea36884772ae 255 // 5. Reset RSTATUS
bonchenko 2:ea36884772ae 256 read24bits(RSTATUS);
bonchenko 0:cf3dc3c5156b 257
bonchenko 2:ea36884772ae 258 // 6. Wait LENERGY interrupt and read 6 energy registers
bonchenko 2:ea36884772ae 259 while ( _ADEINT != 0 ) { } // wait until INT go low
bonchenko 3:4fad91cf047a 260 int AWATTHRValue = getWattHR(PHASE_A);
bonchenko 3:4fad91cf047a 261 int AVAHRValue = getVAHR(PHASE_A);
bonchenko 3:4fad91cf047a 262 int BWATTHRValue = getWattHR(PHASE_B);
bonchenko 3:4fad91cf047a 263 int BVAHRValue = getVAHR(PHASE_B);
bonchenko 3:4fad91cf047a 264 int CWATTHRValue = getWattHR(PHASE_C);
bonchenko 3:4fad91cf047a 265 int CVAHRValue = getVAHR(PHASE_C);
bonchenko 0:cf3dc3c5156b 266 }
bonchenko 0:cf3dc3c5156b 267
bonchenko 0:cf3dc3c5156b 268 long ADE7758::waveform(char phase,char source)
bonchenko 0:cf3dc3c5156b 269 {
bonchenko 0:cf3dc3c5156b 270 return 1;
bonchenko 0:cf3dc3c5156b 271 }
bonchenko 0:cf3dc3c5156b 272
bonchenko 0:cf3dc3c5156b 273 void ADE7758::powerOff()
bonchenko 0:cf3dc3c5156b 274 {
bonchenko 0:cf3dc3c5156b 275
bonchenko 0:cf3dc3c5156b 276 }
bonchenko 0:cf3dc3c5156b 277
bonchenko 0:cf3dc3c5156b 278 void ADE7758::powerON()
bonchenko 0:cf3dc3c5156b 279 {
bonchenko 0:cf3dc3c5156b 280
bonchenko 0:cf3dc3c5156b 281 }
bonchenko 0:cf3dc3c5156b 282
bonchenko 0:cf3dc3c5156b 283 void ADE7758::sleep()
bonchenko 0:cf3dc3c5156b 284 {
bonchenko 0:cf3dc3c5156b 285
bonchenko 0:cf3dc3c5156b 286 }
bonchenko 0:cf3dc3c5156b 287
bonchenko 0:cf3dc3c5156b 288 void ADE7758::wakeUp()
bonchenko 0:cf3dc3c5156b 289 {
bonchenko 0:cf3dc3c5156b 290
bonchenko 0:cf3dc3c5156b 291 }
bonchenko 0:cf3dc3c5156b 292
bonchenko 0:cf3dc3c5156b 293 long ADE7758::getInterruptStatus(void){
bonchenko 0:cf3dc3c5156b 294 return read24bits(STATUS);
bonchenko 0:cf3dc3c5156b 295 }
bonchenko 0:cf3dc3c5156b 296
bonchenko 0:cf3dc3c5156b 297 long ADE7758::getResetInterruptStatus(void){
bonchenko 0:cf3dc3c5156b 298 return read24bits(RSTATUS);
bonchenko 0:cf3dc3c5156b 299 }
bonchenko 0:cf3dc3c5156b 300
bonchenko 0:cf3dc3c5156b 301 int ADE7758::lineFreq(char phase){
bonchenko 0:cf3dc3c5156b 302 uint8_t mmode;
bonchenko 0:cf3dc3c5156b 303 mmode = read8bits(MMODE);
bonchenko 2:ea36884772ae 304 write8bits(MMODE,( mmode&0xFC )| phase);
bonchenko 0:cf3dc3c5156b 305 wait_ms(10);
bonchenko 0:cf3dc3c5156b 306 return read16bits(FREQ);
bonchenko 0:cf3dc3c5156b 307 }
bonchenko 0:cf3dc3c5156b 308 // private
bonchenko 0:cf3dc3c5156b 309
bonchenko 0:cf3dc3c5156b 310 void ADE7758::enableChip()
bonchenko 0:cf3dc3c5156b 311 {
bonchenko 0:cf3dc3c5156b 312 _ADESS = 0;
bonchenko 0:cf3dc3c5156b 313 }
bonchenko 0:cf3dc3c5156b 314
bonchenko 0:cf3dc3c5156b 315 void ADE7758::disableChip()
bonchenko 0:cf3dc3c5156b 316 {
bonchenko 0:cf3dc3c5156b 317 _ADESS = 1;
bonchenko 0:cf3dc3c5156b 318 }
bonchenko 0:cf3dc3c5156b 319
bonchenko 0:cf3dc3c5156b 320 void ADE7758::write8bits(char reg, unsigned char data)
bonchenko 0:cf3dc3c5156b 321 {
bonchenko 0:cf3dc3c5156b 322 enableChip();
bonchenko 0:cf3dc3c5156b 323
bonchenko 0:cf3dc3c5156b 324 wait_ms(10);
bonchenko 0:cf3dc3c5156b 325 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 0:cf3dc3c5156b 326 wait_ms(2);
bonchenko 0:cf3dc3c5156b 327
bonchenko 0:cf3dc3c5156b 328 _ADE7758SPI.write(data);
bonchenko 0:cf3dc3c5156b 329
bonchenko 0:cf3dc3c5156b 330 wait_ms(1);
bonchenko 0:cf3dc3c5156b 331
bonchenko 0:cf3dc3c5156b 332 disableChip();
bonchenko 0:cf3dc3c5156b 333 }
bonchenko 0:cf3dc3c5156b 334
bonchenko 0:cf3dc3c5156b 335 void ADE7758::write16bits(char reg, unsigned int data)
bonchenko 0:cf3dc3c5156b 336 {
bonchenko 0:cf3dc3c5156b 337 enableChip();
bonchenko 0:cf3dc3c5156b 338
bonchenko 0:cf3dc3c5156b 339 wait_ms(10);
bonchenko 0:cf3dc3c5156b 340 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 0:cf3dc3c5156b 341 wait_ms(2);
bonchenko 0:cf3dc3c5156b 342 _ADE7758SPI.write((unsigned char)((data>>8)&0xFF));
bonchenko 0:cf3dc3c5156b 343 wait_ms(2);
bonchenko 0:cf3dc3c5156b 344 _ADE7758SPI.write((unsigned char)(data&0xFF));
bonchenko 0:cf3dc3c5156b 345 wait_ms(1);
bonchenko 0:cf3dc3c5156b 346
bonchenko 0:cf3dc3c5156b 347 disableChip();
bonchenko 0:cf3dc3c5156b 348 }
bonchenko 0:cf3dc3c5156b 349
bonchenko 1:f5e8c8591449 350 void ADE7758::write24bits(char reg, unsigned int data)
bonchenko 1:f5e8c8591449 351 {
bonchenko 1:f5e8c8591449 352 enableChip();
bonchenko 1:f5e8c8591449 353
bonchenko 1:f5e8c8591449 354 wait_ms(10);
bonchenko 1:f5e8c8591449 355 _ADE7758SPI.write(REG_WRITE(reg));
bonchenko 1:f5e8c8591449 356 wait_ms(2);
bonchenko 1:f5e8c8591449 357 _ADE7758SPI.write((unsigned char)((data>>16)&0xFF));
bonchenko 1:f5e8c8591449 358 wait_ms(2);
bonchenko 1:f5e8c8591449 359 _ADE7758SPI.write((unsigned char)((data>>8)&0xFF));
bonchenko 1:f5e8c8591449 360 wait_ms(2);
bonchenko 1:f5e8c8591449 361 _ADE7758SPI.write((unsigned char)(data&0xFF));
bonchenko 1:f5e8c8591449 362 wait_ms(1);
bonchenko 1:f5e8c8591449 363
bonchenko 1:f5e8c8591449 364 disableChip();
bonchenko 1:f5e8c8591449 365 }
bonchenko 1:f5e8c8591449 366
bonchenko 0:cf3dc3c5156b 367 unsigned char ADE7758::read8bits(char reg)
bonchenko 0:cf3dc3c5156b 368 {
bonchenko 0:cf3dc3c5156b 369 enableChip();
bonchenko 0:cf3dc3c5156b 370
bonchenko 0:cf3dc3c5156b 371 unsigned char ret;
bonchenko 0:cf3dc3c5156b 372 wait_ms(10);
bonchenko 0:cf3dc3c5156b 373 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 374 wait_ms(2);
bonchenko 0:cf3dc3c5156b 375 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 376 wait_ms(1);
bonchenko 0:cf3dc3c5156b 377
bonchenko 0:cf3dc3c5156b 378 disableChip();
bonchenko 0:cf3dc3c5156b 379
bonchenko 0:cf3dc3c5156b 380 return ret;
bonchenko 0:cf3dc3c5156b 381 }
bonchenko 0:cf3dc3c5156b 382
bonchenko 0:cf3dc3c5156b 383 unsigned int ADE7758::read16bits(char reg)
bonchenko 0:cf3dc3c5156b 384 {
bonchenko 0:cf3dc3c5156b 385 enableChip();
bonchenko 0:cf3dc3c5156b 386 unsigned int ret=0;
bonchenko 0:cf3dc3c5156b 387 unsigned char ret0=0;
bonchenko 0:cf3dc3c5156b 388 wait_ms(10);
bonchenko 0:cf3dc3c5156b 389 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 390 wait_ms(2);
bonchenko 0:cf3dc3c5156b 391 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 392 wait_ms(2);
bonchenko 0:cf3dc3c5156b 393 ret0=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 394 wait_ms(1);
bonchenko 0:cf3dc3c5156b 395
bonchenko 0:cf3dc3c5156b 396 disableChip();
bonchenko 0:cf3dc3c5156b 397 ret= (ret<<8)|ret0;
bonchenko 0:cf3dc3c5156b 398 return ret;
bonchenko 0:cf3dc3c5156b 399 }
bonchenko 0:cf3dc3c5156b 400
bonchenko 0:cf3dc3c5156b 401 unsigned long ADE7758::read24bits(char reg)
bonchenko 0:cf3dc3c5156b 402 {
bonchenko 0:cf3dc3c5156b 403 enableChip();
bonchenko 0:cf3dc3c5156b 404 unsigned long ret=0;
bonchenko 0:cf3dc3c5156b 405 unsigned int ret1=0;
bonchenko 0:cf3dc3c5156b 406 unsigned char ret0=0;
bonchenko 0:cf3dc3c5156b 407 wait_ms(10);
bonchenko 0:cf3dc3c5156b 408 _ADE7758SPI.write(REG_READ(reg));
bonchenko 0:cf3dc3c5156b 409 wait_ms(2);
bonchenko 0:cf3dc3c5156b 410 ret=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 411 wait_ms(2);
bonchenko 0:cf3dc3c5156b 412 ret1=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 413 wait_ms(2);
bonchenko 0:cf3dc3c5156b 414 ret0=_ADE7758SPI.write(0x00);
bonchenko 0:cf3dc3c5156b 415 wait_ms(1);
bonchenko 0:cf3dc3c5156b 416
bonchenko 0:cf3dc3c5156b 417 disableChip();
bonchenko 1:f5e8c8591449 418 ret= (ret<<16)|(ret1<<8)| ret0;
bonchenko 0:cf3dc3c5156b 419 return ret;
bonchenko 0:cf3dc3c5156b 420 }
bonchenko 0:cf3dc3c5156b 421
bonchenko 0:cf3dc3c5156b 422 long ADE7758::getIRMS(char phase)
bonchenko 0:cf3dc3c5156b 423 {
bonchenko 0:cf3dc3c5156b 424 return read24bits(AIRMS+phase);
bonchenko 0:cf3dc3c5156b 425 }
bonchenko 0:cf3dc3c5156b 426
bonchenko 0:cf3dc3c5156b 427 long ADE7758::getVRMS(char phase)
bonchenko 0:cf3dc3c5156b 428 {
bonchenko 0:cf3dc3c5156b 429 return read24bits(AVRMS+phase);
bonchenko 0:cf3dc3c5156b 430 }
bonchenko 0:cf3dc3c5156b 431
bonchenko 0:cf3dc3c5156b 432 // ADE7758 ADE(mosi, miso, sclk, cs);