- Що таке АЦП (аналого-цифрове перетворення)
- АЦП в мікроконтролері AVR Atmega16
- Потрібні компоненти
- Кругова діаграма
- Налаштування регістрів управління АЦП в Atmega16
- Програмування Atmega16 для АЦП
Однією із загальних особливостей, яка використовується майже в кожному вбудованому додатку, є модуль АЦП (аналого-цифровий перетворювач). Ці аналого-цифрові перетворювачі можуть зчитувати напругу з аналогових датчиків, таких як датчик температури, датчик нахилу, датчик струму, датчик гнучкості тощо. У цьому посібнику ми дізнаємося, що таке АЦП і як використовувати АЦП в Atmega16. Цей посібник включає підключення малого потенціометра до виводу АЦП Atmega16, а 8 світлодіодів використовуються для відображення змінної напруги вихідного значення АЦП щодо зміни вхідного значення АЦП.
Раніше ми пояснювали АЦП в інших мікроконтролерах:
- Як використовувати АЦП в ARM7 LPC2148 - Вимірювання аналогової напруги
- Як використовувати АЦП в STM32F103C8 - Вимірювання аналогової напруги
- Як використовувати АЦП в MSP430G2 - Вимірювання аналогової напруги
- Як використовувати АЦП в Arduino Uno?
- Використання модуля АЦП мікроконтролера PIC з MPLAB та XC8
Що таке АЦП (аналого-цифрове перетворення)
ADC розшифровується як Analog to Digital Converter. В електроніці АЦП - це пристрій, який перетворює аналоговий сигнал, такий як струм і напруга, у цифровий код (двійкову форму). У реальному світі більшість сигналів є аналоговими, і будь-який мікроконтролер або мікропроцесор розуміє двійкову або цифрову мову (0 або 1). Отже, щоб мікроконтролери зрозуміли аналогові сигнали, ми повинні перетворити ці аналогові сигнали в цифрову форму. ADC точно робить це за нас. Існує багато типів АЦП для різних програм. Мало популярних АЦП - це спалах, послідовне наближення та сигма-дельта.
Найдешевшим типом АЦП є Послідовне наближення, і в цьому навчальному посібнику буде використано Послідовне наближення АЦП. У послідовно-наближеному типі АЦП послідовно генерується серія цифрових кодів, кожен з яких відповідає фіксованому аналоговому рівню. Внутрішній лічильник використовується для порівняння з аналоговим сигналом, що перетворюється. Генерація зупиняється, коли аналоговий рівень стає просто більшим, ніж аналоговий сигнал. Цифровий код відповідає аналоговому рівню бажаного цифрового подання аналогового сигналу. На цьому наше невелике пояснення щодо послідовного наближення закінчується.
Якщо ви хочете глибоко вивчити АЦП, тоді ви можете звернутися до нашого попереднього підручника з АЦП. АЦП доступні у формі мікросхем, а також мікроконтролери сьогодні мають вбудовані АЦП. У цьому посібнику ми використовуватимемо вбудований АЦП Atmega16. Давайте обговоримо про вбудований АЦП Atmega16.
АЦП в мікроконтролері AVR Atmega16
Atmega16 має вбудований 10-бітний і 8-канальний АЦП. 10 біт відповідає тому, що якщо вхідна напруга 0-5 В, тоді воно буде розділене на 10 бітове значення, тобто 1024 рівні дискретних аналогових значень (2 10 = 1024). Тепер 8-канальний відповідає виділеним 8 висновкам АЦП на Atmega16, де кожен штифт може зчитувати аналогову напругу. Повний портA (GPIO33-GPIO40) призначений для роботи АЦП. За замовчуванням висновки PORTA є загальними висновками вводу-виводу, це означає, що виводи порту мультиплексуються. Для того, щоб використовувати ці висновки як висновки АЦП, нам доведеться налаштувати певні регістри, призначені для управління АЦП. Ось чому регістри відомі як контрольні регістри ADC. Давайте обговоримо, як налаштувати ці регістри, щоб почати функціонувати вбудований АЦП.
Шпильки ADC в Atmega16
Потрібні компоненти
- Мікроконтролер мікросхеми Atmega16
- Кристалічний генератор 16 МГц
- Два конденсатори 100 нФ
- Два конденсатори 22pF
- Нажимна Кнопка
- Провід перемички
- Макет
- USBASP v2.0
- Led (будь-який колір)
Кругова діаграма
Налаштування регістрів управління АЦП в Atmega16
1. Реєстр ADMUX (Регістр вибору мультиплексора ADC) :
Регістр ADMUX призначений для вибору каналу АЦП і вибору опорної напруги. На малюнку нижче показано огляд реєстру 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: Вони використовуються для вибору опорної напруги для АЦП.
REFS1 |
REFS0 |
Вибір опорного значення напруги |
0 |
0 |
AREF, Внутрішній Vref вимкнено |
0 |
1 |
AVcc із зовнішнім конденсатором на штифті AREF |
1 |
0 |
Зарезервований |
1 |
1 |
Внутрішня опорна напруга 2,56 із зовнішнім конденсатором на виводі AREF |
Тепер почніть налаштовувати ці регістрові біти в програмі таким чином, щоб ми отримували внутрішнє зчитування АЦП і вихід на всі висновки PORTC.
Програмування Atmega16 для АЦП
Повна програма подана нижче. Запишіть програму в Atmega16 за допомогою JTAG і Atmel studio та обертайте потенціометр, щоб змінювати значення АЦП. Тут код пояснюється рядком за рядком.
Почніть із створення однієї функції для читання перетвореного значення АЦП. Потім передайте значення каналу як 'chnl' у функції ADC_read .
unsigned int ADC_read (unsigned char chnl)
Значення каналів мають бути від 0 до 7, оскільки ми маємо лише 8 каналів АЦП.
chnl = chnl & 0b00000111;
Записавши "40", тобто "01000000" в регістр ADMUX, ми вибрали PORTA0 як ADC0, де аналоговий вхід буде підключений для цифрового перетворення.
ADMUX = 0x40;
Тепер цей крок передбачає процес перетворення ADC, де, записуючи ONE в біт ADSC в реєстрі ADCSRA, ми починаємо перетворення. Після цього зачекайте, поки біт ADIF поверне значення, коли перетворення буде завершено. Ми зупиняємо перетворення, записуючи "1" у біт ADIF в реєстрі ADCSRA. Коли перетворення завершено, поверніть значення ADC.
ADCSRA - = (1 <
Тут внутрішню опорну напругу АЦП вибирають, встановлюючи біт REFS0. Після цього увімкніть ADC і виберіть прескалер як 128.
ADMUX = (1 <
Тепер збережіть значення АЦП і надішліть його на PORTC. У PORTC підключено 8 світлодіодів, які відображатимуть цифровий вихід у 8-бітному форматі. Наведений нами приклад варіює напругу від 0 до 5 В.
i = ADC_read (0); PORTC = i;
Цифровий мультиметр використовується для відображення аналогової вхідної напруги в штифті АЦП, а 8 світлодіодів використовуються для відображення відповідного 8-бітного значення виходу АЦП. Просто оберніть потенціометр і перегляньте відповідний результат на мультиметрі, а також на світяться світлодіодах.
Повний код та робоче відео наведено нижче.