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

У мікроконтролерах STM32 є потужний модуль АЦП, який має справді хороші характеристикита цікаві особливості:

  • 18 каналів введення (16 зовнішніх та 2 внутрішніх)
  • роздільна здатність 12 біт
  • всілякі режими перетворення:
    1. одноразове
    2. безперервне
    3. по тригеру
    4. за таймером
  • зручне вирівнювання бітів результату
  • звичайно ж, генерування всіляких переривань та сигналів для DMA
  • швидкість оцифровки - до 0.9 MSPS з програмованим часом захоплення та перетворення
  • автокалібрування
  • режим сканування входів за списком
  • аналоговий вотчдог

Необхідність у цьому модулі виникає часто: просто тому, що природа довкола нас не дискретна, а безперервна, і всілякі датчики зазвичай видають саме аналоговий сигнал. Особливо це стосується звуку, але так само можна зробити і, наприклад, осцилограф: популярний китайський USB-осцилограф DSO Nano зроблений саме на STM32F103.

Внутрішня будова

Вимірювання та опорні напруження

Принцип оцифровки дуже простий: вхідна напруга порівнюється з опорною напругою V_REF- і V_REF+:

  • V_REF- потрібно підключити до землі
  • V_REF+ за бажанням: або до живлення процесора (воно плаваюче і шумне, тому цей варіант годиться тільки для неточних вимірювань), або до зовнішнього джерела опорної напруги (ІОН)

Втім, є можливість програмно налаштувати ці ноги на пряме з'єднання із землею та живленням.

Вхідна напруга V_In буде виміряна щодо V_REF- і V_REF+, і результат перетворення складений у вихідний регістр у такій пропорції:

Наприклад, 1.2 при живленні АЦП від 3.3 перетворюються на 1490.

Реєстри АЦП у STM32

SR - регістр статусу

0 біт: прапорець AWD (Analog WatchDog). Вхідний сигнал перетнув значення регістрів LTR або HTR.

1 біт: прапор EOC (End Of Conversion). Після закінчення перетворення перемикається на 1. Скидається вручну або під час читання регістра DR.

4 біти: прапор STRT (Start). Сигналізує початок перетворення.

CR1 - перший регістр налаштувань

0..4 біти: значення AWDCH (Analog WatchDog Channel). Задає номер каналу для стеження за допомогою.

5 біт: EOCIE (End Of Conversion Interrupt Enable). Включає переривання після закінчення перетворення.

6 біт: AWDIE (Analog WatchDog Interrupt Enable). Включає переривання зі спрацьовування аналогового вотчдогу.

7 біт: JEOCIE.

8 біт: SCAN. Включає режим сканування каналів списку в регістрах SQR1, SQR2, SQR3.

9 біт: AWDSGL (Analog WatchDog Single). Задає тип спрацьовування вотчдога в режимі SCAN: на один канал (1) або всі (0).

10 біт: JAUTO.

11 біт: DISCEN (Discontinious mode Enabled). Включає «рваний» режим роботи – АЦП включається за зовнішнім тригером.

12 біт: JDISCEN.

13..15 біти: DISCNUM (Discontinious mode Number of channels). Кількість каналів для перетворення на «рваному» режимі.

16..19 біти: DUALMOD (Dual Mode selection). Задає режим спільної роботи двох АЦП.

22 біт: JAWDEN.

23 біт: AWDEN (Analog WatchDog Enabled). Включає аналоговий вотчдог.

CR2 - другий регістр налаштувань

0 біт: ADON (Analog/Digital converter On/off). Включає АЦП.

1 біт: CONT (Continious coversion). Включає режим одноразового (0) або зацикленого вимірювання (1).

2 біти: CAL (Calibration). Установка 1 включає калібрування; після закінчення калібрування скидається в 0. Спочатку потрібно скинути регістри.

3 біти: RSTCAL (Reset Calibration). Скидання регістрів калібрування, так само встановлюємо в 1 і чекаємо скидання.

8 біт: DMA. Вмикає DMA.

11 біт: ALIGN. Вирівнює дані з правого (0) або лівого (1) краю регістру.

12..14 біт: JEXTSEL.

15 біт: JEXTTRIG.

17..19 біт: EXTSEL (External event Select). Призначає номер події запуску (TIM1 CC1, TIM1 CC2, TIM1 CC3, TIM1 CC4, TIM3 TRGO, TIM4 CC4, EXTI_11, SWSTART).

20 біт: EXTTRIG (External Trigger). Включає запуск перетворення зовнішнього тригера.

21 біт: JSWSTART.

22 біт: SWSTART (Start conversion). Запускає перетворення. Після закінчення скидається.

23 біт: TSVREFE (Temp sensor and V_REF Enabled). Включає температурний сенсор та внутрішній ІОН.

DR - регістр результату виміру

SMPR1, SMPR2 – час перетворення

Реєстр налаштування часу перетворення кожного каналу.

HTR і LTR - межі вотчдогу

Верхній та нижній межі для аналогового вотчдогу, аналогічні регістру DR.

SQR1, SQR2, SQR3 – список каналів для сканування

Режим SCAN (біт SCAN у регістрі CR1)

Практика: включаємо АЦП

Найпростіший випадок використання АЦП: без переривань, без усіляких складних режимів – просто беремо та вимірюємо у циклі.

Ініціалізація

  1. Включаємо тактування модуля АЦП
  2. Налаштовуємо параметри модуля
  3. Включаємо модуль АЦП
  4. Налаштовуємо вхід (номер каналу АЦП)
  5. Проводимо калібрування

Я виходжу з того, що ніжки кристала не налаштовані, тобто в дефолтному стані «аналоговий вхід». Саме цей режим нам і потрібний.

Тільки деякі ноги STM32 можуть працювати як вход АЦП, вони позначені символом ANx (x = 0..15, ця цифра - номер каналу). Це зручно прикидати у програмі STM32Cube.

Void adc_init() ( RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // настройки ADC ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // режим работы - одиночный, независимый ADC_InitStructure.ADC_ScanConvMode = DISABLE; // не сканировать каналы, просто измерить один канал ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // однократное измерение ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // без внешнего триггера ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //выравнивание битов результат - прижать вправо ADC_InitStructure.ADC_NbrOfChannel = 1; //количество каналов - одна штука ADC_Init(ADC1, &ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); // настройка канала ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5); // калибровка АЦП ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration( ADC1), while (ADC_GetCalibrationStat us(ADC1)); )

Після виконання цієї функції АЦП1 налаштований, калібрований і готовий до вимірювань на восьмому каналі.

Вимірювання

Вимірювання проводиться просто:

  1. Запускаємо перетворення
  2. Очікуємо закінчення оцифровки (перевіряємо прапор EOC = End Of Conversion)
  3. Читаємо результат з регістру DR
uint16_t get_adc_value() ( ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); )

Найпростіше використання цих функцій:

Void main() ( adc_init(); uint16_t value = 0; while(1) value = get_adc_value(); )

Можна просто запустити програму, зупинити її брейкпойнтом та прочитати у відладчику виміряне значення.

Post переглядів: 309

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

Почнемо з…От деякі характеристики аналого-цифрового перетворювача в STM32f10x:

  • АЦП є 12-ти бітним
  • Можлива генерація переривання після закінчення перетворення, після закінчення перетворення з інжектованого каналу, а також можливе переривання від Analog Watchdog (що це таке розповім трохи нижче)
  • Можливе одиночне перетворення та перетворення в безперервному режимі
  • Самокалібрування
  • Запуск перетворення від зовнішньої події
  • Робота з ПДП (DMA, прямий доступ до пам'яті)

Ось структурна схема з даташиту, помилуйтесь)

Поки не забув про Analog Watchdog, напишу його роботу.
Він потрібний для того, щоб стежити, що напруга потрапляє у певні межі. Причому може сканувати як конкретний канал, і групу каналів. У регістри ADC_HTR і ADC_LTR заносимо значення верхнього та нижнього порогу відповідно. І у випадку, якщо напруга, що перевіряється, виходить за ці межі, генерується переривання. Найкорисніша річ!

Канали АЦП поділяються на регулярні та інжектовані. Причому, якщо запустити вимірювання інжектованих каналів, то регулярних вимірювання буде призупинено. У деяких ситуаціях теж дуже корисна фіча.

Як і в мікроконтролерах AVR можливе вирівнювання результату з правого або лівого краю. Тут справді результат 12-ти бітний. Але суть та сама. Ось як все це виглядає у регістрах:

Бачимо, як змінюються дані у регістрі даних. Програма працює правильно, тому можемо переходити до подальшого вивчення STM32. Далі буде…

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

Вступ
Одним з найбільш важливих і затребуваних блоків для мікроконтролера є його цифровий перетворювач (АЦП), який називається технічною англомовною літературою як Analog-to-Digital
Конвертер (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 = 1 1 );
●● біт 15 JEXTTRIG забороняє та дозволяє використання зовнішнього запуску для інжектованих каналів;
●● біти 14…12 JEXTSEL визначають джерело, яке запускатиме перетворення в інжектованому каналі (000 = TIM1_TRGO, 001 = TIM1_CH4, 010 = TIM2_TRGO, 011 = TIM2_CH1, 100 = TIM3_СH 4, 1 = ;
●● біт 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;// Включити тактування АЦП RCC->CFGR &= ~RCC_CFGR_ADCPRE; CR1 = 0; // Обнулити регістр управління ADC1->SQR1 = 0; // Обнулити регістр SQR1 ADC1->CR2 |= ADC_CR2_CAL; // Пуск калібрування while (!(ADC1->CR2 & ADC_CR2_CAL))(); // Чекати закінчення калібрування ADC1->CR2 = ADC_CR2_EXTSEL;// Вибрати джерелом запуску розряд SWSTART ADC1->CR2 |= ADC_CR2_EXTTRIG;// Дозволити зовнішній запуск регулярного каналу ADC1->CR2 |= ADC_CR2_ADON;// Включити АЦП = ================================================== = // Функція запуску перетворення АЦП та читання обраного каналу // Вхід - номер каналу для перетворення // Вихід - результат перетворення //================================== ==================== 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;// Включити тактування АЦП RCC->CFGR &= ~RCC_CFGR_ADCPRE; CR1 = 0; // Обнулити регістр управління ADC1->SQR1 = 0; // Обнулити регістр SQR1 ADC1->CR2 |= ADC_CR2_CAL; // Пуск калібрування while (!(ADC1->CR2 & ADC_CR2_CAL))(); // Чекати закінчення калібрування ADC1->CR2 = ADC_CR2_EXTSEL;// Вибрати джерелом запуску розряд SWSTART ADC1->CR2 |= ADC_CR2_EXTTRIG;// Дозволити зовнішній запуск регулярного каналу ADC1->CR2 |= ADC_CR2_CONT;// Включити режим безперервно |= 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;// Очистити біти MODE GPIOA->CRL &= ~GP // Очистити біти 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 |= ADC_C R2_CAL; // Пуск калібрування 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 можна на сайті.

Аналого-цифрові перетворювачі (АЦП)є пристроями, що приймають вхідні аналогові сигнали та генерують відповідні їм цифрові сигнали, придатні для обробки мікропроцесорами та іншими цифровими пристроями. АЦПвходить до багатьох сучасних моделей МК 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 розрядам.