AVR: мониторинг напряжения питания

Ibrahim Kamal (IKALOGIC)

Примечание. Выборки исходного кода, размещенные в тексте описания, использовать в своих проектах не рекомендуется. В конце описания имеется ссылка на архив с полным исходным кодом к проекту.

Данная статья преследует учебные цели. Мы рассмотрим аппаратное решение и программную реализацию в задаче измерения уровня напряжения батареи (аккумулятора) с помощью микроконтроллера, который питается от этого же источника. Предполагается, что пользователи знакомы с программированием микроконтроллеров AVR и имеют базовые знания языка Си. Используемый компилятор – WinAVR.

AVR: мониторинг напряжения питания

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

Существует множество способов и решений для отслеживания уровня напряжения батареи питания, многие из них требуют использования внешних компонентов и узлов. Рассматриваемое нами решение не требует внешних компонентов, мы будем использовать лишь ресурсы и периферию микроконтроллера – встроенный АЦП.

Использовать будем микроконтроллер компании Atmel ATMEGA48, но программный код полностью совместим с микроконтроллерами ATMEGA88, ATMEGA168, ATMEGA328. Кроме того, немного исправив исходный код, можно применить данное решение для микроконтроллеров AVR со встроенным АЦП.

Пользователи, наверное задаются вопросом: «Неужели настолько сложен процесс измерения напряжения питания микроконтроллера?» Для решения этой задачи у нас есть микроконтроллер, и нам необходимо преобразовать аналоговую величину напряжения в цифровое значение, которое может использоваться микроконтроллером для дальнейших вычислений и действий.

Вы, наверное, скажете: «Так в чем же дело. Мы подключим положительный вывод батареи, от которой питается микроконтроллер, к входу АЦП и преобразуем величину напряжения в цифровое значение!».

Однако в этом случае вы будете не правы, это не так просто. Проблема в том, что источник напряжения используется для питания самого микроконтроллера (Vcc), а также в качестве источника опорного напряжения АЦП.

Если рассмотреть данную проблему с математической точки зрения, если вы понимаете проблему. В общем случае соотношение между измеренным напряжением и величиной в цифровой форме, преобразованной 8-разрядным АЦП, следующее:

ADC_VALUE = V_measure * 255/V_REF,

где ADC_VALUE – значение полученное при аналого-цифровом преобразовании,
V_measure – измеренная величина напряжения, V_REF – опорное напряжение для АЦП.

Теперь, по условиям нашей задачи, мы знаем что V_measure = V_REF = Vcc и в итоге результатом уравнения всегда будет значение равное 255 и оно не будет изменяться при изменении напряжения батареи. Такая ситуация всегда будет иметь место при измерении напряжение батареи, которое также используется в качестве источника опорного напряжения.

Для решения задачи без использования каких-либо внешних компонентов, AVR микроконтроллер имеет очень полезный встроенный узел, называемый внутренний Band Gap источник опорного напряжения (Band Gap Reference Voltage). Выходное напряжение этого источника около 1.1 В, и оно остается неизменным при изменении температуры и напряжения питания микроконтроллера. Это напряжение может подаваться на вход АЦП, как и любое внешнее напряжение, с единственным исключением, что делается это программно, без включения дополнительных внешних компонентов.

Хотя данный узел не был разработан для нашей определенной цели, мы будем использовать его в нашей задаче по измерению напряжения питания микроконтроллера.

Рассмотрим наше уравнение

ADC_VALUE = V_measure * 255/V_REF,

Но, решая измерить опорное напряжение V_BG, мы получим следующее выражение

ADC_VALUE = V_BG * 255/V_REF

И так как в нашем случае опорное напряжение АЦП равно Vcc (основной момент нашей задачи), то уравнение примет вид

ADC_VALUE = V_BG * 255/Vcc

Зная, что V_BG=1.1 В, из уравнения мы можем вычислить напряжение питания микроконтроллера

Vcc = 1.1 * 255/ADC_VALUE

Благодаря последнему выражению вы сможете вычислить фактическую величину напряжения источника питания вашего устройства на микроконтроллере без использования каких-либо внешних компонентов.

Рассмотрим пример реализации.

Принципиальная схема

AVR: мониторинг напряжения питания, принципиальная схема

Мы используем три NiCad аккумулятора для питания микроконтроллера. Напряжение питания, при полностью заряженных аккумуляторах, составит 4.2 В. Нам необходимо включить светодиод, подключенный к порту PB0, если напряжение будет ниже 3.2 В.

Листинг

#include avrio.h  #include avrinterrupt.h 
// Global variables
float vcc;//variable to hold the value of Vcc
void setup_adc(void)
{
ADMUX = 0xE; //Set the Band Gap voltage as the ADC input
ADCSRA = (1ADEN)|(1ADATE)|(1ADIE)|(1ADSC)|5;
}
ISR(ADC_vect) //ADC End of Conversion interrupt
{
unsigned char adc_data;
adc_data = ADC>>2; //read 8 bit value
vcc = 1.1 * 255 / adc_data;
}
// ***********************************************************
// Main program
// ***********************************************************
int main(void)
{
DDRB = DDRB | (1PB0); //set PB0 as output (for the LED).
sei(); //Activate interrupts setup_adc();
//setup the ADC

while(1)
{
// Infinite loop
if (vcc < 3.2)
{
PORTB |= (1PB0);
}
else
{
PORTB &= ~(1PB0);
}
}
}

Следует учитывать, что напряжение V_BG будет разное у разных микроконтроллеров, особенно из разных партий, и может находиться в пределах  1.01 В – 1.2 В, следовательно необходима будет калибровка. Таким образом, если вычисленное значение Vcc с использованием данного кода неправильное, необходимо проделать следующие действия: измерить вольтметром напряжение питания Vсс и, используя уравнение ниже и зная значение ADC_VALUE, вычислить значение V_BG

ADC_VALUE = V_BG * 255/Vcc

И затем в исходном коде изменить значение напряжения V_BG «1.1» на вычисленное вами значение.

Загрузки

Исходный код - скачать

ikalogic.com

Перевод: Vadim по заказу РадиоЛоцман

Изготовление 1-4 слойных печатных плат за $2

10BASE-T1L Ethernet по витой паре: реализация на основе микросхем Analog Devices
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • Большое спосибо за статью. Все изложено очень доступно и понятно. В познавательных целях, этой статьи нет цены. Да и если кто-то будет проектировать свое устройство, то эти расчеты очень пригодятся.
  • Сам сайт [url]http://www.ikalogic.com/cat_microcontrollers.php[/url]