application: add fixed point voltage printing

This commit is contained in:
King Kévin 2021-03-11 10:46:37 +01:00
parent 73b205e6c8
commit 9e9f0cbe28
1 changed files with 38 additions and 5 deletions

View File

@ -11,6 +11,7 @@
#include <string.h> // string utilities
#include <time.h> // date/time utilities
#include <ctype.h> // utilities to check chars
#include <math.h> // rounding utilities
/* STM32 (including CM3) libraries */
#include <libopencmsis/core_cm3.h> // Cortex M3 utilities
@ -51,6 +52,10 @@ static volatile bool second_flag = false; /**< flag set when a second passed */
/** number of seconds since boot */
static uint32_t boot_time = 0;
#define TARGET_CHANNEL 1 /**< PA1/ADC1_IN1 used to measure target voltage */
#define SIGNAL_CHANNEL 2 /**< PA2/ADC1_IN2 used to measure signal voltage */
const uint8_t channels[] = {ADC_CHANNEL17, ADC_CHANNEL(TARGET_CHANNEL), ADC_CHANNEL(SIGNAL_CHANNEL)}; /**< voltages to convert (channel 17 = internal voltage reference) */
size_t putc(char c)
{
size_t length = 0; // number of characters printed
@ -69,9 +74,29 @@ size_t putc(char c)
return length; // return number of characters printed
}
#define TARGET_CHANNEL 1 /**< PA1/ADC1_IN1 used to measure target voltage */
#define SIGNAL_CHANNEL 2 /**< PA2/ADC1_IN2 used to measure signal voltage */
const uint8_t channels[] = {ADC_CHANNEL17, ADC_CHANNEL(TARGET_CHANNEL), ADC_CHANNEL(SIGNAL_CHANNEL)}; /**< voltages to convert (channel 17 = internal voltage reference) */
/** print voltage with fixed precision
* @param[in] voltage voltage to print
* @param[in] precision number of digits after comma to print
* @note %f is used to force scientific notation
*/
static void print_voltage(double voltage, uint8_t precision)
{
uint32_t multiplier = 1;
for (uint8_t i = 0; i < precision; i++) {
multiplier *= 10;
}
double to_print = round(voltage * multiplier);
printf("%d.", (int32_t)to_print / multiplier);
char decimal[32];
snprintf(decimal, LENGTH(decimal), "%u", abs(to_print) % multiplier);
if (strlen(decimal) > precision) {
decimal[precision] = 0;
}
for (uint8_t i = strlen(decimal); i < precision; i++) {
putc('0');
}
puts(decimal);
}
/** measure target and signal voltages
* @return voltages of channels
@ -129,8 +154,16 @@ static void command_voltages(void* argument)
(void)argument; // we won't use the argument
float* voltages = measure_voltages(); // measure voltages
puts("voltages:\n");
printf("- target: %.02f V\n", (uint32_t)(voltages[1] * 100) / 100.0);
printf("- signal: %.02f V\n", (uint32_t)(voltages[2] * 100) / 100.0);
puts("- target: ");
print_voltage(voltages[1], 2);
puts(" V\n");
if (voltages[2] >= 3.25) {
puts("- signal: >= 3.30 V\n");
} else {
puts("- signal: ");
print_voltage(voltages[2], 2);
puts(" V\n");
}
}
/** display available commands