реклама на сайте
подробности

 
 
> STM32L0: ADC относительно Vrefint
k000858
сообщение Jan 25 2016, 07:38
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Всем привет.
Имеется девайс с батареечным питанием, соответственно напряжение питания устройства непостоянно (т.к. батарейка садится), соответственно референсное напряжение так же плавает (да и ноги вроде для него даже нет, контроллер 48 ногий). Поэтому хотелось бы, что бы АЦП мерил относительно встроенного ИОНа.

Вопрос: как в данном контроллере заставить АЦП мерить относительно встроенного ИОНа а не относительно напряжения питания?
Судя по предварительным очкам АЦП - мериит он по дефолту относительно питающего напряжения (а не встроенного иона на 1.2В)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Jan 25 2016, 08:04
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Использовать как-то так (в Вашем случае интересует 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
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 10:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01355 секунд с 7
ELECTRONIX ©2004-2016