mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-27 20:56:35 +00:00
Add comments about calib.dat
This commit is contained in:
parent
91752fb265
commit
278b9dfe23
@ -24,22 +24,103 @@
|
|||||||
|
|
||||||
#define ADE7880_ADDR 0x38
|
#define ADE7880_ADDR 0x38
|
||||||
|
|
||||||
//#define ADE7880_DEBUG
|
//#define ADE7880_COMPMODE_FREQ 0x4000 // Connected to networks with fundamental frequencies between 55 Hz and 66 Hz. Default 45 Hz to 55 Hz
|
||||||
|
|
||||||
#define ADE7880_APGAIN_INIT 0xFF14B7E3 // = -15419420
|
/*********************************************************************************************/
|
||||||
#define ADE7880_BPGAIN_INIT 0xFF14A7B1 // = -15423566
|
|
||||||
#define ADE7880_CPGAIN_INIT 0xFF14999C // = -15427171
|
//#define ADE7880_DEBUG
|
||||||
#define ADE7880_AVGAIN_INIT 0xFFF43977 // = -771720
|
//#define ADE7880_PROFILING
|
||||||
#define ADE7880_BVGAIN_INIT 0xFFF4DD00 // = -729855
|
|
||||||
#define ADE7880_CVGAIN_INIT 0xFFF4A306 // = -744697
|
/*
|
||||||
|
Derive these parameters from the original Shelly 3EM 4M firmware dump. Look for JSON file called calib.data
|
||||||
|
{
|
||||||
|
"state": 0,
|
||||||
|
"rms": {
|
||||||
|
"current_a": 3166385,
|
||||||
|
"current_b": 3125691,
|
||||||
|
"current_c": 3131983,
|
||||||
|
"current_n": -1474892307,
|
||||||
|
"current_s": 1756557,
|
||||||
|
"voltage_a": -767262,
|
||||||
|
"voltage_b": -763439,
|
||||||
|
"voltage_c": -749854
|
||||||
|
},
|
||||||
|
"angles": {
|
||||||
|
"angle0": 180,
|
||||||
|
"angle1": 176,
|
||||||
|
"angle2": 176
|
||||||
|
},
|
||||||
|
"powers": {
|
||||||
|
"totactive": {
|
||||||
|
"a": -1345820,
|
||||||
|
"b": -1347328,
|
||||||
|
"c": -1351979
|
||||||
|
},
|
||||||
|
"apparent": {
|
||||||
|
"a": 214966,
|
||||||
|
"b": 214961,
|
||||||
|
"c": 214949
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"energies": {
|
||||||
|
"totactive": {
|
||||||
|
"a": 8752,
|
||||||
|
"b": 8751,
|
||||||
|
"c": 8751
|
||||||
|
},
|
||||||
|
"apparent": {
|
||||||
|
"a": 40496,
|
||||||
|
"b": 40513,
|
||||||
|
"c": 40524
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
#define ADE7880_AIGAIN_INIT 3166385 // rms, current_a
|
||||||
|
#define ADE7880_BIGAIN_INIT 3125691 // rms, current_b
|
||||||
|
#define ADE7880_CIGAIN_INIT 3131983 // rms, current_c
|
||||||
|
#define ADE7880_NIGAIN_INIT 1756557 // rms, current_s !!
|
||||||
|
#define ADE7880_AVGAIN_INIT -767262 // rms, voltage_a
|
||||||
|
#define ADE7880_BVGAIN_INIT -763439 // rms, voltage_b
|
||||||
|
#define ADE7880_CVGAIN_INIT -749854 // rms, voltage_c
|
||||||
|
#define ADE7880_APHCAL_INIT 180 // angles, angle0
|
||||||
|
#define ADE7880_BPHCAL_INIT 176 // angles, angle1
|
||||||
|
#define ADE7880_CPHCAL_INIT 176 // angles, angle2
|
||||||
|
#define ADE7880_APGAIN_INIT -1345820 // powers, totactive, a
|
||||||
|
#define ADE7880_BPGAIN_INIT -1347328 // powers, totactive, b
|
||||||
|
#define ADE7880_CPGAIN_INIT -1351979 // powers, totactive, c
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Original defines from logic analyzer
|
||||||
#define ADE7880_AIGAIN_INIT 0x002FFED1 // = 3145425
|
#define ADE7880_AIGAIN_INIT 0x002FFED1 // = 3145425
|
||||||
#define ADE7880_BIGAIN_INIT 0x00309661 // = 3184225
|
#define ADE7880_BIGAIN_INIT 0x00309661 // = 3184225
|
||||||
#define ADE7880_CIGAIN_INIT 0x0030DBFD // = 3202045
|
#define ADE7880_CIGAIN_INIT 0x0030DBFD // = 3202045
|
||||||
#define ADE7880_NIGAIN_INIT 0x04D906AC // = 81331884 (14223020)
|
#define ADE7880_NIGAIN_INIT 0x04D906AC // = 81331884 (14223020)
|
||||||
|
#define ADE7880_AVGAIN_INIT 0xFFF43977 // = -771720
|
||||||
|
#define ADE7880_BVGAIN_INIT 0xFFF4DD00 // = -729855
|
||||||
|
#define ADE7880_CVGAIN_INIT 0xFFF4A306 // = -744697
|
||||||
#define ADE7880_APHCAL_INIT 0xD895 // = 55445 (149)
|
#define ADE7880_APHCAL_INIT 0xD895 // = 55445 (149)
|
||||||
#define ADE7880_BPHCAL_INIT 0xD8A9 // = 55456 (169)
|
#define ADE7880_BPHCAL_INIT 0xD8A9 // = 55456 (169)
|
||||||
#define ADE7880_CPHCAL_INIT 0xD89D // = 55453 (157)
|
#define ADE7880_CPHCAL_INIT 0xD89D // = 55453 (157)
|
||||||
//#define ADE7880_COMPMODE_FREQ 0x4000 // Connected to networks with fundamental frequencies between 55 Hz and 66 Hz. Default 45 Hz to 55 Hz
|
#define ADE7880_APGAIN_INIT 0xFF14B7E3 // = -15419420
|
||||||
|
#define ADE7880_BPGAIN_INIT 0xFF14A7B1 // = -15423566
|
||||||
|
#define ADE7880_CPGAIN_INIT 0xFF14999C // = -15427171
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
#define ADE7880_AIGAIN_INIT 3145425
|
||||||
|
#define ADE7880_BIGAIN_INIT 3184225
|
||||||
|
#define ADE7880_CIGAIN_INIT 3202045
|
||||||
|
#define ADE7880_NIGAIN_INIT 14223020
|
||||||
|
#define ADE7880_AVGAIN_INIT -771720
|
||||||
|
#define ADE7880_BVGAIN_INIT -729855
|
||||||
|
#define ADE7880_CVGAIN_INIT -744697
|
||||||
|
#define ADE7880_APHCAL_INIT 149
|
||||||
|
#define ADE7880_BPHCAL_INIT 169
|
||||||
|
#define ADE7880_CPHCAL_INIT 157
|
||||||
|
#define ADE7880_APGAIN_INIT -15419420
|
||||||
|
#define ADE7880_BPGAIN_INIT -15423566
|
||||||
|
#define ADE7880_CPGAIN_INIT -15427171
|
||||||
|
*/
|
||||||
|
|
||||||
enum Ade7880DspRegisters {
|
enum Ade7880DspRegisters {
|
||||||
ADE7880_AIGAIN = 0x4380, // 0x4380 R/W 24 32 ZPSE S 0x000000 Phase A current gain adjust.
|
ADE7880_AIGAIN = 0x4380, // 0x4380 R/W 24 32 ZPSE S 0x000000 Phase A current gain adjust.
|
||||||
@ -248,6 +329,8 @@ struct Ade7880 {
|
|||||||
uint8_t irq1_state;
|
uint8_t irq1_state;
|
||||||
} Ade7880;
|
} Ade7880;
|
||||||
|
|
||||||
|
/*********************************************************************************************/
|
||||||
|
|
||||||
int Ade7880RegSize(uint16_t reg) {
|
int Ade7880RegSize(uint16_t reg) {
|
||||||
int size = 0;
|
int size = 0;
|
||||||
switch ((reg >> 8) & 0x0F) {
|
switch ((reg >> 8) & 0x0F) {
|
||||||
@ -340,8 +423,13 @@ int32_t Ade7880ReadVerify(uint16_t reg) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************************************/
|
||||||
|
|
||||||
bool Ade7880Init(void) {
|
bool Ade7880Init(void) {
|
||||||
// Init sequence about 100mS after reset - See page 40 (takes about 60ms)
|
// Init sequence about 100mS after reset - See page 40 (takes 68ms)
|
||||||
|
#ifdef ADE7880_PROFILING
|
||||||
|
uint32_t start = millis();
|
||||||
|
#endif // ADE7880_PROFILING
|
||||||
uint32_t status1 = Ade7880ReadVerify(ADE7880_STATUS1); // 0x01A08000
|
uint32_t status1 = Ade7880ReadVerify(ADE7880_STATUS1); // 0x01A08000
|
||||||
if (bitRead(status1, 15)) { // RSTDONE
|
if (bitRead(status1, 15)) { // RSTDONE
|
||||||
// Power on or Reset
|
// Power on or Reset
|
||||||
@ -418,6 +506,9 @@ bool Ade7880Init(void) {
|
|||||||
Ade7880Write(ADE7880_DSPWP_SET, 0x80); // Write protect DSP area
|
Ade7880Write(ADE7880_DSPWP_SET, 0x80); // Write protect DSP area
|
||||||
|
|
||||||
Ade7880WriteVerify(ADE7880_Run, 0x0201); // Start DSP
|
Ade7880WriteVerify(ADE7880_Run, 0x0201); // Start DSP
|
||||||
|
#ifdef ADE7880_PROFILING
|
||||||
|
AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Init done in %d ms"), millis() - start);
|
||||||
|
#endif // ADE7880_PROFILING
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -437,8 +528,13 @@ void IRAM_ATTR Ade7880Isr1(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************************************/
|
||||||
|
|
||||||
void Ade7880Cycle(void) {
|
void Ade7880Cycle(void) {
|
||||||
// Cycle sequence (takes 5ms)
|
// Cycle sequence (takes 55ms)
|
||||||
|
#ifdef ADE7880_PROFILING
|
||||||
|
uint32_t start = millis();
|
||||||
|
#endif // ADE7880_PROFILING
|
||||||
uint32_t status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0x000FEFE0
|
uint32_t status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0x000FEFE0
|
||||||
if (!bitRead(status0, 5)) { // LENERGY
|
if (!bitRead(status0, 5)) { // LENERGY
|
||||||
return;
|
return;
|
||||||
@ -482,6 +578,9 @@ void Ade7880Cycle(void) {
|
|||||||
Energy.frequency[0] = 256000.0f / Ade7880ReadVerify(ADE7880_APERIOD); // Page 34 and based on ADE7880_COMPMODE_FREQ
|
Energy.frequency[0] = 256000.0f / Ade7880ReadVerify(ADE7880_APERIOD); // Page 34 and based on ADE7880_COMPMODE_FREQ
|
||||||
Energy.frequency[1] = 256000.0f / Ade7880ReadVerify(ADE7880_BPERIOD);
|
Energy.frequency[1] = 256000.0f / Ade7880ReadVerify(ADE7880_BPERIOD);
|
||||||
Energy.frequency[2] = 256000.0f / Ade7880ReadVerify(ADE7880_CPERIOD);
|
Energy.frequency[2] = 256000.0f / Ade7880ReadVerify(ADE7880_CPERIOD);
|
||||||
|
#ifdef ADE7880_PROFILING
|
||||||
|
AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Cycle in %d ms"), millis() - start);
|
||||||
|
#endif // ADE7880_PROFILING
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ade7880Service0(void) {
|
void Ade7880Service0(void) {
|
||||||
@ -499,6 +598,8 @@ void IRAM_ATTR Ade7880Isr0(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************************************/
|
||||||
|
|
||||||
void Ade7880EnergyEverySecond(void) {
|
void Ade7880EnergyEverySecond(void) {
|
||||||
for (uint32_t i = 0; i < 3; i++) {
|
for (uint32_t i = 0; i < 3; i++) {
|
||||||
if (Ade7880.active_energy[i] != 0) {
|
if (Ade7880.active_energy[i] != 0) {
|
||||||
@ -510,6 +611,10 @@ void Ade7880EnergyEverySecond(void) {
|
|||||||
void Ade7880DrvInit(void) {
|
void Ade7880DrvInit(void) {
|
||||||
if (PinUsed(GPIO_ADE7880_IRQ) && PinUsed(GPIO_ADE7880_IRQ, 1)) {
|
if (PinUsed(GPIO_ADE7880_IRQ) && PinUsed(GPIO_ADE7880_IRQ, 1)) {
|
||||||
|
|
||||||
|
#ifdef ADE7880_PROFILING
|
||||||
|
uint32_t start = millis();
|
||||||
|
#endif // ADE7880_PROFILING
|
||||||
|
|
||||||
int reset = Pin(GPIO_RESET);
|
int reset = Pin(GPIO_RESET);
|
||||||
if (-1 == reset) { reset = 16; } // Reset pin ADE7880 in Shelly 3EM
|
if (-1 == reset) { reset = 16; } // Reset pin ADE7880 in Shelly 3EM
|
||||||
pinMode(reset, OUTPUT);
|
pinMode(reset, OUTPUT);
|
||||||
@ -528,6 +633,11 @@ void Ade7880DrvInit(void) {
|
|||||||
uint32_t timeout = millis() + 400;
|
uint32_t timeout = millis() + 400;
|
||||||
while (!TimeReached(timeout)) { // Wait up to 400 mSec
|
while (!TimeReached(timeout)) { // Wait up to 400 mSec
|
||||||
if (1 == Ade7880.irq1_state) {
|
if (1 == Ade7880.irq1_state) {
|
||||||
|
|
||||||
|
#ifdef ADE7880_PROFILING
|
||||||
|
AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Reset in %d ms"), millis() - start);
|
||||||
|
#endif // ADE7880_PROFILING
|
||||||
|
|
||||||
if (Ade7880Service1()) {
|
if (Ade7880Service1()) {
|
||||||
if (I2cSetDevice(ADE7880_ADDR)) {
|
if (I2cSetDevice(ADE7880_ADDR)) {
|
||||||
I2cSetActiveFound(ADE7880_ADDR, "ADE7880");
|
I2cSetActiveFound(ADE7880_ADDR, "ADE7880");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user