Войти Регистрация

Войдите в свой аккаунт

Логин *
Пароль *
Запомнить меня

Создать аккаунт

Поля, отмеченные звездочкой(*) обязательны.

АЦП – аналогово-цифровой преобразователь (ADC- Analog-to-Digital Converter). Преобразует некий аналоговый сигнал в цифровой. Битность АЦП определяет точность преобразования сигнала. Время преобразования – соответственно скорость работы АЦП. АЦП встроен во многих микроконтроллерах семейства AVR и упрощает использование микроконтроллера во всяких схемах регулирования, где требуется оцифровывать некий аналоговый сигнал.


Рассмотрим принцип работы АЦП. Для преобразования нужен источник опорного напряжения и собственно напряжение, которое мы хотим оцифровать (напряжение, которое преобразуется должно быть меньше опорного). Также нужен регистр, где будет храниться преобразованное значение, назовем его Z. Входное напряжение = Опорное напряжение*Z/2^N, где N – битность АЦП. Условимся, что этот регистр, как у ATmega8, 10-ти битный. Преобразование в нашем случае проходит в 10 стадий. Старший бит Z9 выставляется в единицу. Далее генерируется напряжение (Опорное напряжение*Z/1024), это напряжение, с помощью аналогового компаратора сравнивается с входным, если оно больше входного, бит Z9 становиться равным нулю, а если меньше – остается единицей. Далее переходим к биту Z8 и вышеописанным способом получаем его значения. После того, как вычисление регистра Z окончено, выставляется некий флаг, который сигнализирует, что преобразование закончено и можно считывать полученное значение. На точность преобразования могут очень сильно влиять наводки и помехи, а также скорость преобразования. Чем медленнее происходит преобразования – тем оно точней. С наводками и помехами следует бороться с помощью индуктивности и емкости, как советует производитель в даташите:

01

В микроконтроллерах AVR как источник опорного напряжения может использоваться вывод AREF, или внутренние источники 2,56В или 1,23В. Также источником опорного напряжения может быть напряжение питания. В некоторых корпусах и моделях микроконтроллеров есть отдельные выводы для питания АЦП: AVCC и AGND. Выводы ADCn – каналы АЦП. С какого канала будет оцифровываться сигнал можно выбрать с помощью мультиплексора.
Теперь продемонстрируем примером сказанное выше. Соорудим макет, который будет работать как вольтметр с цифровой шкалой. Условимся, что максимальное измеряемое напряжение будет 10В. Также пусть наш макет выводит на ЖКИ содержимое регистра ADC.

Схема

Для увеличения кликните на схему.

Обвязка микроконтроллера и ЖКИ WH1602A стандартна. X1 – кварцевый резонатор на 4 Мгц, конденсаторы С1,С2 – 18-20 пФ. R1-C7 цепочка на выводе reset по 10 кОм и 0,1 мкФ соответственно. Сигнальный светодиод D1 и ограничивающий резистор R2 200 Ом и R3 – 20 Ом. Регулировка контраста ЖКИ – VR1 на 10 кОм. Источник опорного напряжения мы будем использовать встроенный на 2,56В. С помощью делителя R4-R5 мы добьемся максимального напряжения 2,5В на входе PC0, при напряжении на щупе 10В. R4 – 3 кОм, R5 – 1 кОм, в их номиналу нужно отнестись тщательно, но если не возможности подобрать точно такие, можно сделать любой резистивный делитель 1:4 и программно подкорректировать показания, если это потребуется. Дроссель на 10мкГн и конденсатор на 0,1 мкФ для устранения шумов и наводок на АЦП на схеме не показан. Их наличие подразумевается само собой, если используется АЦП. Теперь дело за программой:

{codecitation style="brush: xml;"} #include

#define RS 2 //RS=PD2
#define E 3 //E=PD3

#define TIME 10 //Константа временной задержки для ЖКИ
//Частота тактирование МК - 4Мгц

#define R_division 3.837524 //=R4/R5 константа

unsigned int u=0; //Глобальная переменная с содержимым преобразования

void pause (unsigned int a)
{
unsigned int i;
for (i=a;i>0;i--);
}

void lcd_com (unsigned char lcd) //Передача команды ЖКИ
{
unsigned char temp;

temp=(lcd&~(1<<rs))|(1 e="" rs="0" br=""> PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<e); br="">
temp=((lcd*16)&~(1<<rs))|(1 e="" rs="0" br=""> PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<e); br="">
pause(10*TIME); //Пауза для выполнения команды
}

void lcd_dat (unsigned char lcd) //Запись данных в ЖКИ
{
unsigned char temp;

temp=(lcd|(1<<rs))|(1 e="" rs="1" br=""> PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<e); br="">
temp=((lcd*16)|(1<<rs))|(1 e="" rs="1" br=""> PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<e); br="">
pause(TIME); //Пауза для вывода данных
}

void lcd_init (void) //Иниализация ЖКИ
{
lcd_com(0x2c); //4-проводный интерфейс, 5x8 размер символа
pause(100*TIME);
lcd_com(0x0c); //Показать изображение, курсор не показывать
pause(100*TIME);
lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00
pause (100*TIME);
}

unsigned int getADC(void) //Считывание АЦП
{ unsigned int v;

ADCSRA|=(1<<adsc); br="">
while ((ADCSRA&_BV(ADIF))==0x00) //Дождатся окончания преобразования
;

v=(ADCL|ADCH<<8); br=""> return v;
}

void write_data (unsigned int u)
{ unsigned char i;
double voltage=0;

lcd_com(0x84); //Вывод регистра ADC на ЖКИ
for (i=0;i<10;i++) br=""> if ((u&_BV(9-i))==0x00) lcd_dat (0x30);
else lcd_dat (0x31);

lcd_com(0xc2);
voltage= R_division*2.56*u*1.024; //Расчет напряжения

i=voltage/10000; //Выведение напряжения на ЖКИ
voltage=voltage-i*10000;
if (i!=0) lcd_dat(0x30+i);

i=voltage/1000;
voltage=voltage-i*1000;
lcd_dat(0x30+i);

lcd_dat(',');

i=voltage/100;
voltage=voltage-i*100;
lcd_dat(0x30+i);

i=voltage/10;
voltage=voltage-i*10;
lcd_dat(0x30+i);

lcd_dat('v');
}

int main(void)
{
DDRD=0xfc;

pause(3000); //Задержка для включения ЖКИ
lcd_init(); //Инициализация ЖКИ

lcd_dat('A'); //Пишем "ADC=" и "U=" на ЖКИ
lcd_dat('D');
lcd_dat('C');
lcd_dat('=');
lcd_com(0xc0);
lcd_dat('U');
lcd_dat('=');

ADCSRA=(1<<aden)|(1 adps1="" 1="" adps0="" br=""> //Включаем АЦП, тактовая частота бреобразователя =/8 от тактовой микроконтроллера
ADMUX=(1<<refs1)|(1 refs0="" 0="" mux0="" mux1="" mux2="" mux3="" br=""> //Внутренний источник опорного напряжения Vref=2,56, входом АЦП является PC0

while(1)
{
u=getADC(); //Считываем данные
write_data(u); //Выводим их на ЖКИ
pause(30000);
}

return 1;
}

{/codecitation}

Программа проста. В начале мы инициализируем порты ввода/вывода. Для того, чтобы служить входом АЦП, пин PC0 должен работать на вход. Далее проводим инициализацию ЖКИ и АЦП. Инициализация АЦП заключается в его включении битом ADEN в регистре ADCSRA. И выбора частоты преобразования битами ADPS2, ADPS1, ADPS0 в том же регистре. Также выбираем источник опорного напряжения, биты REFS1 REFS0 в регистре ADMUX и вход АЦП: биты MUX0,MUX1,MUX2, MUX3 (в нашем случаем входом АЦП является PC0, поэтому MUX0.3=0). Далее, в вечном цикле, начинаем преобразования установкой бита ADSC в регистре ADCSRA. Дожидаемся окончания преобразования (бит ADIF в ADCSRA становиться равным 1). Далее вынимаем данные из регистра ADC и выводим их на ЖКИ. Вынимать данные из ADC нужно в такой последовательности: v=(ADCL+ADCH*256); если использовать v=(ADCH*256+ADCL); - в упор не работает. Также есть хитрость, чтобы не работать с дробными числами. Когда производиться вычисления входного напряжения в вольтах. Мы просто будем хранить наше напряжения в милливольтах. Например, значение переменной voltage 4234 означает, что мы имеем 4,234 вольта. Вообще операции с дробными числами кушают очень много памяти микроконтроллера (наша прошивка вольтметра весит чуть больше 4 килобай, это половина памяти программ ATmega8!), их рекомендуется использовать только при особой необходимости. Вычисления входного напряжения в милливольтах просто: voltage=R_division*2.56*u*1.024;
Здесь R_division – коефициент резистивного делителя R4-R5. Так, как реальный коефициент делителя может отличаться от расчетного, то наш вольтметр будет врать. Но подкорректировать это просто. С помощью тестера меряем некое напряжение, получаем X вольт, а наш вольтметр пускай показывает Y вольт. Тогда R_division = 4*X/Y, если Y больше X и 4*Y/X если X больше Y. На этом настройка вольтметра завершена, и им можно пользоваться.
Скачать прошивку в виде проекта под AVR Studio 4.
Как работает вольтметр можно ознакомиться на видео:

Также можно доработать свой блок питания. Вставив в него цифровой вольтметр-амперметр на ЖКИ и защиту от перегрузки (для измерения тока нам понадобиться мощный шунт сопротивлением порядка 1 Ом).

vidon

В свой блок питания я встроил еще защиту от перегрузки, когда ток превышает 2А, то пьезо пищалка начинает усердно пищать, сигнализируя о перегрузке:

Опубликовано в Устройства на AVR PIC
Суббота, 26 февраля 2011 13:29

Цифровой вольтметр 0-30V на PIC16F676

 Это простой цифровой вольтметр на 7-сегментных индикаторах, может бить неплохим дополнением к лабораторному блоку питания. В схеме используется PIC-контроллер PIC16F676, у которого есть АЦП 10-бит 8 каналов, но этот проект использовать только один канал для измерения напряжения. Схем очень простая:

Опубликовано в Устройства на AVR PIC
Изображение по умолчанию

Экономичное освещение для всех

Название: Экономичное освещение для всех Автор: Б. Ю. Семенов Количество страниц: 224…

Стереоусилитель на TDA1521 с индикатором перегрузки

Если вам потребовался несложный двухканальный усилитель мощности среднего класса, то…

Улучшаем компьютерный блока питания

Наши друзья меньшие (Китайцы) заполонили рынок электроники, но не всегда они бывают…

Ночник на ярких светодиодах.

Иногда просыпаясь ночью и идя сонным по комнате можно случайно споткнутся , или когда у…

Шумы в унч

Помехи в усилителях Часто у начинающих радиолюбителей возникают проблемы с настройкой…
Изображение по умолчанию

Преобразователи частоты- просто о сложном

Название: Преобразователи частоты- просто о сложном Автор: ЗАО «Данфосс» Количество…
Радиоконструктор 2010 №5

Радиоконструктор 2010 №5

Название: Радиоконструктор Год / месяц: 2010/май Номер: 05 Формат:…

Драйвер для мощных светодиодов

В настоящее время цена мощных светодиодов от 1-го ватта и выше не очень высока, что…
 

Топ

ТЕЛЕФОННАЯ…

Приставка-спикерфон предназначена для громкоговорящей телефонной связи. Занятие линии АТС…

Управление…

Автор разработал программу и устройство для управления различными электро и…

Вольтамперметр на…

Идеологом этой схемы является вот этот вариант http://avr.4mg.com/custom4_1.html захотел…

Ветрогенератор для…

Как работает ветрогенератор ? Работа любого ветрогенератора, независимо от того, снабжает…

Импульсный…

Импульсный преобразователь сетевого напряжения Применение импульсного преобразователя…

Импульсный блок…

Импульсный блок питания 180Вт Мощность блока питания — около 180 Вт, выходное напряжение…

Эмулятор ключей…

Назначение. Устройство предназначено для считывания, хранения и эмуляции ключей домофонов…

Цифровой…

Цифровой вольтамперметр предназначенный для установки в блок питания для отображения…
500 схем для радиолюбителей - Подборка книг (DJVU)

500 схем для…

1. 500 схем для радиолюбителей. Приемники2. 500 схем для радиолюбителей. Усилители…

ИНДИКАТОР УРОВНЯ…

Принципиальная схема индикатора показана на рисунке. Эта схема использовалась для…

Голосовой монитор…

Голосовой монитор (далее – монитор) предназначен для контроля телефонной линии или…

ТАЙМЕР, УПРАВЛЯЮЩИЙ…

В теме представлено таймерное устройство, управляющее освещением багажника ВАЗ-2114, но…
 

Авторизация