SparkFun Qwiic Current Sensor - ADE7953  v1.0.0-3-g9a02684
Arduino Library for the SparkFun Qwiic Current Sensor (ADE7953)
Loading...
Searching...
No Matches
sfDevADE7953.h
Go to the documentation of this file.
1
20#pragma once
21
22#include <stdint.h>
23
24// SparkFun Toolkit core headers
25#include <sfTk/sfToolkit.h>
26#include <sfTk/sfTkII2C.h>
27
29// PGA Gain Values
34typedef enum sfe_ade7953_pga_gain_t : uint8_t
35{
43
45// Zero-Crossing Edge Selection
48typedef enum sfe_ade7953_zx_edge_t : uint8_t
49{
55
57// Current Clamp Presets
63typedef enum sfe_ade7953_clamp_t : uint8_t
64{
68
70// CONFIG Register Bitfield (Address 0x102)
74{
75 struct
76 {
77 uint16_t intEnA : 1;
78 uint16_t intEnB : 1;
79 uint16_t hpfEn : 1;
80 uint16_t pfMode : 1;
81 uint16_t revpCF : 1;
82 uint16_t revpPulse : 1;
83 uint16_t zxLPF : 1;
84 uint16_t swRst : 1;
85 uint16_t crcEn : 1;
86 uint16_t : 2;
87 uint16_t zxI : 1;
88 uint16_t zxEdge : 2;
89 uint16_t : 1;
90 uint16_t commLock : 1;
91 };
92 uint16_t word;
93};
94
96// LCYCMODE Register Bitfield (Address 0x004)
100{
101 struct
102 {
103 uint8_t aLWatt : 1;
104 uint8_t bLWatt : 1;
105 uint8_t aLVar : 1;
106 uint8_t bLVar : 1;
107 uint8_t aLVa : 1;
108 uint8_t bLVa : 1;
109 uint8_t rstRead : 1;
110 uint8_t : 1;
111 };
112 uint8_t byte;
113};
114
116// DISNOLOAD Register Bitfield (Address 0x001)
120{
121 struct
122 {
123 uint8_t disAP : 1;
124 uint8_t disVAR : 1;
125 uint8_t disVA : 1;
126 uint8_t : 5;
127 };
128 uint8_t byte;
129};
130
132// IRQ Register Bitfield
133// Used with IRQENA/IRQSTATA (Channel A) and IRQENB/IRQSTATB (Channel B).
134// Channel B interrupts use bits [13:0] only — bits [21:14] are Channel A / voltage only.
138{
139 struct
140 {
141 uint32_t aehf : 1;
142 uint32_t varehf : 1;
143 uint32_t vaehf : 1;
144 uint32_t aeof : 1;
145 uint32_t vareof : 1;
146 uint32_t vaeof : 1;
147 uint32_t apNoLoad : 1;
148 uint32_t varNoLoad : 1;
149 uint32_t vaNoLoad : 1;
150 uint32_t apSign : 1;
151 uint32_t varSign : 1;
152 uint32_t zxToI : 1;
153 uint32_t zxI : 1;
154 uint32_t oI : 1;
155 uint32_t zxToV : 1;
156 uint32_t zxV : 1;
157 uint32_t oV : 1;
158 uint32_t wSmp : 1;
159 uint32_t cycEnd : 1;
160 uint32_t sag : 1;
161 uint32_t reset : 1;
162 uint32_t crc : 1;
163 uint32_t : 10;
164 };
165 uint32_t word;
166};
167
169// Class Declaration
171
179{
180 public:
182 {
183 }
184
191 sfTkError_t begin(sfTkIBus *theBus = nullptr);
192
195 bool isConnected(void);
196
197 // ========================= Identity & Setup ===========================
198
202 sfTkError_t getVersion(uint8_t &version);
203
209 sfTkError_t reset(void);
210
214 sfTkError_t setWriteProtect(uint8_t protect);
215
219 sfTkError_t getWriteProtect(uint8_t &protect);
220
221 // ======================== PGA Gain Configuration ======================
222
226 sfTkError_t setGainIA(sfe_ade7953_pga_gain_t gain);
227
231 sfTkError_t getGainIA(sfe_ade7953_pga_gain_t &gain);
232
236 sfTkError_t setGainIB(sfe_ade7953_pga_gain_t gain);
237
241 sfTkError_t getGainIB(sfe_ade7953_pga_gain_t &gain);
242
248 sfTkError_t setGainV(sfe_ade7953_pga_gain_t gain);
249
253 sfTkError_t getGainV(sfe_ade7953_pga_gain_t &gain);
254
258 sfTkError_t setDigitalGainIA(uint32_t gain);
259
264 sfTkError_t setDigitalGainIA(float multiplier);
265
269 sfTkError_t getDigitalGainIA(uint32_t &gain);
270
274 sfTkError_t getDigitalGainIA(float &multiplier);
275
279 sfTkError_t setDigitalGainIB(uint32_t gain);
280
284 sfTkError_t setDigitalGainIB(float multiplier);
285
289 sfTkError_t getDigitalGainIB(uint32_t &gain);
290
294 sfTkError_t getDigitalGainIB(float &multiplier);
295
296 // ======================= Current Measurement ==========================
297
301 sfTkError_t getIRMSA(uint32_t &value);
302
306 sfTkError_t getIRMSB(uint32_t &value);
307
314 sfTkError_t getCurrentA(float &amps);
315
319 sfTkError_t getCurrentB(float &amps);
320
324 sfTkError_t getInstantaneousIA(int32_t &value);
325
329 sfTkError_t getInstantaneousIB(int32_t &value);
330
331 // =================== Current Conversion Calibration ===================
332
339 sfTkError_t setCurrentClamp(sfe_ade7953_clamp_t clamp);
340
346 sfTkError_t setCurrentClampA(sfe_ade7953_clamp_t clamp);
347
353 sfTkError_t setCurrentClampB(sfe_ade7953_clamp_t clamp);
354
359 void setCurrentClamp(float turnsRatio);
360
365 void setCurrentClampA(float turnsRatio);
366
371 void setCurrentClampB(float turnsRatio);
372
377 void setCurrentTransformerRatio(float ratio);
378
381 void setCurrentTransformerRatioA(float ratio);
382
385 void setCurrentTransformerRatioB(float ratio);
386
389 float getCurrentTransformerRatio(void);
390
393 float getCurrentTransformerRatioA(void);
394
397 float getCurrentTransformerRatioB(void);
398
401 void setBurdenResistor(float ohms);
402
405 float getBurdenResistor(void);
406
416 sfTkError_t autoCalibrateA(uint16_t numSamples = 50);
417
421 sfTkError_t autoCalibrateB(uint16_t numSamples = 50);
422
424 void clearCalibration(void);
425
426 // ======================== Peak Detection ==============================
427
431 sfTkError_t getPeakIA(uint32_t &value);
432
436 sfTkError_t getPeakIB(uint32_t &value);
437
443 sfTkError_t readAndResetPeakIA(uint32_t &value);
444
448 sfTkError_t readAndResetPeakIB(uint32_t &value);
449
453 sfTkError_t setOvercurrentLevel(uint32_t level);
454
458 sfTkError_t getOvercurrentLevel(uint32_t &level);
459
460 // ====================== Calibration & Offset ==========================
461
468 sfTkError_t setIRMSOffsetA(int32_t offset);
469
473 sfTkError_t getIRMSOffsetA(int32_t &offset);
474
478 sfTkError_t setIRMSOffsetB(int32_t offset);
479
483 sfTkError_t getIRMSOffsetB(int32_t &offset);
484
485 // ======================= Zero-Crossing (ZX_I) =========================
486
490 sfTkError_t setZXISourceChannel(bool useChannelB);
491
495 sfTkError_t getZXISourceChannel(bool &useChannelB);
496
500 sfTkError_t setZXEdge(sfe_ade7953_zx_edge_t edge);
501
505 sfTkError_t getZXEdge(sfe_ade7953_zx_edge_t &edge);
506
510 sfTkError_t enableZXLPF(bool enable);
511
517 sfTkError_t enableHPF(bool enable);
518
522 sfTkError_t isHPFEnabled(bool &enabled);
523
527 sfTkError_t getPeriod(uint16_t &period);
528
529 // =========================== Interrupts ===============================
530
535
540
544 sfTkError_t getInterruptStatusA(sfe_ade7953_irq_reg_t &status);
545
552
558
563
567 sfTkError_t getInterruptStatusB(sfe_ade7953_irq_reg_t &status);
568
573
574 // ========================= No-Load Detection ==========================
575
580
585
586 // ====================== Line Cycle Accumulation =======================
587
592
597
601 sfTkError_t setLineCycleCount(uint16_t halfCycles);
602
606 sfTkError_t getLineCycleCount(uint16_t &halfCycles);
607
608 // ========================= Sag Detection ==============================
609
613 sfTkError_t setSagCycles(uint8_t cycles);
614
618 sfTkError_t getSagCycles(uint8_t &cycles);
619
623 sfTkError_t setSagLevel(uint32_t level);
624
628 sfTkError_t getSagLevel(uint32_t &level);
629
630 // ========================== Diagnostics ===============================
631
635 sfTkError_t getLastOperation(uint8_t &op);
636
640 sfTkError_t getLastAddress(uint16_t &address);
641
645 sfTkError_t getLastData8(uint8_t &data);
646
650 sfTkError_t getLastData16(uint16_t &data);
651
655 sfTkError_t getLastData32(uint32_t &data);
656
657 protected:
661 sfTkError_t applyDefaultConfig(void);
662
665
670 static void clampPreset(sfe_ade7953_clamp_t clamp, float &ratio, sfe_ade7953_pga_gain_t &gain);
671
674 static float removeBaseline(uint32_t reading, uint32_t baseline);
675
676 sfTkIBus *_theBus;
677
678 // --- Current-to-amps conversion parameters (sensible defaults for the Qwiic board) ---
679 float _ctRatioA = 2000.0f;
680 float _ctRatioB = 2000.0f;
681 float _burdenResistor = 5.6f;
682 float _fullScaleCode = 5928256.0f;
683 float _fullScaleVRMS = 0.35355f;
684
685 // --- Software no-load baselines set by autoCalibrate, removed in the squared domain ---
686 uint32_t _baselineA = 0;
687 uint32_t _baselineB = 0;
688
690 // I2C Addressing
692 static const uint8_t kI2CAddress = 0x38;
693
694 // 8-Bit Register Addresses (0x0xx)
695 static const uint16_t kRegSagCyc = 0x000;
696 static const uint16_t kRegDisNoLoad = 0x001;
697 static const uint16_t kRegLCycMode = 0x004;
698 static const uint16_t kRegPgaV = 0x007;
699 static const uint16_t kRegPgaIA = 0x008;
700 static const uint16_t kRegPgaIB = 0x009;
701 static const uint16_t kRegWriteProtect = 0x040;
702 static const uint16_t kRegLastOp = 0x0FD;
703 static const uint16_t kRegLastRwData8 = 0x0FF;
704 static const uint16_t kRegVersion = 0x702;
705 static const uint16_t kRegExRef = 0x800;
706 static const uint16_t kRegUnlock = 0x0FE;
707
708 // 16-Bit Register Addresses (0x1xx)
709 static const uint16_t kRegZXTout = 0x100;
710 static const uint16_t kRegLineCyc = 0x101;
711 static const uint16_t kRegConfig = 0x102;
712 static const uint16_t kRegCF1Den = 0x103;
713 static const uint16_t kRegCF2Den = 0x104;
714 static const uint16_t kRegCFMode = 0x107;
715 static const uint16_t kRegPhCalA = 0x108;
716 static const uint16_t kRegPhCalB = 0x109;
717 static const uint16_t kRegPFA = 0x10A;
718 static const uint16_t kRegPFB = 0x10B;
719 static const uint16_t kRegAngleA = 0x10C;
720 static const uint16_t kRegAngleB = 0x10D;
721 static const uint16_t kRegPeriod = 0x10E;
722 static const uint16_t kRegAltOutput = 0x110;
723 static const uint16_t kRegOptimize = 0x120;
724 static const uint16_t kRegLastAdd = 0x1FE;
725 static const uint16_t kRegLastRwData16 = 0x1FF;
726
727 // 32-Bit Register Addresses (0x3xx) -- valid data in lower 24 bits, upper 8 sign-extended
728 static const uint16_t kRegSagLvl = 0x300;
729 static const uint16_t kRegAccMode = 0x301;
730 static const uint16_t kRegApNoLoad = 0x303;
731 static const uint16_t kRegVarNoLoad = 0x304;
732 static const uint16_t kRegVaNoLoad = 0x305;
733 static const uint16_t kRegAVA = 0x310;
734 static const uint16_t kRegBVA = 0x311;
735 static const uint16_t kRegAWatt = 0x312;
736 static const uint16_t kRegBWatt = 0x313;
737 static const uint16_t kRegAVar = 0x314;
738 static const uint16_t kRegBVar = 0x315;
739 static const uint16_t kRegIA = 0x316;
740 static const uint16_t kRegIB = 0x317;
741 static const uint16_t kRegV = 0x318;
742 static const uint16_t kRegIRMSA = 0x31A;
743 static const uint16_t kRegIRMSB = 0x31B;
744 static const uint16_t kRegVRMS = 0x31C;
745 static const uint16_t kRegAEnergyA = 0x31E;
746 static const uint16_t kRegAEnergyB = 0x31F;
747 static const uint16_t kRegREnergyA = 0x320;
748 static const uint16_t kRegREnergyB = 0x321;
749 static const uint16_t kRegApEnergyA = 0x322;
750 static const uint16_t kRegApEnergyB = 0x323;
751 static const uint16_t kRegOvLvl = 0x324;
752 static const uint16_t kRegOiLvl = 0x325;
753 static const uint16_t kRegVPeak = 0x326;
754 static const uint16_t kRegRstVPeak = 0x327;
755 static const uint16_t kRegIAPeak = 0x328;
756 static const uint16_t kRegRstIAPeak = 0x329;
757 static const uint16_t kRegIBPeak = 0x32A;
758 static const uint16_t kRegRstIBPeak = 0x32B;
759 static const uint16_t kRegIrqEnA = 0x32C;
760 static const uint16_t kRegIrqStatA = 0x32D;
761 static const uint16_t kRegRstIrqStatA = 0x32E;
762 static const uint16_t kRegIrqEnB = 0x32F;
763 static const uint16_t kRegIrqStatB = 0x330;
764 static const uint16_t kRegRstIrqStatB = 0x331;
765 static const uint16_t kRegCRC = 0x37F;
766 static const uint16_t kRegAIGain = 0x380;
767 static const uint16_t kRegAVGain = 0x381;
768 static const uint16_t kRegAWGain = 0x382;
769 static const uint16_t kRegAVarGain = 0x383;
770 static const uint16_t kRegAVaGain = 0x384;
771 static const uint16_t kRegAIRMSOS = 0x386;
772 static const uint16_t kRegVRMSOS = 0x388;
773 static const uint16_t kRegAWattOS = 0x389;
774 static const uint16_t kRegAVarOS = 0x38A;
775 static const uint16_t kRegAVaOS = 0x38B;
776 static const uint16_t kRegBIGain = 0x38C;
777 static const uint16_t kRegBWGain = 0x38E;
778 static const uint16_t kRegBVarGain = 0x38F;
779 static const uint16_t kRegBVaGain = 0x390;
780 static const uint16_t kRegBIRMSOS = 0x392;
781 static const uint16_t kRegBWattOS = 0x395;
782 static const uint16_t kRegBVarOS = 0x396;
783 static const uint16_t kRegBVaOS = 0x397;
784 static const uint16_t kRegLastRwData32 = 0x3FF;
785
786 // Magic Values
787 static const uint8_t kUnlockKey = 0xAD;
788 static const uint16_t kOptimizeValue = 0x0030;
789 static const uint32_t kDigitalGainUnity = 0x400000;
790 static const uint32_t kDigitalGainMax = 0x7FFFFF;
791 static const uint8_t kLastOpRead = 0x35;
792 static const uint8_t kLastOpWrite = 0xCA;
793};
Platform-independent driver for the ADE7953 energy metering IC.
Definition: sfDevADE7953.h:179
sfTkError_t getIRMSB(uint32_t &value)
Read the raw IRMS value for Current Channel B.
Definition: sfDevADE7953.cpp:255
sfTkError_t setCurrentClampA(sfe_ade7953_clamp_t clamp)
Select a known current clamp for Channel A and apply its turns ratio and PGA gain.
Definition: sfDevADE7953.cpp:370
static const uint16_t kRegAccMode
Accumulation mode.
Definition: sfDevADE7953.h:729
sfTkError_t setInterruptEnableA(sfe_ade7953_irq_reg_t mask)
Set the interrupt enable mask for Channel A (and voltage).
Definition: sfDevADE7953.cpp:634
sfTkError_t setInterruptEnableB(sfe_ade7953_irq_reg_t mask)
Set the interrupt enable mask for Channel B.
Definition: sfDevADE7953.cpp:655
static const uint16_t kRegIrqEnB
Interrupt enable (Channel B)
Definition: sfDevADE7953.h:762
sfTkError_t getIRMSA(uint32_t &value)
Read the raw IRMS value for Current Channel A.
Definition: sfDevADE7953.cpp:250
static const uint16_t kRegAIGain
Current channel gain (Channel A)
Definition: sfDevADE7953.h:766
static const uint16_t kRegCFMode
CF output selection.
Definition: sfDevADE7953.h:714
static const uint16_t kRegBVarGain
Reactive power gain (Channel B)
Definition: sfDevADE7953.h:778
static const uint16_t kRegAVarGain
Reactive power gain (Channel A)
Definition: sfDevADE7953.h:769
sfTkError_t setLineCycleMode(sfe_ade7953_lcycmode_reg_t mode)
Set the line cycle accumulation mode register.
Definition: sfDevADE7953.cpp:689
sfTkError_t setGainIA(sfe_ade7953_pga_gain_t gain)
Set the PGA gain for Current Channel A.
Definition: sfDevADE7953.cpp:145
static const uint16_t kRegREnergyA
Reactive energy (Channel A)
Definition: sfDevADE7953.h:747
sfTkError_t getIRMSOffsetB(int32_t &offset)
Get the IRMS offset for Current Channel B.
Definition: sfDevADE7953.cpp:544
sfTkError_t getGainIA(sfe_ade7953_pga_gain_t &gain)
Get the PGA gain for Current Channel A.
Definition: sfDevADE7953.cpp:150
float getCurrentTransformerRatioA(void)
Get the configured CT turns ratio for Channel A.
Definition: sfDevADE7953.cpp:471
sfTkError_t getGainV(sfe_ade7953_pga_gain_t &gain)
Get the PGA gain for the voltage channel.
Definition: sfDevADE7953.cpp:180
sfTkError_t begin(sfTkIBus *theBus=nullptr)
Initialize the device driver with the given bus.
Definition: sfDevADE7953.cpp:26
void setBurdenResistor(float ohms)
Set the burden resistor value (in ohms) used by getCurrentA() / getCurrentB().
Definition: sfDevADE7953.cpp:481
sfTkError_t getLineCycleMode(sfe_ade7953_lcycmode_reg_t &mode)
Get the line cycle accumulation mode register.
Definition: sfDevADE7953.cpp:694
static const uint16_t kRegIA
Instantaneous current (Channel A)
Definition: sfDevADE7953.h:739
static const uint32_t kDigitalGainUnity
Digital gain register value for 1.0x.
Definition: sfDevADE7953.h:789
void setCurrentTransformerRatioA(float ratio)
Set the CT turns ratio used by getCurrentA() for Channel A.
Definition: sfDevADE7953.cpp:456
sfTkError_t setSagLevel(uint32_t level)
Set the sag voltage level threshold.
Definition: sfDevADE7953.cpp:721
static const uint16_t kRegV
Instantaneous voltage.
Definition: sfDevADE7953.h:741
sfTkError_t getLastData8(uint8_t &data)
Get the data from the last successful 8-bit register communication.
Definition: sfDevADE7953.cpp:743
sfTkError_t setGainIB(sfe_ade7953_pga_gain_t gain)
Set the PGA gain for Current Channel B.
Definition: sfDevADE7953.cpp:158
static const uint16_t kRegIrqStatA
Interrupt status (Channel A + voltage)
Definition: sfDevADE7953.h:760
sfTkError_t setCurrentClamp(sfe_ade7953_clamp_t clamp)
Select a known current clamp and apply its turns ratio and PGA gain to both channels.
Definition: sfDevADE7953.cpp:354
sfTkError_t getZXEdge(sfe_ade7953_zx_edge_t &edge)
Get the current zero-crossing edge selection.
Definition: sfDevADE7953.cpp:586
static const uint16_t kRegUnlock
Register unlock (write key to unlock 0x120)
Definition: sfDevADE7953.h:706
static const uint16_t kRegLineCyc
Half line cycles for line cycle accumulation.
Definition: sfDevADE7953.h:710
static const uint16_t kRegApNoLoad
Active power no-load level.
Definition: sfDevADE7953.h:730
uint32_t _baselineB
Channel B no-load IRMS baseline (raw counts).
Definition: sfDevADE7953.h:687
sfTkError_t getNoLoadDisable(sfe_ade7953_disnoload_reg_t &mask)
Get the no-load detection disable register.
Definition: sfDevADE7953.cpp:682
bool isConnected(void)
Check whether the ADE7953 is connected and responding.
Definition: sfDevADE7953.cpp:75
float getBurdenResistor(void)
Get the configured burden resistor value.
Definition: sfDevADE7953.cpp:486
static const uint16_t kRegVPeak
Voltage channel peak.
Definition: sfDevADE7953.h:753
uint32_t _baselineA
Channel A no-load IRMS baseline (raw counts).
Definition: sfDevADE7953.h:686
sfTkError_t getCurrentA(float &amps)
Read the RMS current on Channel A converted to amps.
Definition: sfDevADE7953.cpp:260
static const uint16_t kRegIrqStatB
Interrupt status (Channel B)
Definition: sfDevADE7953.h:763
sfDevADE7953()
Definition: sfDevADE7953.h:181
static const uint16_t kRegVersion
Silicon version number.
Definition: sfDevADE7953.h:704
sfTkError_t setZXEdge(sfe_ade7953_zx_edge_t edge)
Set the zero-crossing edge selection for interrupt generation.
Definition: sfDevADE7953.cpp:574
sfTkError_t getPeakIB(uint32_t &value)
Read the peak current value for Channel B.
Definition: sfDevADE7953.cpp:498
sfTkIBus * _theBus
Pointer to the communication bus device.
Definition: sfDevADE7953.h:676
static const uint16_t kRegVaNoLoad
Apparent power no-load level.
Definition: sfDevADE7953.h:732
static const uint16_t kRegPFB
Power factor (Channel B)
Definition: sfDevADE7953.h:718
static const uint16_t kRegExRef
Reference input config (0=internal, 1=external)
Definition: sfDevADE7953.h:705
static const uint16_t kRegLastRwData8
Last successful 8-bit register data.
Definition: sfDevADE7953.h:703
static const uint8_t kLastOpRead
Last operation was a read.
Definition: sfDevADE7953.h:791
static const uint16_t kRegAVGain
Voltage channel gain.
Definition: sfDevADE7953.h:767
sfTkError_t getPeakIA(uint32_t &value)
Read the peak current value for Channel A.
Definition: sfDevADE7953.cpp:493
float _ctRatioB
Channel B CT turns ratio (30A:15mA = 2000:1).
Definition: sfDevADE7953.h:680
sfTkError_t getInstantaneousIA(int32_t &value)
Read the instantaneous current sample for Channel A.
Definition: sfDevADE7953.cpp:303
static const uint16_t kRegOvLvl
Overvoltage level.
Definition: sfDevADE7953.h:751
sfTkError_t readAndResetPeakIB(uint32_t &value)
Read the peak current value for Channel B and clear it.
Definition: sfDevADE7953.cpp:509
sfTkError_t getWriteProtect(uint8_t &protect)
Get the current write protection setting.
Definition: sfDevADE7953.cpp:115
static const uint16_t kRegAngleA
Angle between voltage and Current Channel A.
Definition: sfDevADE7953.h:719
static const uint16_t kRegAVarOS
Reactive power offset (Channel A)
Definition: sfDevADE7953.h:774
static const uint16_t kRegPhCalB
Phase calibration (Channel B)
Definition: sfDevADE7953.h:716
static const uint16_t kRegCF2Den
CF2 frequency divider denominator.
Definition: sfDevADE7953.h:713
sfTkError_t getInterruptStatusA(sfe_ade7953_irq_reg_t &status)
Read the interrupt status for Channel A (non-destructive).
Definition: sfDevADE7953.cpp:644
static const uint16_t kRegAngleB
Angle between voltage and Current Channel B.
Definition: sfDevADE7953.h:720
sfTkError_t isHPFEnabled(bool &enabled)
Check whether the high-pass filter is currently enabled.
Definition: sfDevADE7953.cpp:619
static const uint16_t kRegVarNoLoad
Reactive power no-load level.
Definition: sfDevADE7953.h:731
static const uint32_t kDigitalGainMax
Maximum valid digital gain register value.
Definition: sfDevADE7953.h:790
static const uint16_t kRegBVaOS
Apparent power offset (Channel B)
Definition: sfDevADE7953.h:783
sfTkError_t getSagLevel(uint32_t &level)
Get the sag voltage level threshold.
Definition: sfDevADE7953.cpp:726
sfTkError_t getZXISourceChannel(bool &useChannelB)
Get which current channel drives the ZX_I output.
Definition: sfDevADE7953.cpp:566
static const uint16_t kRegDisNoLoad
No-load detection disable.
Definition: sfDevADE7953.h:696
static const uint16_t kRegOptimize
Performance optimization (set to 0x0030)
Definition: sfDevADE7953.h:723
sfTkError_t setOvercurrentLevel(uint32_t level)
Set the overcurrent detection threshold.
Definition: sfDevADE7953.cpp:514
static const uint8_t kUnlockKey
Key written to kRegUnlock to unlock 0x120.
Definition: sfDevADE7953.h:787
static const uint16_t kRegBVA
Instantaneous apparent power (Channel B)
Definition: sfDevADE7953.h:734
sfTkError_t setSagCycles(uint8_t cycles)
Set the number of sag line cycles.
Definition: sfDevADE7953.cpp:711
static const uint16_t kRegRstIAPeak
Current Channel A peak read with reset.
Definition: sfDevADE7953.h:756
static const uint16_t kRegIrqEnA
Interrupt enable (Channel A + voltage)
Definition: sfDevADE7953.h:759
float _fullScaleVRMS
Full-scale input RMS voltage (0.5 V peak / sqrt(2)).
Definition: sfDevADE7953.h:683
static const uint16_t kRegVRMSOS
VRMS offset.
Definition: sfDevADE7953.h:772
static const uint16_t kRegRstVPeak
Voltage peak read with reset.
Definition: sfDevADE7953.h:754
sfTkError_t getLastOperation(uint8_t &op)
Get the type of the last successful communication.
Definition: sfDevADE7953.cpp:733
sfTkError_t readAndResetPeakIA(uint32_t &value)
Read the peak current value for Channel A and clear it.
Definition: sfDevADE7953.cpp:503
sfTkError_t getCurrentB(float &amps)
Read the RMS current on Channel B converted to amps.
Definition: sfDevADE7953.cpp:284
sfTkError_t setGainV(sfe_ade7953_pga_gain_t gain)
Set the PGA gain for the voltage channel.
Definition: sfDevADE7953.cpp:171
static const uint16_t kRegAVaOS
Apparent power offset (Channel A)
Definition: sfDevADE7953.h:775
sfTkError_t getInterruptStatusB(sfe_ade7953_irq_reg_t &status)
Read the interrupt status for Channel B (non-destructive).
Definition: sfDevADE7953.cpp:665
sfTkError_t getDigitalGainIA(uint32_t &gain)
Get the digital gain for Current Channel A as a raw register value.
Definition: sfDevADE7953.cpp:205
sfTkError_t getOvercurrentLevel(uint32_t &level)
Get the overcurrent detection threshold.
Definition: sfDevADE7953.cpp:519
static const uint16_t kRegBWGain
Active power gain (Channel B)
Definition: sfDevADE7953.h:777
static const uint16_t kRegPFA
Power factor (Channel A)
Definition: sfDevADE7953.h:717
sfTkError_t applyDefaultConfig(void)
Apply the datasheet unlock + optimize sequence and default configuration.
Definition: sfDevADE7953.cpp:48
static float pgaGainToMultiplier(sfe_ade7953_pga_gain_t gain)
Convert a PGA gain enum value to its numeric multiplier (1, 2, 4, 8, 16, 22).
Definition: sfDevADE7953.cpp:124
sfTkError_t setCurrentClampB(sfe_ade7953_clamp_t clamp)
Select a known current clamp for Channel B and apply its turns ratio and PGA gain.
Definition: sfDevADE7953.cpp:380
static const uint16_t kRegPgaV
Voltage channel PGA gain (Bits[2:0])
Definition: sfDevADE7953.h:698
static void clampPreset(sfe_ade7953_clamp_t clamp, float &ratio, sfe_ade7953_pga_gain_t &gain)
Look up the turns ratio and PGA gain for a known current clamp preset.
Definition: sfDevADE7953.cpp:337
sfTkError_t autoCalibrateA(uint16_t numSamples=50)
Auto-calibrate the Channel A no-load baseline by averaging samples.
Definition: sfDevADE7953.cpp:406
static const uint16_t kRegIRMSA
IRMS (Channel A)
Definition: sfDevADE7953.h:742
static const uint16_t kRegBIRMSOS
IRMS offset (Channel B)
Definition: sfDevADE7953.h:780
void clearCalibration(void)
Clear the software no-load baseline for both channels (set by autoCalibrate).
Definition: sfDevADE7953.cpp:444
static const uint16_t kRegZXTout
Zero-crossing timeout.
Definition: sfDevADE7953.h:709
sfTkError_t setDigitalGainIA(uint32_t gain)
Set the digital (fine) gain for Current Channel A using a raw register value.
Definition: sfDevADE7953.cpp:188
void setCurrentTransformerRatioB(float ratio)
Set the CT turns ratio used by getCurrentB() for Channel B.
Definition: sfDevADE7953.cpp:461
static const uint16_t kRegBVar
Instantaneous reactive power (Channel B)
Definition: sfDevADE7953.h:738
static const uint16_t kRegCRC
Checksum (32-bit only)
Definition: sfDevADE7953.h:765
static const uint16_t kRegPgaIA
Current Channel A PGA gain (Bits[2:0])
Definition: sfDevADE7953.h:699
float getCurrentTransformerRatioB(void)
Get the configured CT turns ratio for Channel B.
Definition: sfDevADE7953.cpp:476
sfTkError_t setWriteProtect(uint8_t protect)
Set write protection bits.
Definition: sfDevADE7953.cpp:110
sfTkError_t setDigitalGainIB(uint32_t gain)
Set the digital (fine) gain for Current Channel B using a raw register value.
Definition: sfDevADE7953.cpp:218
static const uint16_t kRegAWatt
Instantaneous active power (Channel A)
Definition: sfDevADE7953.h:735
static const uint16_t kRegPhCalA
Phase calibration (Channel A)
Definition: sfDevADE7953.h:715
static const uint16_t kRegRstIBPeak
Current Channel B peak read with reset.
Definition: sfDevADE7953.h:758
static const uint16_t kRegIRMSB
IRMS (Channel B)
Definition: sfDevADE7953.h:743
static const uint16_t kRegREnergyB
Reactive energy (Channel B)
Definition: sfDevADE7953.h:748
sfTkError_t getIRMSOffsetA(int32_t &offset)
Get the IRMS offset for Current Channel A.
Definition: sfDevADE7953.cpp:531
float _fullScaleCode
ADE7953 full-scale IRMS code.
Definition: sfDevADE7953.h:682
static const uint16_t kRegOiLvl
Overcurrent level.
Definition: sfDevADE7953.h:752
float getCurrentTransformerRatio(void)
Get the configured CT turns ratio for Channel A.
Definition: sfDevADE7953.cpp:466
static const uint16_t kRegBVarOS
Reactive power offset (Channel B)
Definition: sfDevADE7953.h:782
sfTkError_t getGainIB(sfe_ade7953_pga_gain_t &gain)
Get the PGA gain for Current Channel B.
Definition: sfDevADE7953.cpp:163
static const uint16_t kRegAltOutput
Alternative output functions.
Definition: sfDevADE7953.h:722
static const uint16_t kRegPeriod
Period register (line period from ZX)
Definition: sfDevADE7953.h:721
static const uint16_t kRegVRMS
VRMS.
Definition: sfDevADE7953.h:744
static const uint16_t kRegApEnergyB
Apparent energy (Channel B)
Definition: sfDevADE7953.h:750
static const uint16_t kRegApEnergyA
Apparent energy (Channel A)
Definition: sfDevADE7953.h:749
static const uint16_t kRegBWatt
Instantaneous active power (Channel B)
Definition: sfDevADE7953.h:736
static const uint16_t kRegAVaGain
Apparent power gain (Channel A)
Definition: sfDevADE7953.h:770
static const uint16_t kRegCF1Den
CF1 frequency divider denominator.
Definition: sfDevADE7953.h:712
static const uint16_t kRegConfig
Configuration register.
Definition: sfDevADE7953.h:711
sfTkError_t setNoLoadDisable(sfe_ade7953_disnoload_reg_t mask)
Set the no-load detection disable register.
Definition: sfDevADE7953.cpp:677
sfTkError_t getLineCycleCount(uint16_t &halfCycles)
Get the number of half line cycles for line cycle accumulation.
Definition: sfDevADE7953.cpp:704
static const uint16_t kRegLastRwData16
Last successful 16-bit register data.
Definition: sfDevADE7953.h:725
static const uint16_t kRegBWattOS
Active power offset (Channel B)
Definition: sfDevADE7953.h:781
sfTkError_t enableZXLPF(bool enable)
Enable or disable the zero-crossing low-pass filter.
Definition: sfDevADE7953.cpp:594
static const uint16_t kRegSagLvl
Sag voltage level.
Definition: sfDevADE7953.h:728
sfTkError_t getInterruptEnableA(sfe_ade7953_irq_reg_t &mask)
Get the interrupt enable mask for Channel A.
Definition: sfDevADE7953.cpp:639
sfTkError_t getLastData16(uint16_t &data)
Get the data from the last successful 16-bit register communication.
Definition: sfDevADE7953.cpp:748
static const uint16_t kRegPgaIB
Current Channel B PGA gain (Bits[2:0])
Definition: sfDevADE7953.h:700
sfTkError_t setLineCycleCount(uint16_t halfCycles)
Set the number of half line cycles for line cycle accumulation.
Definition: sfDevADE7953.cpp:699
sfTkError_t autoCalibrateB(uint16_t numSamples=50)
Auto-calibrate the Channel B no-load baseline by averaging samples.
Definition: sfDevADE7953.cpp:425
static const uint16_t kRegAWattOS
Active power offset (Channel A)
Definition: sfDevADE7953.h:773
sfTkError_t setIRMSOffsetA(int32_t offset)
Set the IRMS offset for Current Channel A.
Definition: sfDevADE7953.cpp:526
sfTkError_t getPeriod(uint16_t &period)
Read the line period derived from zero-crossing detection.
Definition: sfDevADE7953.cpp:627
static const uint16_t kRegLCycMode
Line cycle accumulation mode config.
Definition: sfDevADE7953.h:697
static float removeBaseline(uint32_t reading, uint32_t baseline)
Remove a no-load baseline from a raw RMS reading in the squared domain.
Definition: sfDevADE7953.cpp:324
sfTkError_t getLastAddress(uint16_t &address)
Get the address of the last successful communication.
Definition: sfDevADE7953.cpp:738
void setCurrentTransformerRatio(float ratio)
Set the CT (current transformer) turns ratio used by getCurrentA() and getCurrentB().
Definition: sfDevADE7953.cpp:450
static const uint16_t kRegLastOp
Last operation type (0x35=read, 0xCA=write)
Definition: sfDevADE7953.h:702
static const uint16_t kRegAVA
Instantaneous apparent power (Channel A)
Definition: sfDevADE7953.h:733
static const uint16_t kRegAEnergyA
Active energy (Channel A)
Definition: sfDevADE7953.h:745
static const uint16_t kRegSagCyc
Sag line cycles.
Definition: sfDevADE7953.h:695
static const uint16_t kRegLastRwData32
Last successful 24/32-bit register data.
Definition: sfDevADE7953.h:784
static const uint16_t kRegRstIrqStatA
Reset interrupt status (Channel A + voltage)
Definition: sfDevADE7953.h:761
static const uint16_t kRegWriteProtect
Write protection bits (Bits[2:0])
Definition: sfDevADE7953.h:701
static const uint8_t kLastOpWrite
Last operation was a write.
Definition: sfDevADE7953.h:792
sfTkError_t readAndResetInterruptStatusA(sfe_ade7953_irq_reg_t &status)
Read the interrupt status for Channel A and clear it.
Definition: sfDevADE7953.cpp:649
sfTkError_t readAndResetInterruptStatusB(sfe_ade7953_irq_reg_t &status)
Read the interrupt status for Channel B and clear it.
Definition: sfDevADE7953.cpp:670
sfTkError_t reset(void)
Perform a software reset and re-apply the datasheet performance configuration.
Definition: sfDevADE7953.cpp:90
static const uint16_t kRegIAPeak
Current Channel A peak.
Definition: sfDevADE7953.h:755
static const uint8_t kI2CAddress
7-bit I2C address for the ADE7953 (only address).
Definition: sfDevADE7953.h:692
static const uint16_t kRegIB
Instantaneous current (Channel B)
Definition: sfDevADE7953.h:740
static const uint16_t kRegRstIrqStatB
Reset interrupt status (Channel B)
Definition: sfDevADE7953.h:764
static const uint16_t kRegBVaGain
Apparent power gain (Channel B)
Definition: sfDevADE7953.h:779
static const uint16_t kRegAWGain
Active power gain (Channel A)
Definition: sfDevADE7953.h:768
float _ctRatioA
Channel A CT turns ratio (30A:15mA = 2000:1).
Definition: sfDevADE7953.h:679
sfTkError_t getLastData32(uint32_t &data)
Get the data from the last successful 24/32-bit register communication.
Definition: sfDevADE7953.cpp:753
float _burdenResistor
Burden resistor in ohms.
Definition: sfDevADE7953.h:681
sfTkError_t setZXISourceChannel(bool useChannelB)
Select which current channel drives the ZX_I output.
Definition: sfDevADE7953.cpp:554
static const uint16_t kRegAVar
Instantaneous reactive power (Channel A)
Definition: sfDevADE7953.h:737
sfTkError_t getSagCycles(uint8_t &cycles)
Get the number of sag line cycles.
Definition: sfDevADE7953.cpp:716
sfTkError_t getDigitalGainIB(uint32_t &gain)
Get the digital gain for Current Channel B as a raw register value.
Definition: sfDevADE7953.cpp:235
sfTkError_t getInterruptEnableB(sfe_ade7953_irq_reg_t &mask)
Get the interrupt enable mask for Channel B.
Definition: sfDevADE7953.cpp:660
sfTkError_t getVersion(uint8_t &version)
Read the silicon version number from the Version register (0x702).
Definition: sfDevADE7953.cpp:85
sfTkError_t enableHPF(bool enable)
Enable or disable the high-pass filter on all channels.
Definition: sfDevADE7953.cpp:607
static const uint16_t kRegIBPeak
Current Channel B peak.
Definition: sfDevADE7953.h:757
static const uint16_t kOptimizeValue
Value written to 0x120 for rated performance.
Definition: sfDevADE7953.h:788
sfTkError_t setIRMSOffsetB(int32_t offset)
Set the IRMS offset for Current Channel B.
Definition: sfDevADE7953.cpp:539
static const uint16_t kRegLastAdd
Last successful communication address.
Definition: sfDevADE7953.h:724
static const uint16_t kRegAEnergyB
Active energy (Channel B)
Definition: sfDevADE7953.h:746
static const uint16_t kRegBIGain
Current channel gain (Channel B)
Definition: sfDevADE7953.h:776
static const uint16_t kRegAIRMSOS
IRMS offset (Channel A)
Definition: sfDevADE7953.h:771
sfTkError_t getInstantaneousIB(int32_t &value)
Read the instantaneous current sample for Channel B.
Definition: sfDevADE7953.cpp:314
sfe_ade7953_clamp_t
Supported clamp-on current transformers.
Definition: sfDevADE7953.h:64
@ ADE7953_CLAMP_SCT013
SCT-013-000: 100A:50mA (2000:1 turns), 1x PGA gain.
Definition: sfDevADE7953.h:66
@ ADE7953_CLAMP_ECS1030
SparkFun ECS1030-L72: 30A:15mA (2000:1 turns), 4x PGA gain.
Definition: sfDevADE7953.h:65
sfe_ade7953_pga_gain_t
PGA gain settings for the PGA_V, PGA_IA, and PGA_IB registers.
Definition: sfDevADE7953.h:35
@ ADE7953_PGA_GAIN_8
8x gain
Definition: sfDevADE7953.h:39
@ ADE7953_PGA_GAIN_22
22x gain (current channels only; not valid for the voltage channel)
Definition: sfDevADE7953.h:41
@ ADE7953_PGA_GAIN_2
2x gain
Definition: sfDevADE7953.h:37
@ ADE7953_PGA_GAIN_4
4x gain
Definition: sfDevADE7953.h:38
@ ADE7953_PGA_GAIN_1
1x gain
Definition: sfDevADE7953.h:36
@ ADE7953_PGA_GAIN_16
16x gain
Definition: sfDevADE7953.h:40
sfe_ade7953_zx_edge_t
Zero-crossing edge selection for CONFIG register bits [13:12].
Definition: sfDevADE7953.h:49
@ ADE7953_ZX_EDGE_BOTH_ALT
Same as BOTH (alternate encoding)
Definition: sfDevADE7953.h:53
@ ADE7953_ZX_EDGE_POSITIVE
Interrupt on positive-going ZX only.
Definition: sfDevADE7953.h:52
@ ADE7953_ZX_EDGE_BOTH
Interrupt on both positive and negative-going ZX.
Definition: sfDevADE7953.h:50
@ ADE7953_ZX_EDGE_NEGATIVE
Interrupt on negative-going ZX only.
Definition: sfDevADE7953.h:51
Bitfield union for the 16-bit CONFIG register (0x102).
Definition: sfDevADE7953.h:74
uint16_t zxLPF
ZX LPF disable (1=disabled) [bit 6].
Definition: sfDevADE7953.h:83
uint16_t intEnA
Integrator enable (Channel A) [bit 0].
Definition: sfDevADE7953.h:77
uint16_t zxEdge
ZX edge selection (see sfe_ade7953_zx_edge_t) [bits 13:12].
Definition: sfDevADE7953.h:88
uint16_t hpfEn
HPF enable (all channels) [bit 2].
Definition: sfDevADE7953.h:79
uint16_t swRst
Software reset [bit 7].
Definition: sfDevADE7953.h:84
uint16_t intEnB
Integrator enable (Channel B) [bit 1].
Definition: sfDevADE7953.h:78
uint16_t word
Raw register value for I2C read/write.
Definition: sfDevADE7953.h:92
uint16_t revpPulse
REVP output mode [bit 5].
Definition: sfDevADE7953.h:82
uint16_t zxI
ZX_I source: 0=Channel A, 1=Channel B [bit 11].
Definition: sfDevADE7953.h:87
uint16_t pfMode
Power factor mode [bit 3].
Definition: sfDevADE7953.h:80
uint16_t revpCF
REVP updated on CF1(0) or CF2(1) [bit 4].
Definition: sfDevADE7953.h:81
uint16_t commLock
Communication locking (1=disabled) [bit 15].
Definition: sfDevADE7953.h:90
uint16_t crcEn
CRC enable [bit 8].
Definition: sfDevADE7953.h:85
Bitfield union for the 8-bit DISNOLOAD register (0x001).
Definition: sfDevADE7953.h:120
uint8_t disVA
Disable apparent power no-load detection [bit 2].
Definition: sfDevADE7953.h:125
uint8_t disVAR
Disable reactive power no-load detection [bit 1].
Definition: sfDevADE7953.h:124
uint8_t disAP
Disable active power no-load detection [bit 0].
Definition: sfDevADE7953.h:123
uint8_t byte
Raw register value for I2C read/write.
Definition: sfDevADE7953.h:128
Bitfield union for the 32-bit IRQ enable and status registers.
Definition: sfDevADE7953.h:138
uint32_t cycEnd
End of line cycle accumulation period (Channel A only) [bit 18].
Definition: sfDevADE7953.h:159
uint32_t varehf
Reactive energy half full [bit 1].
Definition: sfDevADE7953.h:142
uint32_t reset
Reset occurred — always enabled (Channel A only) [bit 20].
Definition: sfDevADE7953.h:161
uint32_t zxV
Voltage zero-crossing detected (Channel A only) [bit 15].
Definition: sfDevADE7953.h:156
uint32_t apNoLoad
Active power no-load detected [bit 6].
Definition: sfDevADE7953.h:147
uint32_t zxI
Current zero-crossing detected [bit 12].
Definition: sfDevADE7953.h:153
uint32_t apSign
Active energy sign changed [bit 9].
Definition: sfDevADE7953.h:150
uint32_t aehf
Active energy half full [bit 0].
Definition: sfDevADE7953.h:141
uint32_t varNoLoad
Reactive power no-load detected [bit 7].
Definition: sfDevADE7953.h:148
uint32_t zxToV
Voltage zero-crossing timeout (Channel A only) [bit 14].
Definition: sfDevADE7953.h:155
uint32_t vareof
Reactive energy overflow/underflow [bit 4].
Definition: sfDevADE7953.h:145
uint32_t oV
Overvoltage threshold exceeded (Channel A only) [bit 16].
Definition: sfDevADE7953.h:157
uint32_t crc
Checksum changed (Channel A only) [bit 21].
Definition: sfDevADE7953.h:162
uint32_t sag
Sag event occurred (Channel A only) [bit 19].
Definition: sfDevADE7953.h:160
uint32_t oI
Overcurrent threshold exceeded [bit 13].
Definition: sfDevADE7953.h:154
uint32_t vaeof
Apparent energy overflow/underflow [bit 5].
Definition: sfDevADE7953.h:146
uint32_t wSmp
New waveform data acquired (Channel A only) [bit 17].
Definition: sfDevADE7953.h:158
uint32_t vaNoLoad
Apparent power no-load detected [bit 8].
Definition: sfDevADE7953.h:149
uint32_t vaehf
Apparent energy half full [bit 2].
Definition: sfDevADE7953.h:143
uint32_t varSign
Reactive energy sign changed [bit 10].
Definition: sfDevADE7953.h:151
uint32_t word
Raw register value for I2C read/write.
Definition: sfDevADE7953.h:165
uint32_t zxToI
Current zero-crossing timeout [bit 11].
Definition: sfDevADE7953.h:152
uint32_t aeof
Active energy overflow/underflow [bit 3].
Definition: sfDevADE7953.h:144
Bitfield union for the 8-bit LCYCMODE register (0x004).
Definition: sfDevADE7953.h:100
uint8_t aLVar
Reactive energy line cycle mode (Channel A) [bit 2].
Definition: sfDevADE7953.h:105
uint8_t bLVa
Apparent energy line cycle mode (Channel B) [bit 5].
Definition: sfDevADE7953.h:108
uint8_t rstRead
Read-with-reset enable for all registers [bit 6].
Definition: sfDevADE7953.h:109
uint8_t aLVa
Apparent energy line cycle mode (Channel A) [bit 4].
Definition: sfDevADE7953.h:107
uint8_t aLWatt
Active energy line cycle mode (Channel A) [bit 0].
Definition: sfDevADE7953.h:103
uint8_t bLVar
Reactive energy line cycle mode (Channel B) [bit 3].
Definition: sfDevADE7953.h:106
uint8_t byte
Raw register value for I2C read/write.
Definition: sfDevADE7953.h:112
uint8_t bLWatt
Active energy line cycle mode (Channel B) [bit 1].
Definition: sfDevADE7953.h:104