- MCP4921 ЦАП (цифрово-аналогов преобразувател)
- Необходими компоненти
- Схематично
- Обяснение на кода
- Тестване на цифрово-аналогово преобразуване с помощта на PIC
Digital and Analog е неразделна част от Electronics. Повечето устройства имат както ADC, така и DAC и се използват, когато има нужда от преобразуване на сигнали от аналогов в цифров или цифров в аналогов. Също така сигналите от реалния свят като звук и светлина са аналогови по своята същност, така че винаги, когато тези реални сигнали трябва да се използват, цифровите сигнали трябва да бъдат преобразувани в аналогови, например за създаване на звук с помощта на високоговорители или за управление на източник на светлина.
Друг тип ЦАП е модулатор на широчина на импулса (ШИМ). PWM взема цифрова дума и генерира цифров импулс с променлива ширина на импулса. Когато този сигнал се предава през филтър, резултатът ще бъде чисто аналогов. Аналоговият сигнал може да съдържа множество типове данни в сигнал.
В този урок ще свържем DAC MCP4921 с Microchip PIC16F877A за цифрово аналогово преобразуване.
Тук в този урок ще преобразуваме цифровия сигнал в аналогов сигнал и ще покажем входната цифрова стойност и изходната аналогова стойност на 16x2 LCD. Той ще осигури 1V, 2V, 3V, 4V и 5V като краен аналогов изход, който е демонстриран във видеото, дадено в края. Можете да научите повече за ЦАП в нашия ценен урок за взаимодействие на ЦАП с платките Raspberry Pi, Arduino и STM32.
ЦАП може да се използва в много приложения като управление на двигателя, управление на яркостта на LED светлините, аудио усилвател, видео енкодери, системи за събиране на данни и др. Преди да преминете директно към интерфейсната част, е важно да имате общ преглед за MCP4921.
MCP4921 ЦАП (цифрово-аналогов преобразувател)
MCP4921 е 12-битов ЦАП, така че MCP4921 ще осигури 12 бита изходна резолюция. Разделителната способност на ЦАП означава брой цифрови бита, които могат да бъдат преобразувани в аналогов сигнал. Колко стойности можем да постигнем от това се основава на формулата. За 12-битово е = 4096. Това означава, че ЦАП с 12-битова резолюция може да генерира 4096 различни изхода.
Използвайки тази стойност, човек може лесно да изчисли единичното аналогово напрежение на стъпка. За изчисляване на стъпките се изисква еталонно напрежение. Тъй като логическото напрежение за устройството е 5V, стъпковото напрежение е 5/4095 (4096-1, тъй като началната точка за цифровото не е 1, а е 0), което е 0,00122100122 миливолта. Така че, промяна от 1 бит ще промени аналоговия изход с 0,00122100122.
И така, това беше частта за преобразуване. В MCP4921 е 8-пинов IC. В диаграмата щифт и описанието може да се намери по-долу.
В MCP4921 IC комуникира с микроконтролера от протокола SPI. За SPI комуникация устройството трябва да бъде главно, което подава данни или команда на външното устройство, свързано като подчинено устройство. В комуникационната система SPI, множество подчинени устройства могат да бъдат свързани с едно главно устройство.
За да подадете данните и командата, е важно да разберете командния регистър.
На изображението по-долу е показан командният регистър,
В регистъра команда е 16-битов регистър. За командата за конфигуриране се използва бит-15 до бит-12. Въведените данни и конфигурацията са ясно показани на горното изображение. В този проект MCP4921 ще се използва като следната конфигурация-
Битов номер |
Конфигурация |
Стойност на конфигурацията |
Бит 15 |
DAC 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 MHz кристал
- Дисплей 16x2 символен LCD.
- 2k резистор -1 бр
- 33pF кондензатори - 2 бр
- 4.7k резистор - 1 бр
- Мултиметър за измерване на изходното напрежение
- Макет
- 5V захранване, зарядно за телефон може да работи.
- Много кабели за свързване или жици berg.
- Среда за програмиране на Microchip с комплект за програмист и IDE с компилатор
Схематично
Схема за свързване на DAC4921 с PIC микроконтролер е дадена по-долу:
Веригата е изградена в Breadboard-
Обяснение на кода
Пълен код за преобразуване на цифрови сигнали в аналогов с PIC16F877A е даден в края на статията. Както винаги, първо трябва да зададем конфигурационните битове в микроконтролера PIC.
// Настройки на бита за конфигуриране PIC16F877A // Изявления за конфигуриране на линията на източника „C“ // CONFIG #pragma config FOSC = HS // Битове за избор на осцилатор (HS осцилатор) #pragma config WDTE = OFF // Бит за активиране на Watchdog Timer (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 // Flash Program Memory Активиране на битове (Защита срещу записване изключена; цялата памет на програмата може да бъде записана от контрола EECON) #pragma config CP = OFF // Бит за защита на кода на паметта на Flash програма (защита на кода изключена)
Долните кодови редове се използват за интегриране на LCD и SPI заглавни файлове, също така е декларирана честотата XTAL и CS ПИН връзката на DAC.
Ръководството и библиотеката за PIC SPI можете да намерите на дадената връзка.
#include
Функцията на SPI_Initialize_Master () е леко модифицирана за различна конфигурация, необходима за този проект. В този случай регистърът SSPSTAT е конфигуриран по такъв начин, че входните данни, взети в извадка в края на времето за извеждане на данни, както и SPI часовникът, конфигуриран като Transmit, се появяват при прехода от режим на неактивен часовник в неактивен режим. Другото е същото.
void SPI_Initialize_Master () { TRISC5 = 0; // Задаване като изход SSPSTAT = 0b11000000; // стр. 74/234 SSPCON = 0b00100000; // стр. 75/234 TRISC3 = 0; // Задаване като изход за подчинен режим }
Също така, за функцията по-долу, SPI_Write () е леко модифициран. Предаването на данни ще се осъществи след изчистване на буфера за осигуряване на перфектно предаване на данни през SPI.
void SPI_Write (char входящ) { SSPBUF = входящ; // Запишете данните на потребителя в буфер, докато (! SSPSTATbits.BF); }
Важната част от програмата е драйверът MCP4921. Това е малко сложна част, тъй като командата и цифровите данни се събират заедно, за да осигурят пълни 16-битови данни през SPI. Тази логика обаче е ясно показана в коментарите на кода.
/ * Тази функция е за преобразуване на цифровата стойност в аналогова. * / void convert_DAC (неподписана стойност int) { / * Размер на стъпката = 2 ^ n, Следователно 12bit 2 ^ 12 = 4096 За 5V референция стъпката ще бъде 5/4095 = 0,0012210012210012V или 1mV (приблизително) * / неподписан int контейнер; неподписан int MSB; неподписан 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; }
В основната функция се използва „за цикъл“, където се създават цифровите данни за създаване на изход от 1V, 2V, 3V, 4V и 5V. Цифровата стойност се изчислява спрямо изходното напрежение / 0,0012210012210012 миливолта.
void main () { system_init (); uvod_екран (); 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
Вградената верига се тества с помощта на Multi-meter. На изображенията по-долу изходното напрежение и цифровите данни се показват на LCD дисплея. Мултиметърът показва отблизо четене.
Пълният код с работещо видео е приложен по-долу.