fix DDM100TC measurement calculation when 0 values

This commit is contained in:
King Kévin 2017-01-20 14:42:58 +01:00
parent 301ccbb72d
commit d3ed57fd0d
1 changed files with 14 additions and 5 deletions

19
main.c
View File

@ -363,6 +363,10 @@ void main(void)
uint8_t sdm120_meter = 0; // SDM120 meter index (add to 1 to get ID)
uint8_t sdm120_measurement = 0; // SDM120 measurement index
// variables for DDM100TC meter measurements
uint32_t ddm100tc_value_energy = 0;
uint32_t ddm100tc_value_power = 0;
while (true) { // infinite loop
iwdg_reset(); // kick the dog
while (cdcacm_received) { // data received over USB
@ -535,9 +539,16 @@ void main(void)
sdm120_measurement = 0; // reset SDM120 measurement index
sensor_sdm120_measurement_request(1+sdm120_meter, sdm120_measurement); // request first measurement
// show DDM100TC measurements (base on number of pulses and interval)
printf("DDM100TC meter energy: %lu Wh\n", (uint32_t)((ddm100tc_pulses*(uint64_t)1000)/1600)); // the meter has 1600 impulses/kWh (use 64-bit calculation to not overflow after 2684354 Wh)
printf("DDM100TC meter power: %lu W\n", (uint32_t)(((rcc_ahb_frequency*(double)1.0)/((uint32_t)TIM_PSC(TIM(DDM100TC_TIMER))+1))*(3600*1000/1600)/ddm100tc_interval)); // calculate with floating point for precision
// calculate and show DDM100TC measurements (base on number of pulses and interval)
if (ddm100tc_pulses==0) { // no measurements received yet
ddm100tc_value_energy = 0;
ddm100tc_value_power = 0;
} else {
ddm100tc_value_energy = (uint32_t)((ddm100tc_pulses*(uint64_t)1000)/1600); // the meter has 1600 impulses/kWh (use 64-bit calculation to not overflow after 2684354 Wh)
ddm100tc_value_power = (uint32_t)(((rcc_ahb_frequency*(double)1.0)/((uint32_t)TIM_PSC(TIM(DDM100TC_TIMER))+1))*(3600*1000/1600)/ddm100tc_interval); // calculate with floating point for precision
}
printf("DDM100TC meter energy: %lu Wh\n", ddm100tc_value_energy);
printf("DDM100TC meter power: %lu W\n", ddm100tc_value_power);
}
}
while (pzem_meter>=LENGTH(pzem_measurements) && sdm120_meter>=LENGTH(sdm120_measurements)) { // all measurements received for all meter
@ -566,9 +577,7 @@ void main(void)
"energy,meter=SDM120,phase=%u,type=active,direction=total value=%.3f\n",
"energy,meter=SDM120,phase=%u,type=reactive,direction=total value=%.3f\n"
};
uint32_t ddm100tc_value_energy = (uint32_t)((ddm100tc_pulses*(uint64_t)1000)/1600); // the meter has 1600 impulses/kWh (use 64-bit calculation to not overflow after 2684354 Wh)
const char* ddm100tc_string_energy = "energy,meter=DDM100TC value=%lu\n";
uint32_t ddm100tc_value_power = (uint32_t)(((rcc_ahb_frequency*(double)1.0)/((uint32_t)TIM_PSC(TIM(DDM100TC_TIMER))+1))*(3600*1000/1600)/ddm100tc_interval); // calculate with floating point for precision
const char* ddm100tc_string_power = "power,meter=DDM100TC value=%lu\n";
// calculate length for text to POST