- ЦАП MCP4921 (цифрово-аналоговий перетворювач)
- Потрібні компоненти
- Схематична
- Пояснення коду
- Тестування цифрового в аналогове перетворення за допомогою PIC
Цифровий та аналоговий - невід’ємна частина електроніки. Більшість пристроїв мають як АЦП, так і ЦАП, і вони використовуються, коли існує потреба в перетворенні сигналів або з аналогового на цифровий, або з цифрового на аналоговий. Крім того, реальні сигнали, такі як звук і світло, є аналоговими за своєю природою, тому щоразу, коли потрібно використовувати ці реальні сигнали, цифрові сигнали повинні бути перетворені в аналогові, наприклад, для створення звуку за допомогою колонок або для управління джерелом світла.
Іншим типом ЦАП є модулятор широти імпульсу (ШІМ). ШІМ приймає цифрове слово і генерує цифровий імпульс із змінною шириною імпульсу. Коли цей сигнал передається через фільтр, результат буде суто аналоговим. Аналоговий сигнал може містити декілька типів даних у сигналі.
У цьому посібнику ми будемо взаємодіяти ЦАП MCP4921 з Microchip PIC16F877A для цифрового аналогового перетворення.
У цьому посібнику ми перетворимо цифровий сигнал в аналоговий сигнал і відобразимо вхідне цифрове значення та вихідне аналогове значення на РК-дисплеї 16x2. Він забезпечить 1В, 2В, 3В, 4В і 5В як кінцевий аналоговий вихід, який продемонстровано у відео, поданому в кінці. Ви можете далі дізнатися про ЦАП у нашому дорогоцінному посібнику з взаємодії ЦАП з платами Raspberry Pi, Arduino та STM32.
ЦАП може бути використаний у багатьох додатках, таких як керування двигуном, регулювання яскравості світлодіодних ламп, підсилювач звуку, відеокодери, системи збору даних тощо. Перш ніж переходити безпосередньо до частини взаємодії, важливо мати огляд про MCP4921.
ЦАП MCP4921 (цифрово-аналоговий перетворювач)
MCP4921 - це 12-бітний ЦАП, тому MCP4921 забезпечить 12 біт вихідної роздільної здатності. Дозвіл ЦАП означає кількість цифрових бітів, які можуть бути перетворені в аналоговий сигнал. Скільки значень ми можемо досягти з цього, базується на формулі. Для 12-бітового значення це = 4096. Це означає, що ЦАП із 12-бітовою роздільною здатністю може виробляти 4096 різних виходів.
Використовуючи це значення, можна легко розрахувати одинарну аналогову ступінчасту напругу. Для розрахунку кроків необхідна опорна напруга. Оскільки логічна напруга для пристрою становить 5 В, напруга кроку дорівнює 5/4095 (4096-1, оскільки вихідна точка для цифрового сигналу не 1, це 0), що становить 0,00122100122 мілівольт. Отже, зміна 1 біта змінить аналоговий вихід з 0,00122100122.
Отже, це була частина перетворення. MCP4921 є 8-контактний IC. Контактна діаграму і опис можна знайти нижче.
Схема MCP4921 IC взаємодіє з мікроконтролером за протоколом SPI. Для зв'язку SPI пристрій повинен бути ведучим, який подає дані або команду на зовнішній пристрій, підключений як підлеглий. У системі зв'язку SPI до одного головного пристрою можна підключити кілька підпорядкованих пристроїв.
Щоб подати дані та команду, важливо зрозуміти регістр команд.
На зображенні нижче показано регістр команд,
Регістр команд представляє собою 16-бітовий регістр. Біт-15-біт-12 використовується для команди конфігурації. Введення даних та конфігурація чітко показані на зображенні вище. У цьому проекті MCP4921 буде використовуватися як наступна конфігурація -
Розрядний номер |
Конфігурація |
Значення конфігурації |
Біт 15 |
ЦАП A |
0 |
Біт 14 |
Небуферований |
0 |
Біт 13 |
1x (V OUT * D / 4096) |
1 |
Біт 12 |
Біт управління вихідною потужністю |
1 |
Отже, двійковий файл - це 0011 разом із даними, які визначаються бітами від D11 до D0 реєстру. 16-розрядні дані 0011 xxxx xxxx xxxx потрібно подати, де перші 4 біти MSB є конфігурацією, а решта - LSB. Це буде зрозуміліше, побачивши часову діаграму команди записи.
Відповідно до часової діаграми та таблиці даних, штифт CS низький протягом усього періоду запису команди на MCP4921.
Зараз настав час взаємодіяти пристрій з апаратним забезпеченням і написати коди.
Потрібні компоненти
Для цього проекту необхідні такі компоненти:
- MCP4921
- PIC16F877A
- Кристал 20 МГц
- Дисплей 16x2 символів РК-дисплей.
- 2k резистор -1 шт
- Конденсатори 33pF - 2 шт
- Резистор 4.7k - 1 шт
- Мультиметр для вимірювання вихідної напруги
- Макет
- Блок живлення 5 В, зарядний пристрій для телефону може працювати.
- Багато дротів для підключення або дротів Berg.
- Середовище програмування Microchip з набором Programmer та IDE із компілятором
Схематична
Принципова схема для взаємодії DAC4921 з мікроконтролером PIC наведена нижче:
Схема побудована в макеті
Пояснення коду
Повний код для перетворення цифрових сигналів в аналоговий за допомогою PIC16F877A наведено в кінці статті. Як завжди, нам спочатку потрібно встановити біти конфігурації в мікроконтролері PIC.
// Налаштування біта конфігурації PIC16F877A // Оператори конфігурації вихідного рядка 'C' // CONFIG #pragma config FOSC = HS // Біти вибору осцилятора (HS-генератор) #pragma config WDTE = OFF // Біт активації сторожового таймера (WDT вимкнено) # pragma config PWRTE = OFF // Біт увімкнення таймера включення (PWRT вимкнено) #pragma config BOREN = ON // Біт-Скидання Увімкнути біт (BOR увімкнено) # pragma config LVP = OFF // Низьковольтне (одне живлення) Біт увімкнення послідовного програмування в ланцюзі (штифт RB3 / PGM має функцію PGM; увімкнено програмування низької напруги) #pragma config CPD = OFF // Біт захисту коду пам'яті даних EEPROM (захист коду даних EEPROM вимкнений) #pragma config WRT = OFF // Флеш-пам'ять програми Включення бітів (захист від запису вимкнено; вся пам'ять програми може бути записана контролером EECON) #pragma config CP = OFF // Біт захисту коду пам'яті Flash-програми (захист коду вимкнено)
Наведені нижче рядки коду використовуються для інтеграції файлів заголовків РК-дисплея та SPI, а також оголошено частоту XTAL та контактне з'єднання CS ЦАП.
Підручник з PIC SPI та бібліотеку можна знайти за вказаним посиланням.
#включати
Функція SPI_Initialize_Master () дещо змінена для іншої конфігурації, необхідної для цього проекту. У цьому випадку регістр SSPSTAT налаштований таким чином, що вхідні дані, відібрані в кінці часу виведення даних, а також годинник SPI, налаштований як Передача, виникають при переході з режиму активного стану в режим очікування. Інше те саме.
порожнеча SPI_Initialize_Master () { TRISC5 = 0; // Встановити як вихід SSPSTAT = 0b11000000; // стор. 74/234 SSPCON = 0b00100000; // стор. 75/234 TRISC3 = 0; // Встановити як вихід для режиму slave }
Крім того, для наведеної нижче функції SPI_Write () трохи змінений. Передача даних відбуватиметься після очищення буфера для забезпечення ідеальної передачі даних через SPI.
void SPI_Write (char вхідний) { SSPBUF = вхідний; // Записуємо дані, надані користувачем, в буфер while (! SSPSTATbits.BF); }
Важливою частиною програми є драйвер MCP4921. Це дещо хитра частина, оскільки команда та цифрові дані поєднуються для забезпечення повних 16-бітових даних через SPI. Однак ця логіка чітко видно у коментарях до коду.
/ * Ця функція призначена для перетворення цифрового значення в аналогове. * / void convert_DAC (непідписане значення int) { / * Розмір кроку = 2 ^ n, отже, 12 біт 2 ^ 12 = 4096 Для посилання 5В кроком буде 5/4095 = 0,0012210012210012V або 1 мВ (приблизно) * / контейнер без підпису int; без підпису int MSB; unsigned int LSB; / * Крок: 1, зберігається 12-бітові дані в контейнері Припустимо, дані складають 4095, у двійковому вигляді 1111 1111 1111 * / container = value; / * Крок: 2 Створення фіктивного 8-бітного. Отже, поділивши 256, верхні 4 біти фіксуються в LSB LSB = 0000 1111 * / LSB = контейнер / 256; / * Крок: 3 Надсилання конфігурації з пробиванням 4-бітових даних. LSB = 0011 0000 АБО 0000 1111. Результат 0011 1111 * / LSB = (0x30) - LSB; / * Крок: 4 Контейнер все ще має 21-бітове значення. Витяг нижчих 8 бітів. 1111 1111 І 1111 1111 1111. Результат - 1111 1111, що є MSB * / MSB = 0xFF & container; / * Крок: 4 Надсилання 16-бітних даних шляхом ділення на два байти. * / DAC_CS = 0; // CS низький під час передачі даних. Відповідно до специфікації потрібно SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
В основній функції використовується цикл "for", де створюються цифрові дані для створення вихідних напруг 1В, 2В, 3В, 4В та 5В. Цифрове значення обчислюється щодо вихідної напруги / 0,0012210012210012 мілівольт.
void main () { system_init (); Introduction_screen (); число int = 0; int volt = 0; while (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { number = volt / 0.0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("DATA Sent: -"); lcd_print_number (число); lcd_com (SECOND_LINE); lcd_puts ("Вивід: -"); lcd_print_number (вольт); lcd_puts ("V"); convert_DAC (число); __delay_ms (300); } } }
Тестування цифрового в аналогове перетворення за допомогою PIC
Вбудована схема перевіряється за допомогою мультиметра. На зображеннях нижче вихідна напруга та цифрові дані відображаються на РК-дисплеї. Мультиметр показує пильний показник.
Повний код із робочим відео додається нижче.