Программа Сервисный Центр
0

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
AVR: мониторинг напряжения питания
avrio.h
AVR: мониторинг напряжения питания
#include
AVR: мониторинг напряжения питания
avrinterrupt.h
AVR: мониторинг напряжения питания
// Global variablesfloat vcc;//variable to hold the value of Vccvoid setup_adc(void){ ADMUX = 0xE; //Set the Band Gap voltage as the ADC input ADCSRA = (1
AVR: мониторинг напряжения питания
AVR: мониторинг напряжения питания
ADEN)|(1
AVR: мониторинг напряжения питания
AVR: мониторинг напряжения питания
ADATE)|(1
AVR: мониторинг напряжения питания
AVR: мониторинг напряжения питания
ADIE)|(1
AVR: мониторинг напряжения питания
AVR: мониторинг напряжения питания
ADSC)|5;}ISR(ADC_vect) //ADC End of Conversion interrupt {unsigned char adc_data;adc_data = ADC>>2; //read 8 bit valuevcc = 1.1 * 255 / adc_data;}// ***********************************************************// Main program// ***********************************************************int main(void) { DDRB = DDRB | (1
AVR: мониторинг напряжения питания
AVR: мониторинг напряжения питания
PB0); //set PB0 as output (for the LED). sei(); //Activate interrupts setup_adc(); //setup the ADC while(1) { // Infinite loop if (vcc < 3.2) { PORTB |= (1
AVR: мониторинг напряжения питания
AVR: мониторинг напряжения питания
PB0); } else { PORTB &= ~(1
AVR: мониторинг напряжения питания
AVR: мониторинг напряжения питания
PB0); } }} Следует учитывать, что напряжение V_BG будет разное у разных микроконтроллеров, особенно из разных партий, и может находиться в пределах  1.01 В – 1.2 В, следовательно необходима будет калибровка. Таким образом, если вычисленное значение Vcc с использованием данного кода неправильное, необходимо проделать следующие действия: измерить вольтметром напряжение питания Vсс и, используя уравнение ниже и зная значение ADC_VALUE, вычислить значение V_BG ADC_VALUE = V_BG * 255/Vcc И затем в исходном коде изменить значение напряжения V_BG «1.1» на вычисленное вами значение. Загрузки Исходный код - скачать

По материалам сайта www.rlocman.ru

 
 
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
 
Обратная связь

Наши партнеры

 

Опросы

Есть ли справедливость в жизни?
Конечно есть, уверен!
Вроде как должна быть, но...
Затрудняюсь ответить...
Какая справедливость? О чем Вы?
Эх.., нет правды на свете!

 

Облако тегов

Требуется для просмотраFlash Player 9 или выше.

Показать все теги
 

Календарь публикаций

«    Декабрь 2016    »
ПнВтСрЧтПтСбВс
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
 

Архив новостей

Декабрь 2016 (15)
Ноябрь 2016 (42)
Октябрь 2016 (34)
Сентябрь 2016 (38)
Август 2016 (34)
Июль 2016 (36)
 
Наверх Сервисные мануалы Даташиты Ремонт LCD, ЖК телевизоров LG Samsung Скрипт программы "Сервисный центр"