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 20 04:11:14 2015 +0000
Revision:
5:ea599a829b0b
Child:
6:513b3b5750de
Initial public publish - can get VRMS, IRMS, Active and Apparent Energy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bonchenko 5:ea599a829b0b 1 #include "mbed.h"
bonchenko 5:ea599a829b0b 2 #include "ade7758.h"
bonchenko 5:ea599a829b0b 3
bonchenko 5:ea599a829b0b 4 #define AIRMSOFFSET 0xFB1
bonchenko 5:ea599a829b0b 5 #define BIRMSOFFSET 0xFB0
bonchenko 5:ea599a829b0b 6 #define CIRMSOFFSET 0xFB1
bonchenko 5:ea599a829b0b 7 #define AVRMSOFFSET 0xFFB
bonchenko 5:ea599a829b0b 8 #define BVRMSOFFSET 0x2
bonchenko 5:ea599a829b0b 9 #define CVRMSOFFSET 0xFFF
bonchenko 5:ea599a829b0b 10
bonchenko 5:ea599a829b0b 11 Serial DBG(PA_9, PA_10); // tx, rx
bonchenko 5:ea599a829b0b 12 ADE7758 ADE(PB_5, PD_2, PB_4, PB_6, PB_7);
bonchenko 5:ea599a829b0b 13
bonchenko 5:ea599a829b0b 14 void printBytes(long input, uint8_t numBits);
bonchenko 5:ea599a829b0b 15 bool CALIBRATE = true;
bonchenko 5:ea599a829b0b 16
bonchenko 5:ea599a829b0b 17 float AWattHr, BWattHr, CWattHr, AVAHr, BVAHr, CVAHr;
bonchenko 5:ea599a829b0b 18
bonchenko 5:ea599a829b0b 19 void ade_main() {
bonchenko 5:ea599a829b0b 20 DBG.baud(115200);
bonchenko 5:ea599a829b0b 21 DBG.format(8,Serial::None,1);
bonchenko 5:ea599a829b0b 22 DBG.printf("Starting...\r\n");
bonchenko 5:ea599a829b0b 23
bonchenko 5:ea599a829b0b 24 ADE.begin();
bonchenko 5:ea599a829b0b 25
bonchenko 5:ea599a829b0b 26 if (CALIBRATE) {
bonchenko 5:ea599a829b0b 27 DBG.printf("Calibrating...\r\n");
bonchenko 5:ea599a829b0b 28 ADE.calibrateVI(20);
bonchenko 5:ea599a829b0b 29 DBG.printf("V calibration: %.2f, %.2f, %.2f\r\n", ADE.AVRMSCalib, ADE.BVRMSCalib, ADE.CVRMSCalib);
bonchenko 5:ea599a829b0b 30 DBG.printf("I calibration: %.2f, %.2f, %.2f\r\n", ADE.AIRMSCalib, ADE.BIRMSCalib, ADE.CIRMSCalib);
bonchenko 5:ea599a829b0b 31 ADE.writeRMSOffset(AIRMSOFFSET, BIRMSOFFSET, CIRMSOFFSET, AVRMSOFFSET, BVRMSOFFSET, CVRMSOFFSET);
bonchenko 5:ea599a829b0b 32 ADE.calibrateGain(PHASE_A);
bonchenko 5:ea599a829b0b 33 DBG.printf("Watt gain calibration: %.5f, %.5f, %.5f\r\n", ADE.AWGCalib, ADE.BWGCalib, ADE.CWGCalib);
bonchenko 5:ea599a829b0b 34 DBG.printf("VA gain calibration: %.5f, %.5f, %.5f\r\n", ADE.AVAGCalib, ADE.BVAGCalib, ADE.CVAGCalib);
bonchenko 5:ea599a829b0b 35 DBG.printf("Wh/LSB: %.8f, %.8f, %.8f\r\n", ADE.AWhLSB, ADE.BWhLSB, ADE.CWhLSB);
bonchenko 5:ea599a829b0b 36 DBG.printf("VAh/LSB: %.8f, %.8f, %.8f\r\n", ADE.AVAhLSB, ADE.BVAhLSB, ADE.CVAhLSB);
bonchenko 5:ea599a829b0b 37 }
bonchenko 5:ea599a829b0b 38
bonchenko 5:ea599a829b0b 39 DBG.printf("Start measurement\r\n");
bonchenko 5:ea599a829b0b 40
bonchenko 5:ea599a829b0b 41 while(1) {
bonchenko 5:ea599a829b0b 42 DBG.printf("VRMS for each phase: %.2f, %.2f, %.2f\r\n", ADE.calculateVRMS(PHASE_A), ADE.calculateVRMS(PHASE_B), ADE.calculateVRMS(PHASE_C));
bonchenko 5:ea599a829b0b 43 DBG.printf("IRMS for each phase: %.2f, %.2f, %.2f\r\n", ADE.calculateIRMS(PHASE_A), ADE.calculateIRMS(PHASE_B), ADE.calculateIRMS(PHASE_C));
bonchenko 5:ea599a829b0b 44 ADE.getEnergy(PHASE_A, 1, &AWattHr, &BWattHr, &CWattHr, &AVAHr, &BVAHr, &CVAHr);
bonchenko 5:ea599a829b0b 45 DBG.printf("WattHR for each phase: %.2f, %.2f, %.2f\r\n", AWattHr, BWattHr, CWattHr);
bonchenko 5:ea599a829b0b 46 DBG.printf("VAHR for each phase: %.2f, %.2f, %.2f\r\n", AVAHr, BVAHr, CVAHr);
bonchenko 5:ea599a829b0b 47 DBG.printf("\r\n");
bonchenko 5:ea599a829b0b 48 wait(10);
bonchenko 5:ea599a829b0b 49 }
bonchenko 5:ea599a829b0b 50 }
bonchenko 5:ea599a829b0b 51
bonchenko 5:ea599a829b0b 52 void printBytes(long input, uint8_t numBits) {
bonchenko 5:ea599a829b0b 53 for (int i = numBits-1; i >= 0; i--) {
bonchenko 5:ea599a829b0b 54 DBG.printf("%d", ((input >> i) & 1));
bonchenko 5:ea599a829b0b 55 }
bonchenko 5:ea599a829b0b 56 }