Отслеживание уровня заряда у батареи с помощью ардуино/esp 32

mu_ssina
Offline
Зарегистрирован: 30.08.2013

Всем доброго! Машинку делаю маленькую и требуется отслеживать уровень заряда батареи. Как бы это провернуть ?:-) 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
Green
Онлайн
Зарегистрирован: 01.10.2015
#define VBG               1100
#define ADC_RESOLUTION    1024
#define VBG_CHANNEL       14
#define set_vbg_channel() ADMUX = 0<<REFS1 | 1<<REFS0 | 0<<ADLAR | VBG_CHANNEL
#define run_adc()         do { ADCSRA |= 1<<ADSC; while (ADCSRA & 1<<ADSC); } while (0)
#define get_vcc()         ((uint32_t)VBG * ADC_RESOLUTION / ADC)

  set_vbg_channel();
  delay(1);
  run_adc();
  uint16_t vcc = get_vcc();

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

для Ардуины


uint8_t GetVCCValue(const uint16_t us = 200) {
	ADMUX = 1 << REFS0; // опорное напряжение - Vcc
	ADMUX |= 0x0E;    // объект измерения - внутренний источник
					  // стабилизированного напряжения 1.1В
	delayMicroseconds(us);

	uint16_t value = 0;

	for (uint8_t i = 0; i < 16; i++) {

		ADCSRA |= 1 << ADSC;         // запуск АЦ-преобразования
		while (ADCSRA & (1 << ADSC)); // и ожидание его завершения

		value += ((11L * 1023) / ADC);
	}

	value >>= 4;

	return value; //((val > 50) ? 50 : val);
}

отдаёт в целых умноженных на 10, т.е 50 - это 5.0В,  45 это 4.5В и т.д.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Дет, чё такое 11L    и  зачем нужно среднее от 16 ???

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

11L это чтоб промежуточное значение в long считалось, оно потом обрезается перед присваиванием до 16 бит. 

Ну а среднее, я даж не знаю, действительно, а зачем. 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Я про то, чтоБЫ накопить 16 отсчётов в 16-битах в целом числе (16*1023<65535) а потом поделить, не?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

-NMi- пишет:

Я про то, чтоБЫ накопить 16 отсчётов в 16-битах в целом числе (16*1023<65535) а потом поделить, не?

Наерна, можно и так, я не задумывался, тяжело мне это. :) 

Green
Онлайн
Зарегистрирован: 01.10.2015

До 10-х вольта оверсемплинг излишний).

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

можно, наерна, и по 8 измерениям усреднять.  Я вот запустил это утром, с опросм раз в секунду, значение 49 стоит как х у пионера. 

а вот если уменьшать параметр us, даже до 150, уже начинает прыгать, 46-47. 

Update: до сих пор, с 11:40 утра ничего не менялось, счас у мня 16:33

Vcc читается каждую секунду. 

Надо пропробовать от лития запитать. :) Вечером, если не лень будет, припаяю 18650 

mu_ssina
Offline
Зарегистрирован: 30.08.2013

Ок, всем благодарствую-буду пробовать.