- Какво е ADC (аналогово-цифрово преобразуване)
- ADC в AVR микроконтролер Atmega16
- Необходими компоненти
- Електрическа схема
- Настройване на ADC контролни регистри в Atmega16
- Програмиране на Atmega16 за ADC
Една обща характеристика, която се използва в почти всяко вградено приложение, е модулът ADC (аналогов към цифров конвертор). Тези аналогово-цифрови преобразуватели могат да отчитат напрежение от аналогови сензори като температурен сензор, сензор за наклон, токов сензор, Flex сензор и т.н. В този урок ще научим какво е ADC и как да използваме ADC в Atmega16. Този урок включва свързване на малък потенциометър към ADC щифт на Atmega16 и 8 светодиода се използват за показване на променящото се напрежение на изходната стойност на ADC по отношение на промяната на входната стойност на ADC.
По-рано обяснихме ADC в други микроконтролери:
- Как да използвам ADC в ARM7 LPC2148 - Измерване на аналогово напрежение
- Как да използвам ADC в STM32F103C8 - Измерване на аналогово напрежение
- Как да използвам ADC в MSP430G2 - Измерване на аналогово напрежение
- Как да използвам ADC в Arduino Uno?
- Използване на ADC модул на PIC микроконтролер с MPLAB и XC8
Какво е ADC (аналогово-цифрово преобразуване)
ADC означава Analog to Digital Converter. В електрониката ADC е устройство, което преобразува аналогов сигнал като ток и напрежение в цифров код (двоична форма). В реалния свят повечето от сигналите са аналогови и всеки микроконтролер или микропроцесор разбира бинарния или цифровия език (0 или 1). Така че, за да накараме микроконтролерите да разберат аналоговите сигнали, трябва да преобразуваме тези аналогови сигнали в цифрова форма. ADC прави точно това за нас. Има много видове ADC, налични за различни приложения. Малко популярни ADC са флаш, последователно приближение и сигма-делта.
Най-евтиният тип ADC е Последователно приближение и в този урок ще се използва ADC Последователно приближение. В последователно приближаващ тип ADC, последователно се генерират поредица от цифрови кодове, всеки от които съответства на фиксирано аналогово ниво. Вътрешен брояч се използва за сравнение с аналоговия сигнал при преобразуване. Генерирането се спира, когато аналоговото ниво стане малко по-голямо от аналоговия сигнал. Цифровият код съответства на аналоговото ниво е желаното цифрово представяне на аналоговия сигнал. Това завършва нашето малко обяснение за последователно приближение.
Ако искате да разгледате ADC много задълбочено, тогава можете да се обърнете към нашия предишен урок за ADC. ADC се предлагат под формата на интегрални схеми, а в днешно време микроконтролерите се предлагат с вграден ADC. В този урок ще използваме вграден ADC на Atmega16. Нека да обсъдим за вградения ADC на Atmega16.
ADC в AVR микроконтролер Atmega16
Atmega16 има вграден 10 битов и 8-канален ADC. 10 бита съответства на това, ако входното напрежение е 0-5V, то ще бъде разделено на 10 битова стойност, т.е. 1024 нива на дискретни аналогови стойности (2 10 = 1024). Сега 8-канален съответства на специалните 8 ADC щифта на Atmega16, където всеки щифт може да отчита аналоговото напрежение. Пълният портA (GPIO33-GPIO40) е предназначен за ADC работа. По подразбиране изводите PORTA са общи IO изводи, това означава, че изводите на портовете се мултиплексират. За да използваме тези щифтове като ADC щифтове, ще трябва да конфигурираме определени регистри, предназначени за управление на ADC. Ето защо регистрите са известни като ADC контролни регистри. Нека обсъдим как да настроим тези регистри, за да започнат да функционират вградения ADC.
ADC щифтове в Atmega16
Необходими компоненти
- IC микроконтролер Atmega16
- 16Mhz кристален осцилатор
- Два кондензатора 100nF
- Два кондензатора 22pF
- Натисни бутона
- Джъмперни проводници
- Макет
- USBASP v2.0
- LED (всеки цвят)
Електрическа схема
Настройване на ADC контролни регистри в Atmega16
1. Регистър ADMUX (Регистър за избор на мултиплексор ADC) :
Регистърът ADMUX е за избор на ADC канал и избор на референтно напрежение. Долната снимка показва общия преглед на ADMUX регистъра. Описанието е обяснено по-долу.
- Бит 0-4: битове за избор на канал.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
Избран е ADC канал |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- Бит-5: Използва се за регулиране на резултата надясно или наляво.
АДЛАР |
Описание |
0 |
Регулирайте резултата отдясно |
1 |
Настройте резултата отляво |
- Бит 6-7: Те се използват за избор на референтното напрежение за ADC.
REFS1 |
REFS0 |
Избор на еталонно напрежение |
0 |
0 |
AREF, Вътрешният Vref е изключен |
0 |
1 |
AVcc с външен кондензатор на AREF щифт |
1 |
0 |
Резервиран |
1 |
1 |
Вътрешно референтно напрежение 2,56 с външен кондензатор на AREF Pin |
Сега започнете да конфигурирате тези регистрационни битове в програмата, така че да получим вътрешно ADC четене и извеждане на всички пинове на PORTC.
Програмиране на Atmega16 за ADC
Пълната програма е дадена по-долу. Запишете програмата в Atmega16 с помощта на JTAG и Atmel studio и завъртете потенциометъра, за да промените стойността на ADC. Тук кодът е обяснен ред по ред.
Започнете с създаването на една функция за четене на ADC преобразувана стойност. След това предайте стойността на канала като 'chnl' във функцията ADC_read .
неподписан int ADC_read (неподписан char chnl)
Стойностите на каналите трябва да са между 0 и 7, тъй като имаме само 8 ADC канала.
chnl = chnl & 0b00000111;
Като пишем „40“, т.е. „01000000“ в ADMUX регистър, ние избрахме PORTA0 като ADC0, където аналоговият вход ще бъде свързан за цифрово преобразуване.
ADMUX = 0x40;
Сега тази стъпка включва процес на преобразуване ADC, където чрез записване на ONE в ADSC Bit в ADCSRA регистър започваме преобразуване. След това изчакайте ADIF бита да върне стойност, когато преобразуването завърши. Спираме преобразуването, като пишем „1“ в ADIF Bit в регистъра ADCSRA. Когато преобразуването приключи, върнете ADC стойност.
ADCSRA - = (1 <
Тук вътрешното референтно напрежение на ADC се избира чрез задаване на бит REFS0. След това активирайте ADC и изберете prescaler като 128.
ADMUX = (1 <
Сега запазете ADC стойност и я изпратете на PORTC. В PORTC са свързани 8 светодиода, които ще показват цифровия изход в 8 битов формат. Примерът, който показахме, варира напрежението между 0V до 5V, като се използва един 1K пот.
i = ADC_read (0); PORTC = i;
Цифровият мултиметър се използва за показване на аналогово входно напрежение в ADC Pin и 8 светодиода се използват за показване на съответната 8-битова стойност на ADC изхода. Просто завъртете потенциометъра и вижте съответния резултат на мултицет, както и на светещи светодиоди.
Пълният код и работещото видео са дадени по-долу.