У підручнику ми навчились через елементарні завдання, як програмувати в збірці, як виводити сигнали управління на зовнішні схеми, як приймати зовнішні сигнали у двох станах і як генерувати ШІМ-сигнали, а також реалізовувати ШІМ-сигнали майже довільної роздільної здатності та частота. Наразі це було б добре, але чогось ще не вистачає. Ще чогось насправді не вистачає. Це різне трактування зовнішніх сигналів двох станів. Насправді не все є бінарним, хоча це частина нашого цифрового світу мікроконтролера, тому нам також потрібно виявляти зовнішні сигнали (наприклад, напругу) з правильним дозволом для багатьох проблем. Таке електронне рішення називається аналого-цифровим перетворювачем, а пристрій, який може це зробити, називається аналого-цифровим перетворювачем.
19.1. Конвертер ADuC 842 AD
Блок аналого-цифрового перетворювача ADuC 842 забезпечує швидке, 8-канальне, 12-бітове дозвіл, одностороннє живлення (негативне живлення не потрібно). Професійний користувач навіть має можливість калібрування. Перетворювач AD працює за принципом послідовного наближення, який базується на конденсаторі для перетворення AD. Перетворення може бути одиночним (це, звичайно, повторюване) або безперервним режимом, опорна напруга може бути внутрішнім або зовнішнім сигналом. Конвертер AD також відіграє роль у доступі до будь-якої підключеної зовнішньої пам'яті. Перетворювач ADuC 842 AD відкалібрований на заводі; при увімкненні калібрувальні константи завантажуються для забезпечення оптимальної роботи.
Внутрішня опорна напруга перетворювача AD становить 2,5 В, тому точність 0,61 мВ може бути досягнута при 12-бітовій роздільній здатності (212 = 4096) (2,5/4095 = 0,61). Цього достатньо для багатьох додатків. Знову ж, оцифровані значення напруги доступні лише у подвійному регістрі (ADCDATAH/ADCDATAL), але зверніть увагу, що верхні 4 біти регістру ADCDATAH використовуються для ідентифікації каналу. Це показано на малюнку нижче.
Існує три регістри конфігурації для перетворення AD, ADCCON1, ADCCON2 та ADCCON3. Останній бере участь лише у калібруванні перетворювача, тому ми нехтуємо цим обговоренням, оскільки ми обговорюємо лише декілька елементів рішення у підручнику. Інші два регістри описані в [Таблиця 19.1] та [Таблиця 19.2].
Реєстр контролю переходів AD
Регістр управління перетвореннями AD
Значення за замовчуванням після включення:
40 год = 0100 0000 б
Побітова адресація:
1 - Увімкніть перетворювач AD. 0 - вимкнути перетворювач AD.
1 - використання зовнішнього посилання. 0 - використовувати внутрішнє посилання. Ми не будемо обговорювати.
Біти тактового дільника для власного годинника перетворення AD. Для належної роботи перетворювача AD потрібен тактовий сигнал 8,38 МГц або менше. Типове перетворення AD вимагає 16 годин перетворення AD, плюс вибраний час доступу до даних. Коефіцієнт розподілу можна вибрати з наступного:
CK1 CK0 Розділювач годинника
0 1 4 (Не використовувати, коли годинник компакт-диск
Біти доступу до даних можна використовувати для вибору часу, який буде доступний для вхідного відстеження та утримання підсилювача для запиту вхідного сигналу. Для доступу до даних рекомендується 3 або більше годин перетворення AD.
AQ1 AQ0 Кількість годин перетворення AD
Використання таймера 2. Ми не будемо обговорювати.
Використовуйте зовнішній тригерний сигнал. Ми не будемо обговорювати.
Реєстр контролю переходів AD 2
Реєстр управління перетвореннями AD 2
Значення за замовчуванням після включення:
Побітова адресація:
Біт припинення перетворення AD. В кінці циклу перетворення встановлюється значення 1. Якщо програма переходить до процедури переривання через власний вектор переривання, вона стирається з апаратного забезпечення. В іншому випадку користувач повинен його видалити.
Біт увімкнення режиму DMA. Ми не будемо обговорювати.
Біт безперервного режиму. Якщо встановлено значення 1, відбувається безперервне перетворення AD, тобто новий цикл перетворення починається після завершення попереднього.
Біт одноразового перетворення. Відбувається один цикл перетворення, в кінці якого біт автоматично змінюється на 0.
CS3 CS2 CS1 CS0 Номер каналу/інший коментар
1 0 0 0 Моніторинг температури. Ні
1 0 0 1 ЦАП0. Ми не будемо обговорювати.
1 0 1 0 ЦАП1. Ми не будемо обговорювати.
1 0 1 1 AGND. Ми не будемо обговорювати.
1 1 1 1 DMA STOP. Ми не будемо обговорювати.
Інші комбінації зайняті.
19.2. Легке перетворення AD
У цьому підрозділі ми виконуємо перетворення AD на будь-якому джерелі напруги з використанням окремих циклів перетворення. Дуже важливо, щоб перетворювана напруга не перевищувала +2,5 В! До речі, про це завжди повинен дбати користувач, тому, якщо ми створюємо власну програму та схему, нам слід звернути дуже-дуже пильну увагу на це правило і відповідно проектувати наші схеми! У будь-якому випадку, чіп ADuC 842 не вийде з ладу, навіть якщо ми трохи перевищимо межу напруги +2,5 В, але ми все одно не можемо починати зі значення, що перевищує межу, оскільки тоді перетворене значення давно вже досягло максимального значення. Полярність джерела напруги є ще більш делікатною справою, якщо вона випадково зміниться, коли напруга підключена до входу перетворювача AD, вимірювальний дим підніметься ... A [19.2. фігура]. Малюнок 2 повторює правила перетворення AD великими літерами, кольоровими…
Після всього цього ми можемо запустити нашу першу програму конвертера AD.
Виміряйте напругу за допомогою мікроконтролера в діапазоні від 0 В до +2,5 В і надішліть виміряне значення через послідовний порт на ПК, але використовуйте лише найцінніші 8 біт перетворювача AD! [Код43]
По-перше, давайте подумаємо, що означає мати найцінніші 8 біт AD-перетворювача! A [19.1. фігура]. На рисунку 1 показано, в яких регістрах і в яких ми знаходимо 12 бітів оцифрованого рівня сигналу. Тепер нам потрібні 8 найцінніших, тобто ми викидаємо чотири нижні. Це також добре підходить для початкової спроби, оскільки наша резолюція все одно буде 0,0098 В. Справа в тому, що половина наших необхідних бітів знаходиться в регістрі ADCDATAH, а інша половина - у реєстрі ADCDATAL. A [19.3. фігура]. На малюнку 1 показано, які біти нам потрібні.
Виділити 8 необхідних бітів з двох реєстрів буде простіше, ніж ви думаєте. Набір інструкцій ядра процесора 8051/8052 містить дуже підходящу для цього інструкцію:
Інструкція просто міняє місцями два півбайта батареї. Мнемоніка, як вона є, буває значущим словом в англійській мові; це означає обміняти, обміняти. Отже, якщо значення акумулятора, скажімо, A = 10010110, A = 01101001 генерується після виконання інструкції SWAP A. Знаючи це, ми завантажимо вміст реєстру ADCDATAH в батарею, скинемо його верхні чотири біти, поміняємо місцями два півбайта, а потім збережемо отримане значення до напруги. Таким чином, верхні 4 біти (11-8) оцифрованого значення напруги знаходяться на місці. Потім ми завантажуємо вміст реєстру ADCDATAL в батарею, видаляємо його чотири нижчі біти, міняємо місцями два півбайта, потім додаємо вміст напруги до отриманого значення та значення, що містить оцифроване значення напруги 11-4 в правильне замовлення вже сформовано. біт, тобто 8 найцінніших. І ми вже можемо зберегти це значення, навіть повернувшись до змінної напруги. Це все виглядає так мовою асемблера:
Тоді ми захопили 8 найважливіших бітів оцифрованого значення напруги, яке, звичайно, незмінним представляє рівень сигналу від 0 В до +2,5 В, з лише меншою роздільною здатністю, ніж якби ми мали 12 бітів. Справа в тому, що при максимальному рівні напруги +2,5 В нам дуже пощастило. Це тому, що максимальне значення двійкового числа, представленого 8 бітами, становить 255, що майже в сто разів 2,5. Таким чином, ми не робимо великої помилки, просто ділимо отримане 8-бітове число як рівень напруги на 100 і розглядаємо його як "виміряне" значення напруги, виражене у вольтах, звичайно. Помилка, яку ми допускаємо в 1–250/255 = 0,0196 Задача 31], буде використана в одиночному режимі, а розподільник годинника та час доступу до даних будуть зайняті якомога більше, оскільки в цьому випадку нічого не є терміновим ... Обраний канал AD дорівнює нулю буде. Зверніть пильну увагу на те, які шипи на панелі використовувати! Щоб випадково не торкнутися його, [19.4. фігура]. Малюнок призначений як орієнтир.
Для перетворення AD буде використовуватися стартовий біт SCONV (див. [Таблиця 19.2]). Якщо встановлено значення 1, перетворення AD починається, і цей біт повертається до 0 лише після завершення циклу перетворення. Таким чином, ми можемо легко очікувати цього в програмі:
Якщо програма виходить за межі цих двох рядків (виділених кольором у коді), ми можемо весело витягнути оцифроване значення напруги з регістрів ADCDATAH та ADCDATAL.
Код не можна назвати коротким через зв’язок через послідовний порт, але він не містить жодних поворотів або подвигів. Нашої старої доброї підпрограми DELAY зараз також немає у списку. Послідовний порт зв'язку
Функціонування програми тепер представлене не з відео, а з дещо іншим тематичним дослідженням. A [19.5. фігура]. Як показано на рис. 1, ми розглянули напругу комірок олівця, оскільки вона гарантовано не перевищує +2,5 В. У нас було два елементи олівця; виміряний цифровим мультиметром, один мав напругу холостого ходу 1,35 В, а інший 0,83 В. Серія вимірювань, виконаних за допомогою мікроконтролера, описана в [19.6. фігура]. показано на малюнку. Дані, оформлені червоним кольором, стосуються двох елементів олівця. Можна бачити, що відхилення складають лише близько 2%, що точно відповідає систематичному відхиленню, отриманому при виробництві десяткової частки.
Значення між двома наборами даних у рамках здаються трохи заплутаними, але ми даємо пояснення негайно. Саме тоді ми замінили олівцеву батарею в руці, і тестові відведення просто «висіли в повітрі». У цьому випадку після деякої випадкової послідовності значень вимірюване значення встановлюється на максимум. Це видно в [19.6. фігура]. також на малюнку.