Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32L0: ADC относительно Vrefint
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
k000858
Всем привет.
Имеется девайс с батареечным питанием, соответственно напряжение питания устройства непостоянно (т.к. батарейка садится), соответственно референсное напряжение так же плавает (да и ноги вроде для него даже нет, контроллер 48 ногий). Поэтому хотелось бы, что бы АЦП мерил относительно встроенного ИОНа.

Вопрос: как в данном контроллере заставить АЦП мерить относительно встроенного ИОНа а не относительно напряжения питания?
Судя по предварительным очкам АЦП - мериит он по дефолту относительно питающего напряжения (а не встроенного иона на 1.2В)
ViKo
Никак. И не надо. Измеряете свое напряжение. Потом измеряете внутреннее опорное. По отношению кодов вычисляете, чему равно свое напряжение.
Genadi Zawidowski
Использовать как-то так (в Вашем случае интересует 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;
}
k000858
Цитата(ViKo @ Jan 25 2016, 10:46) *
Никак.


Зачем тогда это внутренний ИОН? зачем существуют регистры для его включения для различной периферии включая АЦП?


Цитата(ViKo @ Jan 25 2016, 10:46) *
Никак. И не надо. Измеряете свое напряжение. Потом измеряете внутреннее опорное. По отношению кодов вычисляете, чему равно свое напряжение.

такой алгоритм оставил на прозапас.
с ним пока сложности: на Л0 линейке оказалось ни так просто запустить АЦП с мульти-каналами без ДМА (мне там перед замерами 2 каналов надо шевелить ножками для коммутации, поэтому необходимо запускать замер вручную)
ViKo
Цитата(k000858 @ Jan 25 2016, 12:21) *
Зачем тогда это внутренний ИОН? зачем существуют регистры для его включения для различной периферии включая АЦП?

Вот для таких относительных измерений он и предназначен.
Цитата
такой алгоритм оставил на прозапас.
с ним пока сложности: на Л0 линейке оказалось ни так просто запустить АЦП с мульти-каналами без ДМА (мне там перед замерами 2 каналов надо шевелить ножками для коммутации, поэтому необходимо запускать замер вручную)

Есть инжектированные каналы, есть регулярные. Не знаю, как там, конкретно, в STM32L0xx.
Не обязательно запускать измерение ИОН так же часто, как измеряемых каналов.
k000858
Цитата(ViKo @ Jan 25 2016, 12:29) *
Вот для таких относительных измерений он и предназначен.

Есть инжектированные каналы, есть регулярные. Не знаю, как там, конкретно, в STM32L0xx.
Не обязательно запускать измерение ИОН так же часто, как измеряемых каналов.

Вот в Л0 как раз ничего толком и нету - 1 АЦП и несколько регулярных каналов.
по ДМА смог легко в фоновом режиме записывать с каждого канала значение в свою переменную, а в моем случае такой алгоритм подойдет. ломаю голову пока что.
ViKo
Вы же не постоянно измеряете, есть паузы? Вот в них запускайте измерение ИОН.
Obam
DocID025274 Rev 3 стр.324 ST всё расписали: Vdda вообще знать не надо.

"For applications where VDDA value is not known, you must use the internal voltage
reference and VDDA can be replaced by the expression provided in the section Calculating
the actual VDDA voltage using the internal reference voltage, resulting in the following
formula: VCHANNELx=(3 V × VREFINT_CAL × ADC_DATAx)/(VREFINT_DATA × FULL_SCALE)
Where:
• VREFINT_CAL is the VREFINT calibration value
• ADC_DATAx is the value measured by the ADC on channel x (right-aligned)
• VREFINT_DATA is the actual VREFINT output value converted by the ADC
• full_SCALE is the maximum digital value of the ADC output. For example with 12-bit
resolution, it will be 212 - 1 = 4095 or with 8-bit resolution, 28 - 1 = 255.
Note: If ADC measurements are done using an output format other than 12 bit right-aligned, all the
parameters must first be converted to a compatible format before the calculation is done."
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.