fix RTC period (onboard led toggling affects it)

This commit is contained in:
King Kévin 2017-01-19 13:32:09 +01:00
parent 4db6a2b455
commit 3569fe5958
1 changed files with 54 additions and 10 deletions

64
main.c
View File

@ -252,7 +252,7 @@ void main(void)
// setup RTC
printf("setup internal RTC: ");
rtc_auto_awake(RCC_LSE, 32768-1); // ensure internal RTC is on, uses the 32.678 kHz LSE, and the prescale is set to our tick speed, else update backup registers accordingly (power off the micro-controller for the change to take effect)
rtc_auto_awake(RCC_LSE, 0x8000-1); // ensure internal RTC is on, uses the 32.768 kHz LSE, and the prescale is set to our tick speed, else update backup registers accordingly (power off the micro-controller for the change to take effect)
rtc_interrupt_enable(RTC_SEC); // enable RTC interrupt on "seconds"
nvic_enable_irq(NVIC_RTC_IRQ); // allow the RTC to interrupt
printf("OK\n");
@ -361,25 +361,26 @@ void main(void)
while (true); // unhandled error
}
if (measurement.valid) { // only show valid measurement
printf("PZEM-004T meter %u ", pzem_meter);
switch (measurement.type) {
case SENSOR_PZEM_VOLTAGE:
printf("PZEM-004T meter %u voltage: %.01f V\n", pzem_meter, measurement.value.voltage); // display measurement
printf("voltage: %.01f V\n", measurement.value.voltage); // display measurement
break;
case SENSOR_PZEM_CURRENT:
printf("PZEM-004T meter %u current: %.02f A\n", pzem_meter, measurement.value.current);
printf("current: %.02f A\n", measurement.value.current);
break;
case SENSOR_PZEM_POWER:
printf("PZEM-004T meter %u power: %u W\n", pzem_meter, measurement.value.power);
printf("power: %u W\n", measurement.value.power);
break;
case SENSOR_PZEM_ENERGY:
printf("PZEM-004T meter %u energy: %lu Wh\n", pzem_meter, measurement.value.energy);
printf("energy: %lu Wh\n", measurement.value.energy);
break;
/* not used for this application
case SENSOR_PZEM_ADDRESS:
printf("PZEM-004T meter %u address set\n", pzem_id);
printf("address set\n");
break;
case SENSOR_PZEM_ALARM:
printf("PZEM-004T meter %u alarm threshold set\n", pzem_id);
printf("alarm threshold set\n");
break;
*/
default:
@ -415,7 +416,50 @@ void main(void)
while (true); // unhandled error
} else {
sdm120_measurements[sdm120_meter][sdm120_measurement] = measurement; // save measurement
printf("SDM120 meter %u measurement %u: %.01f\n", sdm120_meter, sdm120_measurement, measurement);
printf("SDM120 meter %u ", sdm120_meter); // display measurement
switch (sdm120_measurement) {
case SENSOR_SDM120_VOLTAGE:
printf("voltage: %.01f V\n", measurement);
break;
case SENSOR_SDM120_CURRENT:
printf("current: %.02f A\n", measurement);
break;
case SENSOR_SDM120_POWER_ACTIVE:
printf("power (active): %.0f W\n", measurement);
break;
case SENSOR_SDM120_POWER_APPARENT:
printf("power (apparent): %.0f VA\n", measurement);
break;
case SENSOR_SDM120_POWER_REACTIVE:
printf("power (reactive): %.0f VAr\n", measurement);
break;
case SENSOR_SDM120_POWER_FACTOR:
printf("power factor: %.02f\n", measurement);
break;
case SENSOR_SDM120_FREQUENCY:
printf("frequency: %.02f Hz\n", measurement);
break;
case SENSOR_SDM120_ENERGY_ACTIVE_IMPORT:
printf("energy (import,active): %.02f KWh\n", measurement);
break;
case SENSOR_SDM120_ENERGY_ACTIVE_EXPORT:
printf("energy (export,active): %.02f kWh\n", measurement);
break;
case SENSOR_SDM120_ENERGY_REACTIVE_IMPORT:
printf("energy (import,reactive): %.02f kVArh\n", measurement);
break;
case SENSOR_SDM120_ENERGY_REACTIVE_EXPORT:
printf("energy (export,reactive): %.02f kVArh\n", measurement);
break;
case SENSOR_SDM120_ENERGY_ACTIVE_TOTAL:
printf("energy (active,total): %.02f kWh\n", measurement);
break;
case SENSOR_SDM120_ENERGY_REACTIVE_TOTAL:
printf("energy (reactive,total): %.02f kVArh\n", measurement);
break;
default:
break;
}
if (sdm120_measurement<SENSOR_SDM120_MEASUREMENT_MAX-1) { // not all measurement type required
sdm120_measurement++; // go to next measurement
sensor_sdm120_measurement_request(1+sdm120_meter, sdm120_measurement); // request next measurement
@ -439,7 +483,7 @@ void main(void)
}
while (rtc_internal_tick_flag) { // the internal RTC ticked
rtc_internal_tick_flag = false; // reset flag
led_toggle(); // toggle LED (good to indicate if main function is stuck)
//led_toggle(); // toggle LED (good to indicate if main function is stuck). do not toggle onboard the LED on PC13 on the blue pill board since this heavily influences the RTC (by ~13%)
ticks_time = rtc_get_counter_val(); // copy time from internal RTC for processing
action = true; // action has been performed
if ((ticks_time%(60))==0) { // one minute passed
@ -559,7 +603,7 @@ void main(void)
while (timer_get_flag(TIM(MAIN_TIMER), TIM_SR_UIF)) { // timer update event -> query measurements
timer_clear_flag(TIM(MAIN_TIMER), TIM_SR_UIF); // clear flag
action = true; // action has been performed
printf("query meter measurements\n");
printf("query meter measurements (%02lu:%02lu:%02lu)\n", ticks_time/(60*60), (ticks_time%(60*60))/60, (ticks_time%60));
// start getting all PZEM-004T measurements from all meters
pzem_meter = 0; // reset PZEM meter number
pzem_measurement = 0; // reset PZEM measurement index