From d3ed57fd0d5d2f7b452e01b493e9fecda0080095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?King=20K=C3=A9vin?= Date: Fri, 20 Jan 2017 14:42:58 +0100 Subject: [PATCH] fix DDM100TC measurement calculation when 0 values --- main.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/main.c b/main.c index 70bc722..b118b4a 100644 --- a/main.c +++ b/main.c @@ -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