STM32 и analogReference()

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет! Имеется микроконтроллер STM32L152CBT6, на его основе делаю часы. Питание от аккумулятора.  Ядро STM: https://github.com/stm32duino/

Столкнулся с проблемой. Так как питание от аккумулятора то входное напряжение "плавает" в зависимости от напряжения на аккумуляторе. По умолчанию в качестве опорного напряжения используется напряжение питания, но в данном случае это плохой выбор, так как не получится точно узнать напряжение на аккумуляторе. Для правильного измерения необходимо использовать внутреннее опорное напряжение. Но я не знаю как это сделать. В примерах ничего похожего не нашел. На Гитхабе тоже. Может вы что-то подскажите? Обычная команда analogReference() вызывает ошибки при компиллировании - неизвестная команда.

Подскажите, как указать внутреннее опорное напряжение?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
typedef enum _eAnalogReference {
  AR_DEFAULT,
} eAnalogReference ;

/*
 * \brief Configures the reference voltage used for analog input (i.e. the value used as the top of the input range).
 * This function is kept only for compatibility with existing AVR based API.
 *
 * \param ulMmode Should be set to AR_DEFAULT.
 */
extern void analogReference(eAnalogReference ulMode) ;

 

forfrends
Offline
Зарегистрирован: 24.02.2015

Получается нет такой функции? Жаль...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Функция есть, "железа" такого нету.)))

Остается только резать дорожки и подпаивать недостающее "железо".

forfrends
Offline
Зарегистрирован: 24.02.2015

Ну, по документации у МК есть внутреннее опорное напряжение. Только, похоже, этот функционал не включили в ядро.

b707
Offline
Зарегистрирован: 26.05.2017

или поставить внешний референс на tl431 и измерять его

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

forfrends, в смысле не включили в ядро, а что там надо включать? Там нет такого как в AVR, референс ацп нельзя переключить на внутренний. Читаете 17й вход мультиплексора ADC, полученное значение попугаев соответствуют 1,224 вольта.  Из этого вычисляется скольки милливольтам соответствует один попугай ADC.  И всё.

rkit
Offline
Зарегистрирован: 23.11.2016

Открой даташит и сделай сам на регистрах. Вопрос часа работы в худшем случае. Советчики один хуже другого, как всегда. Никто не знает о чем идет речь, но советуют, блин.

nik182
Offline
Зарегистрирован: 04.05.2015

Rkit, ты как всегда круче всех. Так расскажи как правильно. Особенно учитывая что Дима описал правильно процесс калибровки разряда АЦП не упомянув только детали дополнительных битов конфигурации перед считыванием 17 канала, но это ясно описано в reference manual на МК. 

rkit
Offline
Зарегистрирован: 23.11.2016

Ок, был неправ. В этой модели нет входа опорного напряжения. В стопиновых можно выдать внутренее напряжение на пин и закоротить его на опорный вход.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

 В принципе можно и не мучать регистрами неокрепший мозг ардуинщиков, а сделать всё одной ардуино-френдли командой:

uint32_t Vcc = (1224 <<10 ) / analogRead(AVREF); //для stm-аддона

И сразу имеем в переменной Vcc напряжение питания мк в милливольтах, или что там хотел измерить ТС...