Опис ADC. AVR

Потрібно спочатку розібратися з компонентами, які ми використовували для створення прошивки. А використовувався нами лише один компонент – PWM8. PWM розшифровується як Pulse Width Modulator, що означає широтно-імпульсний модулятор. Суть приладу у цьому, що дозволяє змінювати широту імпульсів, генерованих микроконтроллером. Тим самим змінюючи вихідну напругу для пристроїв, не чутливих до частоти.
Наприклад: робоча частота мікроконтролера 1Гц (тобто період генерації імпульсів 1с), ширина імпульсу 0.5с, напруга імпульсу 5В.

Тоді середня вихідна напруга за секунду дорівнює 2.5 вольта. А виходить ця величина просто: додаванням підімпульсних площ і розподілом їх на загальний проміжок часу. Про всяк випадок розпишу докладніше. Припустимо, ми взяли проміжок часу на 1 секунду, з малюнка видно перший імпульс тривав 0.5. Помножуємо 0.5с * 5В (напруга імпульсу) і все це ділимо на інтервал часу. 0.5с * 5В / 1с = 2.5В. Якщо нам знадобиться вихідна напруга в 3.33В, ми маємо збільшити підімпульсну площу до 75%. У літературі часто фігурує термін шпаруватість. Так от, шпаруватість і є відносин тривалості імпульсу до тривалості нульового потенціалу, наприклад, для першого випадку, вона була 50%, для другого – 75%.

Я думаю, що теорії вже достатньо і з встановленням PWM на схему проблем не сталося. А ось налаштування самого компонента варто розглянути докладніше. Для цього наведу скріншот із виділеними зміненими параметрами.

Clock - це робоча частота ШИМа, будь-який цифровий чи аналогово-цифровий блок повинен працювати на певній тактовій частоті. Для цього і придумані дільники частоти та поле Clock. SysClk – це системна частота, виставлена ​​в закладці Global Resources. У випадаючому списку Clock присутні такі поля, як Row_0_Input_0. Це означає, що тактовий генератор модуля може бути зовні чіпа і синхронізуватися вони будуть через шину Row_0_Input_0.

Enable – рівень логічної одиниці даного блоку. Зазвичай використовуються два стандарти: High = 5В та Low = 3В. Сам мікроконтролер, до речі, можна також перевести на один з режимів High або Low.

CompareOut – вихід широтно-імпульсного модулятора.

Може виникнути питання: навіщо була дана вище наведена теорія, якщо на практиці ми цього ніде не використовували? А відповідь у тому, що ми використовували дефолтні значення для довжини імпульсу та часу періоду (поля Period та PulseWidth) 0 0. За таких значень на виході PWM буде суцільний сигнал, що дорівнює за величиною логічної одиниці. Змінювати час періоду та значення ширини імпульсу можна також програмно в режимі роботи мікроконтролера, функціями PWM8_1_WritePeriod() і PWM8_1_WritePulseWidth().

ADC або АЦП

АЦП - аналого-цифровий перетворювач (або ADC Analog-to-digital converter) - це пристрій, що дозволяє перетворити аналоговий сигнал на цифровий. Будь-які фізичні величини (тиск, швидкість, кут повороту, напруга, струм, сила світла) є аналоговими, і завдання ADC - переводити в цифровий сигнал. Насправді ж, для перекладу цифровий сигнал зазвичай використовується величина напруги.
З численних характеристик АЦП слід виділити три основні:

  1. Розрядність - це найменша одиниця аналогового сигналу, зміна якої може зафіксувати ADC, зазвичай, вимірюється в бітах.
  2. Частота перетворення - кількість вимірювань за секунду, що вимірюється в SPS (samples per second)
  3. Робочий діапазон - діапазон величин, у якому працює даний перетворювач.

Так як АЦП вже не такий простий прилад як PWM. Прийде розібрати ще деякі теоретичні аспекти мікроконтролера і деякі фічі самого АЦП.

Загальні характеристики мікроконтролера

Перелік деяких понять та позначень про які потрібно знати при роботі з чіпами PSoC (до речі і не тільки все нижче сказане буде вірним і для мікроконтролерів AVR)

У описах і принципових схемах в даташитах часто фігурують такі позначення як Vcc, Vdd, Vss, AGND. І різниця між ними часом не найочевидніша. Vcc - це напруга живлення мікроконтролера (сс - collector-to-collector), те саме що і Vdd, так вже історично склалося що та сама величина має 2 позначення. Vss – мінімальний потенціал на мікроконтролері, дуже часто буває, що ця величина еквівалентна AGND. Літера "A" в абревіатурі AGND вказує на що це artificial граунд або штучна земля. Варто згадати про таку напругу на схемі, яка зазвичай називається BandGap. BandGrap – це опорна напруга. Опорна напруга означає те, що вона залишається постійною незалежно від напруги живлення МК, температури та інших зовнішніх показників. Vref - опорна напруга модуля, що окремо розглядається. Дуже довго я не міг включити, що таке Rail-to-Rail. А траплялася мені ця фраза в контекстах типу: "Цей модуль може працювати в режимі Rail-to-Rail". Так ось Rail-to-Rail означає те, що елемент може працювати на всьому розмаху напруги від Vcc до AGND.

Приклад 2. Voltage Measuring

Завдання: Виміряти напругу на потенціометрі, зашитому в налагоджувальну плату і вивести значення на екран.

Ось тут уже буде цікавіше. Як завжди запускаємо дизайнер, створюємо проект. Ідемо в User Modules -> Misc Data -> LCD та лівою кнопкою перетягуємо його на мікроконтролер. LCD дуже корисний і простий модуль, та ще й не займає місце на цифрових блоках. Побачити його можна у закладці Workspace Explorer. З настоянок потрібно вибрати тільки LCDPort = Port_2. Тепер заходимо у файл main.c, нагадаю, що він лежить у Workspace Explorer -> [Ім'я проекту] -> Source Files -> main.c. І додаємо у функцію main() наступний код.

LCD_Start();

Компілюємо код, прошиваємо мікроконтролер. Якщо все було правильно зроблено, отримаємо на екрані рядок, який був прописаний вище. Простішого керування екраном, і придумати не могли. І це радує. Тепер справа залишилася за ADC. Вибираємо User Modules -> Legacy -> ADCINC12 та викидаємо його на контролер. Може виникнути питання "Чому ми не вибрали просто ADCINC, а ADCINC12 та й ще на додачу з папки Legacy? Причина криється в складності ініціалізації модулів. ADCINC більш складний і гнучкий модуль, який вимагає більш ретельного і досконалого налаштування. У папці Legacy, що означає успадковані, вже зберігається модуль, який менш гнучкий, зате більш простий у реалізації. .Щоб величина поточного струму в ланцюгу не впливала на точність вимірювання.
Виставляємо налаштування PWM як на скріншоті.

  1. Gain – коефіцієнт посилення.
  2. Input – вхід приладу.
  3. Reference – опорна напруга.

Налаштування ADC виставляємо так:

  1. TMR Clock – тактова частота таймера.
  2. Input – вхід приладу (підключений до PGA).
  3. CNT Clock – частота лічильника.

Останнє, що знадобиться нам для нормальної роботи, – це глобальний ресурс званий Ref Mux. Ref Mux – це робочий діапазон напруг аналогових блоків. Якщо ми виставимо значення (Vdd/2)+/-(Vdd/2), то отримаємо повну розбіжність напруги від 0 до 5В. Але в цьому є певний мінус. Так як за опорну напругу приймається напруга живлення. Якщо плаватиме напруга Vdd, це вплине на правдивість результатів. У такому разі нам і став би в нагоді BandGap. Але поки не паритимемося, і виставляємо (Vdd/2)+/-(Vdd/2).
Для повторної перевірки скіну скрін комутації аналогових блоків, що вийшла.

Переходимо в main.c і додаємо в функцію main() наступний код:

PGA_Start(PGA_HIGHPOWER); //запуск PGA ADCINC12_Start(ADCINC12_HIGHPOWER); //запуск АЦП ADCINC12_GetSamples(0); //Установка АЦП на перерву роботу M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts while(1) // головний цикл прошивки ( if (ADCINC12_fIsDataAvailable() != 0) //перевірка даних в ADC ( result = ADCINC12_iGetData() + 2048; ADCINC12_ClearFlag 1,0); // встановлення позиції для виведення LCD_PrHexInt (result); // виведення результату в хексі)

До даних функції iGetData() додається 2048 для того, щоб перевести дані в беззнаковий еквівалент (якщо цікаво дивитися google "c++ знакові та беззнакові змінні").

З'єднуємо потенціометр із платою наступним чином.

Прошиваємо мікроконтролер та оцінюємо результат роботи.

Залишилося лише перевести хекси у напругу та перевірити коректність даних тестером. Добиватимемося цієї мети будемо суто досвідченим шляхом. Полегшимо собі ситуацію, і приймемо нульовий потенціал за 0x0000 значення на виході ADC. Потім запускаємо нашу вже написану програму, викручуємо потенціометр на максимум і дивимося значення. У мене, наприклад, вийшло 0х0FEC. Потім беремо тестер і вимірюємо реальну напругу на потенціометрі. У мене вийшло 4.78В. Тепер ділимо 4.78/0х0FEC (у кого проблеми із системами обчислення, раджу підкачатись) і отримуємо крок квантування, тобто одиницю напруги, якій відповідає одне значення виходу АЦП. У мене вийшла 0.0011727183513248 ось таке число. Тепер просто результат з АЦП перемножуємо на цю величину та виводимо на екран. Для цього додамо змінні в глобальне поле видимості (це все те, що поза функцією main()).

Аналого-цифрові перетворювачі (АЦП)є пристроями, які приймають вхідні аналогові сигнали і генерують відповідні цифрові сигнали, придатні для обробки мікропроцесорами та іншими цифровими пристроями. АЦПвходить до багатьох сучасних моделей МК AVRвін багатоканальний. Зазвичай число каналів дорівнює 8, але в різних моделях воно може варіювати від 4 каналів у молодших моделях сімейства Tiny, 6 в ATmega8 до 16 каналів в ATmega2560.

Багатоканальність означає, що на вході єдиного модуля АЦПвстановлений аналоговий мультиплексор, який може підключати цей вхід до різних висновків МК здійснення вимірювань декількох незалежних аналогових величин з рознесенням за часом. Входи мультиплексора можуть працювати окремо (у несиметричному режимі для вимірювання напруги щодо "землі") або (у деяких моделях) об'єднуватись у пари для вимірювання диференціальних сигналів. Іноді АЦП додатково забезпечується підсилювачем напруги з фіксованими значеннями коефіцієнта підсилення 10 та 200.

Сам АЦПявляє собою перетворювач послідовного наближення з пристроєм вибірки-зберігання та фіксованим числом тактів перетворення, рівним 13 (або 14 для диференціального входу; перше перетворення після включення вимагатиме 25 тактів для ініціалізації АЦП). Тактова частота формується аналогічно тому, як це робиться для таймерів-за допомогою спеціального предделителя тактової частоти МК, який може мати коефіцієнти поділу від 1 до 128. Але на відміну від таймерів, вибір тактової частоти АЦПне зовсім довільний, тому що швидкодія аналогових компонентів обмежена. Тому коефіцієнт поділу слід вибирати таким, щоб при заданому кварці тактова частота АЦПвкладалася в рекомендований діапазон 50-200 кГц (тобто максимум близько 15 тис. вимірів на секунду). Збільшення частоти вибірки допустиме, якщо не потрібне досягнення найвищої точності перетворення.

Роздільна здатність АЦПв МК AVR- 10 двійкових розрядів, чого для більшості типових застосувань достатньо. Абсолютна похибка перетворення залежить від низки факторів і в ідеальному випадку не перевищує ±2 молодших розрядів, що відповідає загальній точності вимірювання приблизно 8 двійкових розрядів. Для досягнення цього результату необхідно вживати спеціальних заходів: не тільки "вганяти" тактову частоту в рекомендований діапазон, а й знижувати максимум інтенсивність цифрових шумів. Для цього рекомендується, як мінімум, не використовувати висновки того ж порту, до якого підключений АЦП, для обробки цифрових сигналів, правильно розводити плати, а як максимум - додатково до того ще й включати спеціальний режим ADC Noise Reduction.

Реєстри управління АЦП

ADCSR

Режим безперервних вимірювань активізується встановленням біта ADFR(біт 5) цього ж регістру. У ряді моделей Mega цей біт має назву ADATE, і керування режимом роботи проводиться складніше: там додаються кілька режимів запуску через різні переривання (у т. ч. переривання від компаратора, при настанні різних подій від таймера і т. п.), і вибирати їх слід, задаючи біти ADTSрегістра SFIOR, а встановлення біта ADATEдозволяє запуск АЦП за цими подіями.

Розряд Назва Опис
5 ADFR(ADATE) Вибір режиму роботи АЦП

Так як нульові значення всіх бітів ADTS(за умовчанням) означають режим безперервного перетворення, то у випадку, коли ви їх значення не чіпали, функції бітів ADATEі ADFRв інших моделях збігатимуться.

ADTS2 ADTS1 ADTS0 Джерело стартового сигналу
0 0 0 Режим безперервного перетворення
0 0 1 Переривання від аналогового компаратора
0 1 0 Зовнішнє переривання INT0
0 1 1 Переривання за подією "Збіг" таймера/лічильника Т0
1 0 0 Переривання з переповнення таймера/лічильника Т0
1 0 1 Переривання за подією "Збіг" таймера/лічильника Т1
1 1 0 Переривання з переповнення таймера/лічильника Т1
1 1 1 Переривання за подією "Захоплення" таймера/лічильника Т1

Якщо вибрано режим запуску від зовнішнього джерела, то перетворення запускається установкою біта ADSС(біт 6). При безперервному режимі встановлення цього біта запустить перше перетворення, потім вони автоматично повторюватимуться. У режимі одноразового перетворення, а також незалежно від встановленого режиму під час запуску через переривання (у тих моделях, де це можливо) установка біта ADSСпросто запускає одне перетворення. При настанні переривання, що запускає перетворення, біт ADSСвстановлюється апаратно. Зазначимо, що перетворення починається по фронту першого тактового імпульсу (тактового сигналу АЦП, а не самого контролера!) після установки ADSС. Після закінчення будь-якого перетворення (і в одиночному, і в безперервному режимі) встановлюється біт ADIF(біт 4. прапор переривання). Дозвіл переривання АЦП здійснюється установкою біта ADIE(біт 3) того ж регістра ADCSR/ADCSRA.

Для роботи з АЦП необхідно встановити його тактову частоту. Це робиться трьома молодшими бітами регістру ADCSR/ADCSRAпід назвою ADPS0..2.Коефіцієнт поділу частоти тактового генератора МК встановлюється за ступенями двійки, всі нулі в цих трьох бітах відповідають коефіцієнту 2, всі одиниці - 128. Оптимальна частота перетворення лежить в діапазоні 50-200 кГц, так що, наприклад, для тактової частоти МК, рівної коефіцієнт може мати значення тільки 32 (стан бітів ADPS0..2= 101, частота 125 кГц) або 64 (стан бітів) ADPS0..2= 110, частота 62,5 кгц). При тактовій частоті 16 МГц у допустимий діапазон укладається лише коефіцієнт 128.

ADPS2 ADPS1 ADPS0 Коефіцієнт розподілу
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128

Нижче наведено таблицю з описом регістру ADMUX.



Вибір джерела опорної напруги проводиться бітами REFS1..0регістра ADMUX(старші біти 7 і 6), причому їхнє нульове значення (за замовчуванням) відповідає зовнішньому джерелу. Напруга цього зовнішнього джерела може лежати в межах від 2 до напруги живлення аналогової частини AVcc(а воно, у свою чергу, не повинно відрізнятися від живлення цифрової частини більш ніж на 0,3 В у більшу чи меншу сторону). Можна вибрати як опорне і живлення самої аналогової частини, причому двояким способом: або просто з'єднати висновки AREFі AVccмікросхеми, або встановити біти REFS1..0стан 01 (тоді з'єднання здійснюється внутрішніми схемами, але зауважимо, що зовнішній опорний джерело при цьому повинен бути відключений). Передбачено і вбудоване джерело (задається REFS1..0в стані 11, при цьому висновку AREFрекомендується підключати фільтруючий конденсатор), що має номінальну напругу 2,56 з великим розкидом від 2,4 до 2,7 В.

REFS1 REFS0 Джерело опорної напруги
0 0 Зовнішній ІОН, підключений до виводу AREF, внутрішній ІОН вимкнено
0 1 Напруга живлення AVcc*
1 0 Зарезервовано
1 1 Внутрішній ІОН напругою 2,56V, підключений до виведення AREF*
*Якщо до висновку AREF підключено джерело напруги, ці варіанти використовуватися не можуть

Результат перетворення АЦП виявляється у регістрах ADCH:ADCL. Оскільки результат 10-розрядний, то за замовчуванням старші 6 бітів у регістрі ADCHвиявляються рівними нулю. Читання цих регістрів проводиться, починаючи з молодшого ADCL, після чого регістр ADCH блокується, доки не буде прочитаний. Отже, навіть якщо момент між читанням регістрів потрапив на фронт 14 (15) такту АЦП, коли дані в них повинні змінюватися, значення прочитаної пари відповідатимуть один одному, нехай результат цього перетворення пропаде. У протилежному порядку читати ці регістри не рекомендується. Але біт ADLAR(біт 5 регістру ADMUX) надає цікаву можливість: якщо його встановити в 1, то результат перетворення на регістрах ADCH:ADCLвирівнюється вліво: біт 9 результату виявиться у старшому биті ADCH, а незначними будуть молодші 6 бітів регістру ADCL. У цьому випадку, якщо вистачає 8-розрядного дозволу результату, можна прочитати лише значення ADCH.

class="eliadunit">

Вибір каналів та режимів їх взаємодії в АЦП проводиться бітами MUX0..3у регістрі ADMUX. Їх значення вибирають потрібний канал у звичайному (недиференціальному) режимі, коли напруга, що вимірюється, відраховується від "землі". Останні два значення цих бітів для сімейства Mega (11110 і 11111 у більшості моделей або 1110 і 1111 для ATmega8) вибирають режими, коли вхід АЦП приєднується до опорного джерела компаратора (1,22 В) або "землі" відповідно, що може використовуватися для автокалібрування пристрою.

Управління вхідним мультиплексором у моделях Atmega8x

MUX3-MUX0 Несиметричний вхід
0000 ADC0
0001 ADC1
0010 ADC2
0011 ADC3
0100 ADC4*
0101 ADC5*
0110 ADC6**
0111 ADC7**
1000-1101 Зарезервовано
1110 1,22V
1111 0V(GND)

*8-ми розрядне перетворення

**Є тільки корпуси TQFP-32 і MLF-32.

Інші комбінації розрядів MUXпризначені для встановлення різних диференціальних режимів - у тих моделях, де вони присутні, в інших випадках ці біти зарезервовані (як у моделях Atmega8, ATmega163 та ін.). У диференціальному режимі АЦП вимірює напругу між двома вибраними висновками (наприклад, між ADC0і ADC1), причому не всі висновки можуть бути в такому режимі задіяні. У тому числі диференціальні входи АЦП можна підключати до того самого входу для корекції нуля. Справа в тому, що в ряді моделей на вході АЦП є вбудований підсилювач, з коефіцієнтом 1х, 10х і 200х (коефіцієнт вибирається тими ж бітами) MUX0..4), і такий режим використовується для його калібрування - надалі значення виходу при з'єднаних входах можна просто відняти.

Після завершення перетворення (при встановленні в «1» прапора ADIFрегістра ADCSR) його результат зберігається у регістрі даних АЦП. Оскільки АЦПмає 10 розрядів, цей регістр фізично розміщений у двох регістрах вводу/виводу ADCH:ADCL, доступні тільки для читання. За замовчуванням результат перетворення вирівнюється вправо (старші 6 розрядів регістру ADCH- Незначні). Однак він може вирівнюватися і вліво (молодші 6 розрядів регістру ADCL- Незначні). Для керування вирівнюванням результату перетворення служить розряд ADLARрегістра ADMUX. Якщо цей розряд встановлений у «1», результат перетворення вирівнюється по лівій межі 16-розрядного слова, якщо скинутий у «0» - праворуч.

Звернення до регістрів ADCHі ADCLдля отримання результату перетворення має виконуватися у певній послідовності: спочатку необхідно прочитати регістр ADCL, а потім ADCH. Ця вимога пов'язана з тим, що після звернення до регістру ADCLпроцесор блокує доступ до регістрів даних з боку АЦПдоки не буде прочитаний регістр ADCH. Завдяки цьому можна бути впевненим, що при читанні регістрів у них будуть перебувати складові одного й того самого результату. Відповідно, якщо чергове перетворення завершиться до звернення до регістру ADCH, результат перетворення буде втрачено. З іншого боку, якщо результат перетворення вирівнюється вліво і достатньо точності 8-розрядного значення, для отримання результату можна прочитати тільки вміст регістру ADCH.

Для недиференціального режиму АЦП, коли напруга відраховується від землі, результат перетворення визначається формулою:

Ка = 1024Uвх/Uref

Де Ка - значення вихідного коду АЦП, Uвх та Uref - вхідна та опорна напруга.

Диференціальному виміру відповідає така формула:

Ка = 512 (Upos - Uneg) / Uref

Де Upos і Uneg – напруги на позитивному та негативному входах відповідно. Якщо напруга на негативному вході більша, ніж на позитивному, то результат у диференціальному режимі стає негативним і виражається в додатковому коді від $200 (-512) до $3FF (-1). Реальна точність перетворення на диференціальному режимі дорівнює 8 розрядам.

Робимо світлодіодний індикатор напруги

Для практичного вивчення АЦП напишемо програму світлодіодного індикатора напруги. Як і в попередніх прикладах будемо використовувати мікроконтролер Atmega8. Вісім індикаторів підключаємо до порту D контролера, це лінійна шкала рівня сигналу від 0 до 5V. Входом АЦП буде висновок PC0(ADC0), якого через змінний резистор опором 10кОм подається напруга. Схема пристрою представлена ​​нижче:

До точності АЦПЦей пристрій має найменші вимоги. Джерелом опорної напруги служить напруга живлення мікроконтролера – 5 Вольт, для цього висновок AREFз'єднуємо з висновком Vccмікроконтролера, також надаємо з висновками живлення аналогової частини AVccі AGND, підключаємо їх до плюсу та мінусу відповідно, у програмі бітами REFS1і REFS0задаємо джерело ІОН.

Режим індикації працює наступним чином: після закінчення перетворення, яке працює в безперервному режимі, зчитуємо біти ADCHі ADCL. Це значення потім порівнюємо із попередньо розрахованими константами. Якщо значення ADC більше константи спалахує один світлодіод, якщо значення ADCбільше другої константи спалахують вже два світлодіоди і т.д.

Константи обчислюються так: оскільки АЦП 10-бітний, число 1024 розкладаємо на 8 рівних частин, а за формулою вже обчислюємо ці значення у Вольтах.

1020...5V(приблизно)

Повний код програми показано нижче. Частота тактового генератора контролера 8MHz.

/*** Використання АЦП. Світлодіодна шкала ***/ #include #include int main (void) (DDRD = 0xFF; PORTD = 0x00; /*** Налаштування АЦП ***/ ADCSRA |= (1<< ADEN) // Включение АЦП |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8 ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН |(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0 while(1) { unsigned int u; ADCSRA |= (1 << ADSC); // Начинаем преобразование while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования u = (ADCL|ADCH << 8); // Считываем ADC if (u >128) // 0.625V PORTD = 0b00000001; else PORTD = 0b00000000; if (u> 256) // 1.25V PORTD = 0b00000011; if (u > 384) // 1.875V PORTD = 0b00000111; if (u> 512) // 2.5V PORTD = 0b00001111; if (u> 640) // 3.125V PORTD = 0b00011111; if (u> 768) // 3.75V PORTD = 0b00111111; if (u > 896) // 4.375V PORTD = 0b01111111; if (u > 1020) // 5V PORTD = 0b11111111; _delay_ms(30); )

У наступному прикладі ми розберемо принципи створення вольтметра 0-30V мікроконтролера Atmega8.

Аналого-цифрові перетворювачі (АЦП) є пристроями, які приймають аналогові вхідні сигнали і генерують відповідні їм цифрові сигнали, придатні для обробки мікропроцесорами та іншими цифровими пристроями.

АЦП входить до багатьох сучасних моделей МК AVR, він багатоканальний. Зазвичай число каналів дорівнює 8, але в різних моделях воно може варіювати від 4 каналів у молодших моделях сімейства Tiny, 6 в ATmega8 до 16 каналів в ATmega2560. Багатоканальність означає, що на вході єдиного модуля АЦП встановлений аналоговий мультиплексор, який може підключати цей вхід до різних висновків МК здійснення вимірювань декількох незалежних аналогових величин з рознесенням за часом. Входи мультиплексора можуть працювати окремо (у несиметричному режимі для вимірювання напруги щодо "землі") або (у деяких моделях) об'єднуватись у пари для вимірювання диференціальних сигналів. Іноді АЦП додатково забезпечується підсилювачем напруги з фіксованими значеннями коефіцієнта підсилення 10 та 200.

Сам АЦП є перетворювач послідовного наближення з пристроєм вибірки-зберігання і фіксованим числом тактів перетворення, рівним 13 (або 14 для диференціального входу; перше перетворення після включення вимагатиме 25 тактів для ініціалізації АЦП). Тактова частота формується аналогічно тому, як це робиться для таймерів - за допомогою спеціального предделителя тактової частоти МК, який може мати коефіцієнти поділу від 1 до 128. компонентів обмежено. Тому коефіцієнт розподілу слід вибирати таким, щоб при заданому "кварці" тактова частота АЦП укладалася в рекомендований діапазон 50-200 кГц (тобто максимум близько 15 тис. Вимірів в секунду). Збільшення частоти вибірки допустиме, якщо не потрібне досягнення найвищої точності перетворення.

Роздільна здатність АЦП в МК AVR - 10 двійкових розрядів, чого для більшості типових застосувань достатньо. Абсолютна похибка перетворення залежить від низки факторів і в ідеальному випадку не перевищує ±2 молодших розрядів, що відповідає загальній точності вимірювання приблизно 8 двійкових розрядів. Для досягнення цього результату необхідно вживати спеціальних заходів: не тільки "вганяти" тактову частоту в рекомендований діапазон, а й знижувати максимум інтенсивність цифрових шумів. Для цього рекомендується, як мінімум, не використовувати висновки того ж порту, до якого підключений АЦП, для обробки цифрових сигналів, правильно розводити плати, а як максимум - додатково ще й включати спеціальний режим ADC Noise Reduction.

Зазначимо також, що АЦП може працювати у двох режимах: одиночного та безперервного перетворення. Другий режим доцільний лише за максимальної частоті вибірок. В інших випадках його слід уникати, тому що обійти в цьому випадку необхідність паралельної обробки цифрових сигналів, як правило, неможливо, а це означає зниження точності перетворення.

Реєстри управління АЦП

Для дозволу роботи АЦП необхідно записати балку. 1 в розряд ADEN регістру ADCSR, а для вимикання - балка. 0. Якщо АЦП буде вимкнено під час циклу перетворення, то перетворення завершено не буде (у регістрі даних АЦП залишиться результат попереднього перетворення).

Режим безперервних вимірювань активізується установкою біта ADFR (біт 5) цього регістру. У ряді моделей Mega цей біт носить найменування ADATE, і керування режимом роботи виробляється складніше: там додаються кілька режимів запуску через різні переривання (у т. ч. переривання від компаратора, при настанні різних подій від таймера тощо), і вибирати їх слід, задаючи біти ADTS регістру SFIOR, а установка біта ADATE дозволяє запуск АЦП з цих подій. Так як нульові значення всіх бітів ADTS (за умовчанням) означають режим безперервного перетворення, то у випадку, коли ви їх значення не чіпали, функції бітів ADATE та ADFR в інших моделях збігатимуться.

Якщо вибрано режим запуску не від зовнішнього джерела, то перетворення запускається установкою біта ADTS (біт 6 того ж регістра ADCSR/ADCSRA). При безперервному режимі встановлення цього біта запустить перше перетворення, потім вони автоматично повторюватимуться. У режимі одноразового перетворення, а також незалежно від встановленого режиму під час запуску через переривання (у тих моделях, де це можливо), установка біта ADCS просто запускає одне перетворення. При настанні переривання, запускає перетворення, біт ADCS встановлюється апаратно. Зазначимо, що перетворення починається по фронту першого тактового імпульсу (тактового сигналу АЦП, а не самого контролера!) після установки ADCS. Після закінчення будь-якого перетворення (і в одиночному, і в безперервному режимі) встановлюється біт ADIF (біт 4. прапор переривання). Дозвіл переривання АЦП здійснюється установкою біта ADIE (біт 3) того ж регістра ADCSR/ADCSRA.

Для роботи з АЦП необхідно встановити його тактову частоту. Це робиться трьома молодшими бітами регістру ADCSR/ADCSRA під назвою ADPS0..2. Коефіцієнт поділу частоти тактового генератора МК встановлюється за ступенями двійки, всі нулі в цих трьох бітах відповідають коефіцієнту 2, всі одиниці - 128. Оптимальна частота перетворення лежить в діапазоні 50-200 кГц, так що, наприклад, для тактової частоти МК, рівної коефіцієнт може мати значення тільки 32 (стан бітів ADPS0..2 = 101, частота 125 кГц) або 64 (стан бітів ADPS0..2 = 110, частота 62,5 кГц). При тактовій частоті 16 МГц у допустимий діапазон укладається лише коефіцієнт 128.

Вибір джерела опорної напруги проводиться бітами REFS1..0 регістра ADMUX (старші біти 7 і 6), причому їх нульове значення (за замовчуванням) відповідає зовнішньому джерелу. Напруга цього зовнішнього джерела може лежати в межах від 2 до напруги живлення аналогової частини AVcc (а воно, у свою чергу, не повинно відрізнятися від живлення цифрової частини більш ніж на 0,3 В у більшу або меншу сторону). Можна вибрати в якості опорного і живлення аналогової частини, причому двояким способом: або просто з'єднати висновки AREF і AVcc мікросхеми, або встановити біти REFS1..0 в стан 01 (тоді з'єднання здійснюється внутрішніми схемами, але зауважимо, що зовнішній опорний джерело при цьому повинен бути вимкнений). Передбачено і вбудоване джерело (задається REFS1..0 в стані 11, при цьому до висновку AREF рекомендується підключати конденсатор, що фільтрує), що має номінальну напругу 2,56В з великим розкидом від 2,4 до 2,7 В.

*****REFS*******

Результат перетворення АЦП виявляється у регістрах ADCH: ADCL. Оскільки результат 10-розрядний, то за замовчуванням старші 6 бітів у регістрі ADCH виявляються рівними нулю. Читання цих регістрів проводиться, починаючи з молодшого ADCL, після чого регістр ADCH блокується, доки прочитаний. Отже, навіть якщо момент між читанням регістрів потрапив на фронт 14 (15) такту АЦП, коли дані в них повинні змінюватися, значення прочитаної пари відповідатимуть один одному, нехай результат цього перетворення пропаде. У протилежному порядку читати ці регістри не рекомендується. Але біт ADLAR (біт 5 регістра ADMUX) надає цікаву можливість: якщо його встановити в 1, то результат перетворення в регістрах ADCH: ADCL вирівнюється вліво: біт 9 результату виявиться у старшому біті ADCH, а незначними будуть молодші 6 біт регістра ADCL. У разі, якщо вистачає 8-розрядного дозволу результату, можна прочитати лише значення ADCH.

Вибір каналів та режимів їх взаємодії в АЦП здійснюється бітами MUX0..3 у регістрі ADMUX. Їх значення вибирають потрібний канал у звичайному (недиференціальному) режимі, коли напруга, що вимірюється, відраховується від "землі". Останні два значення цих бітів для сімейства Mega (11110 і 11111 у більшості моделей або 1110 і 1111 для ATmega8) вибирають режими, коли вхід АЦП приєднується до опорного джерела компаратора (1,22 В) або "землі" відповідно, що може використовуватися для автокалібрування пристрою.

Інші комбінації розрядів MUX призначені для встановлення різних диференціальних режимів – у тих моделях, де вони присутні, в інших випадках ці біти зарезервовані (як у моделях Atmega8, ATmegal63 та ін.). У диференціальному режимі АЦП вимірює напругу між двома вибраними висновками (наприклад, між ADC0 і ADC1), причому не всі висновки можуть бути задіяні в такому режимі. У тому числі диференціальні входи АЦП можна підключати до того самого входу для корекції нуля. Справа в тому, що в ряді моделей на вході АЦП є вбудований підсилювач з коефіцієнтом 1х, 10х і 200х (коефіцієнт вибирається тими ж бітами MUX0..4), і такий режим використовується для його калібрування - надалі значення виходу при з'єднаних входах можна просто відняти.

Для недиференціального режиму АЦП, коли напруга відраховується від "землі", результат перетворення визначається формулою: Ка = 1024Uвх/Uref, де Ка - значення вихідного коду АЦП, Uвх та Uref - вхідна та опорна напруга. Диференціальному виміру відповідає така формула: Ка = 512(Upos - Uneg)/Uref, де Upos і Uneg - напруги на позитивному та негативному входах відповідно. Якщо напруга на негативному вході більша, ніж на позитивному, то результат у диференціальному режимі стає негативним і виражається в додатковому коді від $200 (-512) до $3FF (-1). Реальна точність перетворення на диференціальному режимі дорівнює 8 розрядам.

У статті наведено опис аналого-цифрового перетворювача 32-розрядних ARM-мікроконтролерів серії STM32 від компанії STMicroelectronics. Розглянуто архітектуру та склад її регістрів,
а також наведено практичні приклади програм.

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

Він дозволяє перетворювати аналогові сигнали на цифрові значення, які надалі можуть оброблятися процесором. Суть перетворення зводиться до порівняння аналогового сигналу з опорною напругою та формування числового значення, що відповідає аналоговому сигналу в діапазоні розрядності АЦП. Наприклад, 12-розрядний АЦП з опорною напругою 3,3 перетворює аналогові сигнали від 0 до 3,3 В діапазон цифрових значень від 0 до 4095 одиниць з певною періодичністю в часі.

За допомогою АЦП мікроконтролер здатний вирішувати набагато більше завдань для автоматизації процесів. Крім того, за наявності вбудованого в мікроконтролер АЦП істотно спрощується схема пристрою, що розробляється і значно зменшується його вартість. Як правило, крім самого АЦП, мікроконтролер має вбудований аналоговий мультиплексор, що дозволяє збільшити кількість аналогових входів шляхом почергової комутації декількох висновків мікроконтролера і подальшого перетворення сигналів від цих висновків.

Мікроконтролери серії STM32 також мають убудований 12-розрядний АЦП послідовного наближення з тактовою частотою до 14 МГц. Деякі моделі STM32 мають навіть два чи три блоки АЦП.

Структурна схема АЦП мікроконтролерів STM32

Архітектура та функціонування АЦП
Розглянемо докладніше архітектуру та функціонування блоку АЦП для STM32. Аналого-цифрове перетворення сигналів даним АЦП може здійснюватися в одиночному режимі, безперервному режимі, скануванні або переривчастому режимі. Результат перетворення зберігається в 16-розрядних регістрах АЦП з вирівнюванням даних з лівого або правого краю.
Вбудований АЦП мікроконтролерів серії STM32 має розширені функції. Основні характеристики цього АЦП:

  • розрядність - 12 біт;
  • мінімальний час перетворення – 1 мкс;
  • кількість каналів – 16 зовнішніх та 2 внутрішніх;
  • кількість значень часу перетворення кожного каналу – 8;
  • можливість завдання одиночного чи безперервного перетворення;
  • автоматичне калібрування;
  • наявність віконного компаратора;
  • можливість запуску перетворення зовнішніх джерел;
  • робота із блоком прямого доступу до пам'яті (ПДП).

АЦП живиться від джерела з напругою від 2,4 до 3,6 В. Джерело опорної напруги (ІОН) АЦП з'єднаний або внутрішньо з напругою живлення АЦП, або зі спеціальними зовнішніми висновками в залежності від моделі та кількості висновків кристала. Структурна схема АЦП мікроконтролерів серії STM32 наведено малюнку. Як видно з малюнка, АЦП має 16 зовнішніх аналогових каналів
та 2 внутрішніх, які комутуються за допомогою мультиплексора входів. Зовнішні канали підключені висновків мікроконтролера. Перед використанням цих висновків як аналогові необхідно налаштувати їх як аналогові входи. Додаткові два канали задіяні під внутрішні сигнали. Один – для контролю внутрішньої опорної напруги, а другий – для датчика
температури, яка розташована на кристалі.
Для цього АЦП введені такі спеціальні терміни, як регулярні та інжектовані канали. Суть цих понять полягає у способі опитування каналів. Регулярні канали опитуються та перетворюються з певною періодичністю, тобто регулярністю. Інжектовані, тобто впроваджені канали опитуються за спеціальним запитом від програми між регулярними опитуваннями.
Якщо необхідно опитувати періодично кілька каналів, то АЦП можна сформувати список цих каналів і записати їх у спеціальні регістри. Після цього АЦП по черзі перетворюватиме сигнали з каналів даного списку послідовно один за одним. Наприклад, для чергового виміру напруги в каналах 3, 7, 5 і 1 необхідно записати цю послідовність у спеціальні регістри і запустити процес перетворення АЦП. В результаті дані канали будуть послідовно опитуватись і перетворюватися,
а результат цих перетворень записуватись у регістри даних. При цьому порядок проходження каналів не має значення. Більше того, той самий канал може опитуватися кілька разів за цикл. Кількість вимірювань у групі регулярних каналів може досягати 16. Допускається безперервний вимір вибраних каналів, тобто після закінчення вимірювання автоматично запускається новий цикл.

Максимальна кількість вимірювань у групі інжектованих каналів дорівнює чотирьом. Якщо запустити вимір інжектованих каналів, то вимір регулярних каналів буде припинено. Потім буде виконано вимірювання заданих інжектованих каналів та знову відновлено вимірювання каналів регулярної групи.
Розглянемо приклад того, як можна застосувати на практиці використання регулярних та інжектованих каналів. Допустимо, необхідно постійно вимірювати напругу на п'яти висновках у певній послідовності. Для цього необхідно включити ці канали в регулярну групу та запустити перетворення. АЦП почне послідовно опитувати їх і перетворювати сигнали на цифрові значення. При необхідності після закінчення перетворення формуватимуться переривання. Таким чином, можна обробляти аналогові сигнали та зберігати дані перетворення АЦП в автоматичному режимі. Якщо в цей час виникає необхідність виміряти температуру кристала або аналоговий сигнал на якомусь іншому каналі, то для того, щоб не порушувати вимірювання в регулярному каналі, можна запустити вимірювання інжектованого каналу. При цьому обробка регулярних каналів буде автоматично припинена на деякий час, а після закінчення
вимірювання інжектованої групи – автоматично відновлено.
Збереження результату перетворення чотирьох інжектованих каналів проводиться у відповідних регістрах даних. АЦП має для кожного інжектованого каналу окремий регістр, тобто всього чотири регістри даних. Однак для 18 регулярних каналів в АЦП є лише один регістр даних. З метою збереження результатів перетворення для кожного каналу можна після закінчення вимірювання в кожному каналі формувати переривання та переписувати дані з цього регістру блок пам'яті процесора. Крім того, можна скористатися спеціальним каналом ПДП, який дозволить пересилати результати кожного перетворення заздалегідь організований у пам'яті буфер даних без участі процесора. Використання цього методу дозволяє скоротити частоту формування переривань до одного після завершення кожного циклу перетворення групи регулярних каналів. Крім того, можна задіяти подвійний буфер. Це дозволить після заповнення АЦП першого буфера
сформувати переривання та розпочати обробку результатів процесором. Саме тоді АЦП почне заповнювати з допомогою ПДП другий буфер. Потім черговість зміниться тощо. У нижній частині схеми, зображеної на малюнку, наведено джерела, які можуть запускати процес перетворення окремо для регулярної та інжектованої групи каналів. Це можуть бути сигнали від таймерів, зовнішній сигнал або два спеціальні розряди керуючих регістрів, встановивши які, але можна запустити перетворення в регулярній або інжектованій групі.
Відмінною особливістю даного АЦП є наявність у ньому аналогового сторожового таймера (AWD, від англ. Analog Watch Dog), що є віконним компаратором. Він має у своєму складі два регістри для завдання меж порівняння. У регістр нижньої межі та регістр верхньої межі програмно записуються відповідні значення для контролю рівня вимірюваного сигналу. Номер каналу, до якого потрібно підключити компаратор, записується до спеціального регістру. Якщо напруга заданого каналу, що вимірюється, вийде за вказані межі, то в АЦП буде встановлений відповідний прапор і сформується запит на переривання.
Цей віконний компаратор може бути дуже корисним для автоматичного контролю певного параметра. З його допомогою можна, наприклад, стежити за температурою контролера, щоб уникнути його перегріву. Для цього можна регулярно, скажімо щомиті, вимірювати рівень сигналу від датчика температури. Якщо він перевищить заданий поріг, буде необхідно вжити певних дій. Наприклад, знизити тактову частоту, сформувати попереджувальний сигнал тощо. Віконний компаратор дозволяє виконувати подібну процедуру без відволікання процесора від виконання основної програми, заощаджуючи при цьому ресурси процесора та пам'яті програм. Для запуску віконного компаратора необхідно виконати його ініціалізацію шляхом запису рівнів кордонів, включити контрольований канал до списку регулярних каналів та дозволити переривання від нього. Якщо рівень контрольованого сигналу вийде за межі заданого діапазону, компаратор спрацює та буде викликана функція обробника переривання цієї події.
АЦП здатний формувати три сигнали переривання: кінець перетворення, кінець перетворення інжектованої групи та сигнал від віконного компаратора.

Прописання регістрівАЦП
Блок АЦП включає до свого складу досить багато регістрів. Але це логічно, враховуючи його насичену функціональність та кількість каналів для перетворення. Карта регістрів АЦП представлена ​​таблиці 1.
Усі регістри можна згрупувати за функціональним призначенням. В результаті такої організації утворюються такі групи:

●● регістр стану ADC_SR – містить біти, що вказують на стан АЦП;
●● регістри керування ADC_CR1 та ADC_CR2 – визначають режим роботи АЦП;
●● регістри ADC_SMPR1 та ADC_SMPR2 – задають час перетворення АЦП;
●● регістри ADC_JOFR1…ADC_JOFR4 – визначають зміщення даних в інжектованій групі каналів;
●● регістри ADC_HTR та ADC_LTR – задають верхню та нижню межі для віконного компаратора;
●● регістри ADC_SQR1…ADC_SQR3 – задають послідовність каналів регулярної групи;
●● регістр ADC_JSQR – задає послідовність каналів інжектованої групи;
●● регістри даних ADC_JDR1…ADC_JDR4 – містять результат перетворення для регістрів інжектованої групи каналів;
●● регістр даних DR – містить результат перетворення для регулярної групи каналів.

Розглянемо призначення розрядів у кожному з представлених груп регістрів АЦП докладніше. Регістр ADC_SR містить біти, які встановлюються апаратно. Обнулюються вони програмно або при скиданні. Бит EOC автоматично скидається після читання регістру ADC_DR. Призначення біт наступне:
●● біт 4 STRT встановлюється при старті перетворення регулярного каналу;
●● біт 3 JSTRT встановлюється при старті перетворення інжектованого каналу;
●● біт 2 JEOC вказує на закінчення перетворення інжектованого каналу;
●● біт 1 EOC означає закінчення перетворення регулярного або інжектованого каналу;
●● біт 0 AWD встановлюється при спрацюванні віконного компаратора.

Регістр ADC_CR1 містить такі біти керування:
●● біт 23 AWDEN керує віконним компаратором регулярного каналу;
●● біт 22 JAWDEN управляє віконним компаратором інжектованого каналу;
●● біти 15…13 DISCNUM визначають кількість регулярних каналів, перетворення яких виконуватиметься у переривчастому режимі, після приходу події зовнішнього запуску;
●● біт 12 JDISCEN забороняє та дозволяє переривчастий режим для інжектованих каналів;
●● біт 11 DISCEN забороняє та дозволяє переривчастий режим для регулярних каналів;
●● біт 10 JAUTO забороняє та дозволяє режим автоматичного перетворення для інжектованих каналів;
●● біт 9 AWDSGL дозволяє роботу віконного компаратора для всіх каналів або для каналу, який визначений бітами AWDCH;
●● біт 8 SCAN забороняє та дозволяє режим сканування каналів, заданих регістрами ADC_SQRx або ADC_JSQRx;
●● біт 7 JEOCIE забороняє та дозволяє переривання після закінчення інжекційних каналів;
●● біт 6 AWDIE забороняє та дозволяє переривання від віконного компаратора АЦП;
●● біт 5 EOCIE забороняє та дозволяє переривання після закінчення перетворення в регулярній або інжектованій групі;
●● біти 4…0 AWDCH визначають номер каналу, до якого підключено віконний компаратор.
Регістр ADC_CR2 містить біти, що мають наступне призначення:
●● біт 23 TSVREFE підключає канал опорної напруги та датчика температури, розташованого на кристалі;
●● біт 22 SWSTART запускає перетворення регулярних каналів;
●● біт 21 JSWSTART запускає перетворення інжектованих каналів;
●● біт 20 EXTTRIG забороняє та дозволяє використання зовнішнього запуску для регулярних каналів;
●● биты 19…17 EXTSEL определяют источник, который будет запускать преобразование в регулярном канале (000 = TIM1_CH1, 001 = TIM1_CH2, 010 = TIM1_CH3, 011 = TIM2_CH2, 100 = TIM3_TRGO, 101 =T IM4_CH4, 110 = EXTI_11, 111 = SWSTART );
●● біт 15 JEXTTRIG забороняє та дозволяє використання зовнішнього запуску для інжектованих каналів;
●● біти 14…12 JEXTSEL визначають джерело, яке запускатиме перетворення в інжектованому каналі (000 = TIM1_TRGO, 001 = TIM1_CH4, 010 = TIM2_TRGO, 011 = TIM2_CH1, 100 = TIM3_CH 1, 4 1 = JSWSTART) ;
●● біт 11 ALIGN задає вирівнювання результату перетворення в регістрі даних з правого (0) або лівого (1) краях;
●● біт 8 DMA забороняє та дозволяє використання блоку ПДП (DMA);
●● біт 3 RSTCAL скидає калібрування;
●● біт 2 CAL запускає калібрування АЦП шляхом запису 1, яка після закінчення процесу скидається апаратно;
●● біт 1 CONT запускає безперервне перетворення;
●● біт 0 ADON вимикає та включає модуль АЦП.

Регістри ADC_SMPR1 і ADC_SMPR2 задають час перетворення кожного каналу. Для кожного каналу виділено по три розряди, що дозволяє задати 8 значень часу перетворення
у циклах (000 = 1,5 циклу, 001 = 7,5 циклу, 010 = 13,5 циклу, 011 = 28,5 циклу, 100 = 41,5 циклу, 101 = 55,5 циклу, 110 = 71,5 циклу, циклу, 111 = 239,5 циклу).
Регістри ADC_JOFR1…ADC_JOFR4 служать завдання зміщення кожного каналу інжектованої групи (JOFR1, JOFR2, JOFR3, JOFR4). У ці регістри можна записувати 12-бітове значення, яке автоматично віднімається з результату перетворення АЦП. Якщо результуюче значення стане негативним, то регістр результату інжектованої групи доповниться бітом негативного знака.

Регістри ADC_LTR і ADC_HTR мають по 12 розрядів, які записуються значення верхньої і нижньої меж віконного компаратора.
Регістри ADC_SQR1… ADC_SQR3 служать для визначення номерів каналів, які будуть опитуватись у регулярній групі, та загальна кількість каналів. Розряди SQx цих регістрів задають номер каналу, де х – це номер позиції перетворення від 1 до 16. Кількість каналів групи задається розрядами L регістру ADC_SQR1.

Наприклад, необхідно регулярно опитувати 7 каналів у черзі 1, 3, 1, 5, 9, 9, 1. Для цього потрібно записати
у регістр ADC_SQR3 наступні значення: SQ1 = 1, SQ2 = 3, SQ3 = 1, SQ4 = 5, SQ5 = 9, SQ6 = 9. У регістр ADC_SQR2 потрібно записати номер останнього сьомого опитуваного каналу: SQ7 = 1. Після цього слід задати опитуваних каналів регулярної групи для регістра ADC_SQR1: L = 7. З наведеної інформації видно, що канали можна опитувати в будь-якій послідовності. Крім того, будь-який канал можна опитувати кілька разів.
Регістр ADC_JSQR, подібно до регістрів ADC_SQRx, задає послідовність опитуваних каналів та їх кількість для інжектованої групи каналів. Як видно із структури регістру, максимальна кількість перетворень в інжектованій групі дорівнює чотирьом. Кількість каналів задається у розрядах JL.

Регістри ADC_JDR1…ADC_JDR4 зберігають дані каналів інжектованої групи. Максимальна кількість каналів в інжектованій групі дорівнює чотирьом, відповідно є чотири регістри даних. Ці регістри містять результат перетворень у кожному вибраному каналі. Оскільки регістри 16-розрядні, а АЦП 12-розрядний, передбачена можливість вирівнювання результату вимірювання по лівому або правому краю цих регістрів.

Регістр ADC_DR містить результат перетворення АЦП у регулярній групі. На відміну від інжектованої групи, в якій чотири регістри даних, він – один на всю групу. Його структура подібна до регістрів JDRx, за винятком старших розрядів 16…31. Ці розряди застосовуються під час роботи АЦП в здвоєному режимі, разом із другим АЦП, званим ADC2.

Режими роботи АЦП
АЦП дозволяє використовувати кілька режимів роботи. Розглянемо по черзі, починаючи з режиму одиночного перетворення. У цьому режимі АЦП виконує лише одне перетворення. Воно запускається після встановлення розряду ADON у регістрі ADC_CR2 для регулярних каналів, або від зовнішнього сигналу для регулярного та інжектованого каналів. При цьому розряд CONT регістра ADC_CR2 повинен дорівнювати нулю. Після закінчення перетворення у вибраному регулярному каналі результат перетворення зберігається в регістрі ADC_DR і встановлюється прапор EOC. Якщо встановлено EOCIE, генерується переривання. Для інжектованого каналу результат перетворення зберігається в регістрі ADC_DRJ1 та встановлюється прапор JEOC. Якщо встановлено JEOCIE, генерується переривання. Після цього робота АЦП зупиняється.
У режимі безперервного перетворення АЦП розпочинає чергове перетворення після завершення поточного. Цей режим запускається від зовнішнього джерела або шляхом встановлення розряду ADON регістру ADC_CR2. При цьому розряд CONT регістра ADC_CR2 повинен дорівнювати одиниці. Після кожного перетворення виконується результат перетворення та зберігається аналогічно режиму одиночного перетворення.
У режимі сканування АЦП виконує чергове перетворення групи каналів. Цей режим вибирається встановленням розряду SCAN регістру ADC_CR1. Якщо цей розряд встановлений, АЦП сканує всі канали, вибрані в регістрах ADC_SQRx для регулярних каналів або в регістрі ADC_JSQR для інжектованих каналів. Якщо розряд CONT встановлений, перетворення не зупиняється на останньому каналі, а знову запускається з першого каналу. Якщо встановлено розряд DMA, контролер прямого доступу до пам'яті використовується для передачі результату в пам'ять після кожного перетворення після встановлення EOC. Якщо в регулярній групі використовується більше одного каналу, для збереження результату рекомендується використовувати DMA. Це дозволяє уникнути втрат даних, які зберігаються в регістрі ADC_DR. Наприкінці перетворення регулярна група формує запит DMA для збереження результату з регістру ADC_DR у місце, задане користувачем. Режими роботи АЦП з інжектованими каналами також різноманітні. Щоб використовувати запуск інжекційного каналу, треба, щоб біт JAUTO був обнулений, а біт SCAN у регістрі ADC_CR1 – встановлений. Запуск перетворення сигналів для групи регулярних каналів здійснюється або зовнішнім сигналом, або установкою біта ADON у регістрі ADC_CR2. Якщо зовнішній запуск інжектованих каналів відбувається під час перетворення сигналів групи регулярних каналів, то поточне перетворення припиняється та запускається перетворення послідовності інжекційних каналів у режимі одноразового сканування.

Потім відновлюється перетворення групи регулярних каналів, починаючи з каналу, який був перерваний. Якщо під час інжекційного перетворення відбувається подія запуску регулярних каналів, воно не перериває це перетворення, але запуск регулярної послідовності виконується відразу після закінчення обробки інжекційної послідовності. При використанні запуску інжектованих каналів зовнішньою подією необхідно переконатися, що інтервал між подіями запуску довше часу перетворення інжекційних каналів. Наприклад, якщо тривалість послідовності перетворень становить 28 циклів тактового АЦП, мінімальний інтервал між подіями запуску повинен бути 29 циклів.

Якщо встановлено біт JAUTO, після завершення перетворення групи регулярних каналів автоматично запускається перетворення групи інжекційних каналів. Це можна використовувати, щоб перетворити послідовність з 17-20 каналів, заданих у регістрах ADC_JSQR та ADC_SQRx. У цьому режимі механізм запуску зовнішньої події має бути вимкнений. Якщо на додаток до біта JAUTO встановлено біт CONT, то відразу після перетворення групи інжекційних каналів знову запускається перетворення групи регулярних каналів. Використовувати одночасно обидва режими, автоматичний запуск і запуск зовнішньою подією, неможливо.

КалібрівкаАЦП
АЦП має вбудований механізм автоматичного калібрування. Калібрування значно зменшує похибку оцифрування, що викликається неоднорідністю внутрішніх конденсаторів вибірки та зберігання сигналів. Під час калібрування обчислюється цифрове значення АЦП кожного конденсатора як коригуючого коду. Цей код використовується для компенсації помилки перетворення сигналів під час всіх наступних перетворень.
Перед початком калібрування АЦП повинен бути у відключеному стані, тобто біт ADON повинен дорівнювати нулю, принаймні протягом двох циклів тактового АЦП.
Запуск калібрування здійснюється установкою біта CAL у регістрі ADC_CR2. Як тільки калібрування закінчено, біт CAL скидається апаратно, після чого може бути виконане нормальне перетворення. Рекомендується калібрувати АЦП один раз під час подачі живлення. Коди калібрування зберігаються в ADC_DR при завершенні фази калібрування.

Час перетворення АЦП
АЦП підтримує можливість роздільного програмування часу перетворення у кожному з каналів. Передбачено можливість вибору 8 дискретних значень із діапазону 1,5…239,5 циклів. Для кожного каналу час задається індивідуально за допомогою розрядів SMPx регістрів ADC_SMPR1 та ADC_SMPR2.
Повний час перетворення Tconv обчислюється за такою формулою: Tconv = Tsmt + 12,5 циклів, де Tsmt – це програмно заданий час вибірки. Наприклад, частота ADCCLK задана рівною 14 МГц,
а час вибірки – 1,5 цикли. Тоді Tconv = = 1,5 + 12,5 = 14 циклів = 1мкс.

Датчик температури АЦП
Вбудований кристал мікроконтролера датчик температури дозволяє вимірювати температуру самого кристала. Датчик підключений до 16 входу АЦП. Рекомендований час вибірки
при опитуванні датчика становить 17,1 мкс.
Коли датчик не використовується, його можна вимкнути. Напруга на виході датчика змінюється лінійно з температурою. У різних кристалах ця лінія зміщується до 45 градусів, що пов'язано
з технологією виготовлення. Внутрішній датчик більше підходить для вимірювання абсолютного значення температури, а контролю її зміни. Для читання температури необхідно
вибрати канал 16, задати час вибірки не менше 17,1 мкс і встановити розряд TSVREFE в регістрі ADC_CR2 для включення датчика. Після цього можна запустити перетворення АЦП установкою розряду ADON або зовнішньою подією та прочитати результат перетворення.
Обчислюється значення температури за такою формулою: Т[C] = (V25 – Vsense) / Avg_ Slope + 25, де V25 – значення виміру при 25 градусах, має типове значення 1,41В, Vsense – поточне виміряне значення, а Avg_Slope – коефіцієнт з таблиці на кристал, має типове значення 4,3 мВ/C.

Віконний компаратор
Віконний компаратор може використовуватися для моніторингу вибраного регулярного або інжектованого каналу або всіх регулярних або інжектованих каналів. Крім моніторингу напруги, функція віконного компаратора може використовуватися як детектор перетину нуля.

Прапор AWD встановлюється, якщо цифрове значення канального сигналу, виміряного за допомогою АЦП, більше або менше заданого рівня. Цей рівень задається регістрами ADC_HTR та ADC_LTR. Переривання може бути дозволене розрядом AWDIE регістру ADC_CR1. Канали АЦП, контрольовані віконним компаратором, задаються згідно з таблицею 2.
Розряд AWDSGL задає кількість контрольованих каналів. Якщо він дорівнює 0, то контролюються всі канали, а якщо 1 – один канал. Номер каналу задається за допомогою розрядів AWDCH.
Розряд AWDEN дозволяє контролювати канали регулярної групи, а JAWDEN – контроль каналів інжектованої групи.

Таблиця 2. Канали АЦП контрольовані віконним компаратором

Приклади програм

Розглянемо приклади програм для роботи з АЦП. Почнемо з найпростішого варіанта: вимірювання рівня сигналу однією каналі з програмним запуском. Для цього використовуємо виведення порту PORTA.6 мікроконтролера. Приклад програми наведено у лістингу 1.

Лістинг 1 //========================= // Функція ініціалізації АЦП //============== =========== void Init_ADC(void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Дозволити тактування порту PORTA // Конфігурувати PORTA.6 як аналоговий вхід GPIOA->CRL &= ~GPIO_CRL_MODE6; / / Очистити біти MODE GPIOA->CRL &= ~GPIO_CRL_CNF6; // Очистити біти CNF RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; CR1 = 0; // Обнулити регістр управління ADC1->SQR1 = 0; // Обнулити регістр SQR1 ADC1->CR2 | Чекати закінчення калібрування ADC1->CR2 = ADC_CR2_EXTSEL; // Вибрати джерелом запуску розряд SWSTART ADC1->CR2 |= ADC_CR2_EXTTRIG; ================================================== = // Функція запуску перетворення АЦП і читання обраного каналу // Вхід - номер каналу для перетворення // Вихід - результат перетворення //======================= =============================== uint16_t RD_ADC(uint8_t nk) ( ADC1->SQR3 = nk; // Задати номер каналу ADC1->CR2 | = ADC_CR2_SWSTART; // Пуск перетворення while(!(ADC1->SR & ADC_SR_EOC))(); // Чекати на закінчення перетворення return ADC1->DR; // Вважати результат перетворення) //========================= // Головний модуль програми //========== =============== void main(void) ( unsigned int ai; // Ініціалізація змінних // Інші команди … while(1) // Нескінченний цикл ( Init_ADC(); // Виконати ініціалізацію та пуск АЦП ai = RD_ADC(6); // Рахувати дані АЦП для каналу 6 // Інші команди … ))

Даний приклад демонструє програму, в якій необхідно регулярно запускати АЦП і чекати закінчення перетворення.
Тепер розглянемо приклад іншої програми, наведений у лістингу 2, де задіяний режим безперервного перетворення АЦП.

Лістинг 2 //========================= // Функція ініціалізації АЦП //============== =========== void Init_ADC(void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Дозволити тактування порту PORTA // Конфігурувати PORTA.6 як аналоговий вхід GPIOA->CRL &= ~GPIO_CRL_MODE6; / / Очистити біти MODE GPIOA->CRL &= ~GPIO_CRL_CNF6; // Очистити біти CNF RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; CR1 = 0; // Обнулити регістр управління ADC1->SQR1 = 0; // Обнулити регістр SQR1 ADC1->CR2 | Чекати закінчення калібрування ADC1->CR2 = ADC_CR2_EXTSEL; // Вибрати джерелом запуску розряд SWSTART ADC1->CR2 |= ADC_CR2_EXTTRIG; |= ADC_CR2_ADON; // Включити АЦП ADC1->CR2 |= ADC_CR2_SWSTART; // // Пуск перетворення) //========================= // Головний модуль програми //========================= void main(void) ( unsigned int ai; // Ініціалізація змінних Init_ADC(); // Виконати ініціалізацію та запуск АЦП // Інші команди … while(1) // Нескінченний цикл ( ai=ADC1->DR; // Вважати результат перетворення // Інші команди … ) )

Ця програма запускає режим безперервного перетворення заданого каналу, і АЦП постійно опитує обраний канал, поміщаючи результат регістр даних. Тому
в основній програмі не потрібно регулярно запускати АЦП. При такому способі в регістрі ADC_DR інформація про рівень сигналу на вході каналу постійно оновлюватиметься. Оновлення відбуватиметься з періодичністю, яку можна змінювати.
У розглянутих прикладах можна запустити безперервне перетворення одного каналу. Якщо потрібно зробити це для декількох каналів, то без використання переривань або блоку ПДП не обійтися, оскільки для регулярної групи передбачено лише один регістр даних. Однак, якщо кількість каналів не перевищує чотирьох, то подібним чином можна використовувати і перетворення інжектованих каналів.
Максимальна кількість каналів для інжектованої групи дорівнює чотирьом. Для кожного такого каналу передбачено свій регістр для зберігання результату перетворення.
Допустимо, необхідно опитувати чотири канали з номерами: 3, 4, 5 і 6. Для цього можна запустити безперервний вимір групи із чотирьох інжектованих каналів. При цьому АЦП автоматично скануватиме чотири задані канали, і поміщатиме результат в регістри даних ADC_ JDR1, ADC_JDR2, ADC_JDR3 і ADC_JDR4. При цьому можна буде зчитувати дані з потрібного каналу будь-коли. Приклад такої програми наведено у лістингу 3.

Лістинг 3 //========================= // Функція ініціалізації АЦП //============== =========== void Init_ADC(void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Дозволити тактування порту PORTA //Сконфігурувати PORTA.3 як аналоговий вхід GPIOA->CRL &= ~GPIO_CRL_MODE3; / / Очистити біти MODE GPIOA->CRL &= ~GPIO_CRL_CNF3; // Очистити біти CNF //Сконфігурувати PORTA.4 як аналоговий вхід GPIOA->CRL &= ~GPIO_CRL_MODE4; // Очистити біти CNF //Сконфігурувати PORTA.5 як аналоговий вхід GPIOA->CRL &= ~GPIO_CRL_MODE5;// Очистити біти MODE GPIOA->CRL &= ~GPIO_CRL_CNF5; вхід GPIOA->CRL &= ~GPIO_CRL_MODE6; // Очистити біти MODE GPIOA->CRL &= ~GPIO_CRL_CNF6; // Очистити біти CNF RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; ; // Задати значення дільника тактової частоти ADC1->CR1 = 0; // Обнулити регістр управління ADC1->CR2 | // Пуск калібрування while (!(ADC1->CR2 & ADC_CR2_CAL))(); // Чекати на закінчення калібрування ADC1->CR2 = ADC_CR2_JEXTSEL; // Вибрати джерелом запуску розряд JSWSTART ADC1->CR2 | = ADC_CR2_JEXTTRIG; // Дозволити зовнішній запуск інжектованої групи ADC1->CR2 | = ADC_CR2_CONT; // Включити режим безперервного перетворення ADC1->CR1 | = ADC_CR1_SCAN; // Включити режим сканування кількох каналів ADC1->CR1 | = ADC_CR1_JAUTO; // Автоматичний запуск інжектованої групи ADC1-> JSQR = (uint32_t) (4-1)<<20; // Задать количество каналов в инжектированной группе=4 ADC1->JSQR | = (uint32_t) 3<<(5*0); // Номер первого канала для преобразования=3 ADC1->JSQR | = (uint32_t) 4<<(5*1); // Номер второго канала для преобразования=4 ADC1->JSQR | = (uint32_t) 5<<(5*2); // Номер третьего канала для преобразования=5 ADC1->JSQR |= (uint32_t)6<<(5*3); // Номер четвертого канала для преобразования=6 ADC1->CR2 | = ADC_CR2_ADON; // Включити АЦП ADC1->CR2 | = ADC_CR2_JSWSTART; // Пуск перетворення) //========================= // Головний модуль програми //=========== ============== void main(void) ( unsigned int ai; // Ініціалізація змінних Init_ADC(); // Виконати ініціалізацію та пуск АЦП // Інші команди … while(1) // Нескінченний цикл (// Вважати результат перетворення ai=ADC1->JDR1; // Канал 3 ai=ADC1->JDR2; // Канал 4 ai=ADC1->JDR3; // Канал 5 ai=ADC1->JDR4; // Канал 6 / / Інші команди ... ) )

Після виконання наведеної функції ініціалізації АЦП у регістрах даних інжектованої групи результати перетворення, задані у програмі каналів, регулярно оновлюватимуться. Тому дані результати можна буде зчитувати у довільний час у міру потреби.
Детальніше ознайомитися з блоком АЦП мікроконтролера STM32 можна на сайті.

ADC - це текстовий протокол для клієнт-серверних мереж, на зразок Neo-Modus" Direct Connect (NMDC) . Метою є створення простого протоколу, який не навантажує ні клієнт, ні сервер, і який можна розширювати. , але не все.

Розглядаються ті самі взаємодії: клієнт-клієнт і клієнт-сервер. Ця документація поділена на дві частини; перша частина визначає структуру протоколу, друга - специфічність системи протоколу використання цієї структури. Advanced Direct Connect - це перша версія, яка поступово покращуватиметься.

Більшість ідей для протоколу прийшли з проекту DCTNG (Jan Vidar Krey's).Основні учасники розробки: Dustin Brody, Walter Doekes, Timmo Stange, Fredrik Ullner, Fredrik Stenberg та інші.Jon Hess допоміг як автор протоколу NMDC.

Переваги протоколу

  • SID, а також назви команд протоколу складаються з чотирьох латинських символів у верхньому регістрі. Протокол досить добре підходить для реалізації мовою СІ. За стандартом мови СІ sizeof(char) == 1, тобто 4 символи займатимуть 4 байти, або можуть бути представлені у вигляді чотирибайтового цілого числа. Перетворення рядка на число і назад значно спрощує та оптимізує роботу з командами та дає можливість зберігати команду у вигляді об'єднання.

Недоліки протоколу

  • Розділювачами протоколу є дуже поширені символи (пробіл і перенесення), які потрібно замінювати на \s та \n. Так як ці символи дуже поширені в повідомленнях чату, кількість замін завжди буде більшим, чого не було в протоколі NMDC.
  • Порівняно з протоколом NMDC, у протоколі ADC є можливість у UserCommand видалити певне меню. Однак, як і раніше, відсутня можливість видалення певного меню у певному контексті.

Історія версій

Наступні версії цього документа, а також проміжні та старіші версії можуть бути отримані за адресою: . Ця версія подається до ревізії:

Версія 1.0.1, 2008-05-02

  • Розширення виділено в окремий документ.
  • Специфікації виділені в окремому проекті на SourceForge.

Версія 1.0, 2007-12-01

  • Перший реліз

Структура протоколу

  • Усі команди протоколу розпочинаються з чотирьох літер. Перша літера визначає те, як команда має бути надіслана, наступні три показують що має бути виконано.
  • Параметри поділяються пробілами, а кожна команда закінчується символом перенесення рядка (код 0x0a). Екрануються елементи: "\s" - пробіл, "\n" - новий рядок і "\\" - зворотний сліш. Ця версія протоколу резервує всі інші екрановані символи для подальшого використання; будь-які команди, які містять невідомі екрановані символи, повинні ігноруватися.
  • Всі команди, що відсилаються, повинні відправлятися в кодуванні UTF-8 - закодований Юнікод в С нормалізації.
  • Клієнти повинні ігнорувати невідомі/неправильні команди. Хаби повинні ігнорувати неправильні команди, і повинні надсилати невідомі команди, відповідно до їх типу (префіксу).
  • Адреси клієнтів мають бути визначені у вигляді десяткових чисел, розділених точками ("x.x.x.x") для IPv4 або RFC (1884) для IPv6. Адреси хабів повинні бути визначені посиланням на добавку "adc" спереду, яка показує специфіку даного протоколу ("adc://server:port/").
  • Числа відсилаються як рядки відповідно до стандарту плаваючої точки, як роздільник між цілою дробовою частиною використовується точка "." . Цілими є числа без дробової частини та без експоненційної добавки. Програми повинні мати можливість оперувати з 64-бітними позитивними числами та з 64-бітними числами з плаваючою точкою. Префіксом заперечення є знак "-".

D (Direct message)Хаб повинен відправити цю команду для користувача із зазначеним SID.

E (Echo message)Хаб повинен відправити команду для користувачів з sid та my_sid.

F (Feature broadcast)Хаб повинен надіслати цю команду всім клієнтам, які підтримують(+)/не підтримують(-) цю характеристику. Підтримка клієнтом тієї чи іншої характеристики визначається з поля SU, яке міститься в команді INF , що надсилається клієнтом.

H (Hub message)Клієнти повинні використовувати цей тип для відсилання команди, яка призначена лише хабу.

I (Info message)Хаби повинні використовувати цей тип для відсилання команди, яка не була надіслана іншим клієнтом.

U (UDP message)Клієнти повинні використовувати цю команду тільки для прямого з'єднання протоколу UDP.

Хеш-функції

Деякі команди використовуються для визначення хеш-функцій. Під час встановлення кожного нового з'єднання за командою SUP відбувається обмін хеш-функціями. При коннект клієнт передає серверу кілька хеш-функцій за допомогою параметрів команди SUP . Сервер вбирає одну з них і передає клієнтові, поставивши її до будь-якої іншої хеш-функції в команді SUP , яка відправиться з сервера. Клієнт і хаб повинні мати принаймні одну однакову хеш-функцію, яка буде використовуватись у протоколі та у файловій ідентифікації.

Ідентифікація клієнта

Кожен клієнт ідентифікується за трьома різними ідентифікаторами: ідентифікатор сесії - Session ID (SID), особистий ідентифікатор - Private ID (PID) та ідентифікатор клієнта - Client ID (CID).

Файли

Імена файлів відраховуються від відносного (вигаданого) кореня в кулі користувача. "/" – роздільник директорій; кожен файл або ім'я директорії має бути унікальним у реєстро-незалежному контексті. Усі друковані символи, включаючи пропуск, допустимі в імені файлу, символи "/" і "\" екрануються символом "\". Клієнти повинні використовувати фільтри для назв під свої файлові системи, імена файлів, отримані від інших клієнтів, повинні також підкорятися цим правилам. Спеціальні імена "." і ".." не можуть утримуватися в директорії або імені файлу; будь-який отриманий файл-лист, що містить ці імена, повинен бути проігнорований. Усі імена директорій мають закінчуватися на "/".

Розшаровані файли ідентифікуються щодо безіменного кореня "/" ("/dir/subdir/filename.ext"), тоді як доповнення можуть додати ім'я кореня. Наприклад, "TTH/…" для TIGR доповнення використовують ім'я кореня "TTH" для ідентифікації файлів за їх "Tiger Tree Hash". Це неприпустимо для імен безіменного кореня, які потрапили в кулі з ідентифікатором по контрольній сумі.

Без кореневе ім'я файлу "files.xml" визначає повний файл-аркуш у форматі XML у кодуванні UTF-8 . Клієнтам рекомендується використовувати доповнення, щоб стискати файл-лист.

Доповнення можуть додавати до імені файлу свої розширення, зазвичай це робиться, щоб уникнути повторення імен.

Спеціальний тип "list" використовується для перегляду списків файлів. Частковий файловий список має ту саму структуру, що й нормальний список, але директорії можуть бути теговими з атрибутом Incomplete="1", що вказує на частковість. Тільки каталоги без кореневих файлів можуть починатися з символу "/". Вміст такої директорії згодом буде посланий клієнтові, який просить, на глибину, обрану ним (це потрібно для відправки тільки того рівня, який потрібно користувачеві). Атрибут "Base" для поля "FileListing" визначає, до якої конкретної директорії належить даний файл.


Опис роботи Аналого-цифрового перетворювача.
Переривання від АЦП

ATMega16 містить у собі 10-бітовий АЦП, вхід якого може бути з'єднаний з одним з восьми висновків Port A. двійковому вигляді). Опорна напруга подається на висновок ADRef або може використовуватися внутрішній генератор з фіксованою напругою 2,65 В. Отриманий результат можна представити у такому вигляді:

АЦП включається установкою біта ADEN у регістрі ADCSRA. Після перетворення, 10-бітний результат виявляється у 8-бітових регістрах ADCL та ADCH. За замовчуванням, молодший біт результату знаходиться праворуч (тобто bit 0 регістра ADCL, так зване праве орієнтування). Але порядок проходження бітів на ліве орієнтування можна змінити встановивши біт ADLAR у регістрі ADMUX. Це зручно, якщо потрібно отримати 8-бітовий результат. У такому разі потрібно прочитати лише регістр ADCH. В іншому випадку, Ви повинні спочатку прочитати регістр ADCL першим, а ADCH другим, щоб бути впевненим, що читання цих двох регістрів відноситься до результату одного перетворення.

Поодиноке перетворення може бути викликано записом біта ADSC регістр ADCSRA. Цей біт залишається встановленим постійно, що займається перетворенням. Коли перетворення закінчено, біт автоматично встановлюється в 0. Можна також починати перетворення з подій з різних джерел.

Для перетворення модулю АЦП необхідна тактова частота. Що ця частота, то швидше відбуватиметься перетворення (воно, зазвичай, займає 13 тактів, перше перетворення займає 25 тактів). Але що вище частота (і вище швидкість перетворення), то менш точним виходить результат.

Для отримання максимально точного результату модуль АЦП повинен тактуватися частотою в межах від 50 до 200 КГц. Якщо необхідний результат з точністю менше 10 біт, можна використовувати частоту більше 200 КГц. Модуль АЦП містить дільник частоти, щоб отримувати потрібну тактову частоту перетворення з частоти процесора. ADMUXРеєстр

задає вхідний контакт порту A для підключення АЦП, орієнтування результату та вибір опорної частоти. Якщо встановлено біт ADLAR, результат ліво-орієнтований. Опорна частота від внутрішнього генератора задається виставленими в 1 біт REFS1 і REFS0. Якщо обидва біти скинуті, то опорна частота береться від контакту AREF. У випадку, якщо REFS1=0 і REFS0=1, опорна частота береться від AVCC із зовнішнім конденсатором, підключеним до AREF. Вибір контакту введення виконується таким чином: Реєстр контролю та статусу АЦП:

ADCSRA
Біт ADEN=1 включає модуль АЦП.
Запис одиниці ADSC запускає цикл перетворення. У режимі "вільного польоту" запис одиниці запускає перше перетворення, наступні запускаються автоматично.
ADIF – прапор переривання АЦП. Цей біт встановлюється в 1, коли АЦП завершено перетворення і в регістрах ADCL і ADCH знаходяться актуальні дані. Цей прапор встановлюється навіть у тому випадку, якщо переривання заборонено. Це потрібно для випадку програмного опитування АЦП. Якщо використовуються переривання, прапор скидається автоматично.
Якщо використовується програмне опитування, прапор може бути скинутий записом лог.1 у цей біт.