Использовать как-то так (в Вашем случае интересует Vref_mV):
Код
#define VOLTLEVEL_UPPER 47 // 4.7 kOhm - верхний резистор делителя датчика напряжения
#define VOLTLEVEL_LOWER 10 // 1.0 kOhm - нижний резистор
#define WITHREFSENSORVAL 1210 /* Reference voltage: STM32F746, STM32F429, STM32F446 = 1.21V */
#define HARDWARE_ADCBITS 12 /* АЦП работает с 12-битными значениями */
unsigned hardware_getadc_fsval(void) /* получить максимальное значение значение от АЦП */
{
return (1uL << HARDWARE_ADCBITS) - 1;
}
/* получить значение от АЦП в диапазоне lower..upper (включая границы) */
uint_fast16_t hardware_getadc_unfiltered_u16(uint_fast8_t i, uint_fast16_t lower, uint_fast16_t upper)
{
const unsigned t = hardware_getadc_unfiltered_truevalue(i);
const uint_fast16_t v = lower + ((uint_fast32_t) t * (upper - lower) / hardware_getadc_fsval()); // нормируем к требуемому диапазону
return v;
}
// Вольты в десятых долях
uint_fast8_t get_volt_value(void)
{
const unsigned ref = hardware_getadc_unfiltered_truevalue(VREFIX); // Измерение опрного напряжения
if (ref != 0)
{
const unsigned Vref_mV = (uint_fast32_t) hardware_getadc_fsval() * WITHREFSENSORVAL / ref;
const unsigned voltcalibr_mV = (Vref_mV * (VOLTLEVEL_UPPER + VOLTLEVEL_LOWER) + VOLTLEVEL_LOWER / 2) / VOLTLEVEL_LOWER; // Напряжение fullscale - что показать при ADCVREF_CPU вольт на входе АЦП
const uint_fast16_t mv = hardware_getadc_unfiltered_u16(VOLTSOURCE, 0, voltcalibr_mV);
//debug_printf_P(PSTR("VrefmV=%u, v=%u, out=%u\n"), Vref_mV, mv, (mv + 50) / 100);
return (mv + 50) / 100; // Приводим к десятым долям вольта
}
else
return 0;
}
Сообщение отредактировал Genadi Zawidowski - Jan 25 2016, 08:12