- ЦАП модул MCP4725 (цифрово-аналогов преобразувател)
- I2C комуникация в MCP4725 ЦАП
- Необходими компоненти
- Електрическа схема
- Програмиране на DAC Arduino
- Цифрово в аналогово преобразуване с помощта на MCP4725 и Arduino
Всички знаем, че микроконтролерите работят само с цифрови стойности, но в реалния свят трябва да се справим с аналогови сигнали. Ето защо ADC (Analog to Digital Converters) е там, за да преобразува аналоговите стойности от реалния свят в цифрова форма, така че микроконтролерите да могат да обработват сигналите. Но какво, ако се нуждаем от аналогови сигнали от цифрови стойности, така че тук идва DAC (цифрово-аналогов преобразувател).
Един прост пример за преобразувател Digital to Analog е записването на песен в студио, където изпълнител певец използва микрофон и пее песен. Тези аналогови звукови вълни се преобразуват в цифрова форма и след това се съхраняват във файл с цифров формат и когато песента се възпроизвежда с помощта на съхранения цифров файл, тези цифрови стойности се преобразуват в аналогови сигнали за изход на високоговорители. Така че в тази система се използва ЦАП.
ЦАП може да се използва в много приложения като управление на двигателя, контрол на яркостта на LED светлините, аудио усилвател, видео енкодери, системи за събиране на данни и др.
В много микроконтролери има вътрешен ЦАП, който може да се използва за генериране на аналогов изход. Но процесорите на Arduino като ATmega328 / ATmega168 нямат вграден ЦАП. Arduino има ADC функция (аналогово-цифров преобразувател), но няма ЦАП (цифрово-аналогов преобразувател). Той има 10-битов ЦАП във вътрешен АЦП, но този ЦАП не може да се използва като самостоятелен. Така че тук в този урок за DAC на Arduino използваме допълнителна платка, наречена MCP4725 DAC модул с Arduino.
ЦАП модул MCP4725 (цифрово-аналогов преобразувател)
MCP4725 IC е 12-битов цифрово-аналогов преобразуващ модул, който се използва за генериране на изходни аналогови напрежения от (0 до 5V) и се управлява чрез използване на I2C комуникация. Той също така се предлага с вградена енергонезависима памет EEPROM.
Този IC има 12-битова резолюция. Това означава, че използваме (0 до 4096) като вход, за да осигурим изходното напрежение по отношение на еталонното напрежение. Максималното референтно напрежение е 5V.
Формула за изчисляване на изходното напрежение
O / P напрежение = (еталонно напрежение / разделителна способност) x цифрова стойност
Например, ако използваме 5V като референтно напрежение и нека приемем, че цифровата стойност е 2048. Така че за изчисляване на изхода на ЦАП.
O / P напрежение = (5/4096) x 2048 = 2.5V
Pinout на MCP4725
По-долу е изображението на MCP4725 с ясно посочващи имена на щифтове.
Щипки от MCP4725 |
Използвайте |
ВЪН |
Извежда аналогово напрежение |
GND |
GND за изход |
SCL |
Линия за сериен часовник I2C |
SDA |
Линия за серийни данни на I2C |
VCC |
Входно референтно напрежение 5V или 3.3V |
GND |
GND за вход |
I2C комуникация в MCP4725 ЦАП
Този DAC IC може да бъде свързан с всеки микроконтролер, използващ комуникацията I2C. I2C комуникацията изисква само два проводника SCL и SDA. По подразбиране I2C адресът за MCP4725 е 0x60 или 0x61 или 0x62. За мен си 0x61. Използвайки I2C шина, можем да свържем множество MCP4725 DAC IC. Единственото нещо е, че трябва да сменим I2C адреса на IC. I2C комуникацията в Arduino вече е обяснена подробно в предишния урок.
В този урок ще свържем IC на MCP4725 ЦАП с Arduino Uno и ще предоставим аналогова входна стойност на Arduino pin A0 с помощта на потенциометър. Тогава ADC ще се използва за преобразуване на аналогова стойност в цифрова форма. След това тези цифрови стойности се изпращат към MCP4725 чрез I2C шина, за да се преобразуват в аналогови сигнали, като се използва DAC MCP4725 IC. Arduino pin A1 се използва за проверка на аналоговия изход на MCP4725 от pin OUT и накрая показва както ADC & DAC стойностите, така и напреженията в LCD дисплея 16x2.
Необходими компоненти
- Arduino Nano / Arduino Uno
- 16x2 LCD дисплеен модул
- MCP4725 ЦАП IC
- 10k потенциометър
- Макет
- Джъмперни проводници
Електрическа схема
По-долу таблицата показва връзката между MCP4725 DAC IC, Arduino Nano и Multi-meter
MCP4725 |
Arduino Nano |
Мултиметър |
SDA |
A4 |
NC |
SCL |
A5 |
NC |
A0 или OUT |
А1 |
+ ve терминал |
GND |
GND |
-ve терминал |
VCC |
5V |
NC |
Връзка между 16x2 LCD и Arduino Nano
LCD 16x2 |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
От централния щифт на потенциометъра за регулиране на контраста на LCD |
RS |
D2 |
RW |
GND |
Е. |
D3 |
D4 |
D4 |
D5 |
D5 |
D6 |
D6 |
D7 |
D7 |
A |
+ 5V |
К |
GND |
Използва се потенциометър с централен щифт, свързан към аналогов вход A0 на Arduino Nano, ляв щифт, свързан към GND и най-десният щифт, свързан към 5V на Arduino.
Програмиране на DAC Arduino
Пълният код на Arduino за DAC урок е даден в края с демонстрационно видео. Тук обяснихме кода ред по ред.
Първо, включете библиотеката за I2C и LCD, използвайки библиотека wire.h и liquidcrystal.h.
#include
След това дефинирайте и инициализирайте LCD щифтовете според щифтовете, които сме свързали с Arduino Nano
LCD LiquidCrystal (2,3,4,5,6,7); // Определяне на щифтове за LCD дисплей RS, E, D4, D5, D6, D7
След това дефинирайте I2C адреса на IC DAC на MCP4725
#define MCP4725 0x61
В настройката за празнота ()
Първо започнете комуникацията I2C на щифтовете A4 (SDA) и A5 (SCL) на Arduino Nano
Wire.begin (); // Започва комуникацията I2C
След това настройте LCD дисплея в режим 16x2 и изведете приветствено съобщение.
lcd.begin (16,2); // Задава LCD в режим 16X2 lcd.print ("CIRCUIT DIGEST"); забавяне (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Arduino"); lcd.setCursor (0,1); lcd.print ("ЦАП с MCP4725"); забавяне (2000); lcd.clear ();
В цикъла void ()
1. Първо в буфера поставете контролната байтова стойност (0b01000000)
(010-Задава MCP4725 в режим на запис)
буфер = 0b01000000;
2. Следващото изявление чете аналоговата стойност от щифт A0 и я преобразува в цифрови стойности (0-1023). Arduino ADC е 10-битова разделителна способност, така че умножете го с 4 дава: 0-4096, тъй като ЦАП е 12-битова разделителна способност.
adc = analogRead (A0) * 4;
3. Това твърдение е да се намери напрежението от входната стойност на ADC (0 до 4096) и референтното напрежение като 5V
float ipvolt = (5.0 / 4096.0) * adc;
4. Под първия ред поставя най-значимите битови стойности в буфера, като измества 4 бита надясно в променливата ADC, а вторият ред поставя най-малко значимите битови стойности в буфера, като премества 4 бита наляво в променливата ADC.
буфер = adc >> 4; буфер = adc << 4;
5. Следващото изявление чете аналогово напрежение от A1, което е изходът на ЦАП (изходният извод на MCP4725 DAC IC). Този щифт може също да бъде свързан към мултицет, за да се провери изходното напрежение. Научете как да използвате мултицет тук.
неподписан int analogread = analogRead (A1) * 4;
6. Освен това стойността на напрежението от променливия аналогов четец се изчислява, като се използва формулата по-долу
float opvolt = (5.0 / 4096.0) * аналогово четене;
7. Следният оператор се използва за започване на предаването с MCP4725
Wire.beginTransmission (MCP4725);
Изпраща контролния байт към I2C
Wire.write (буфер);
Изпраща MSB към I2C
Wire.write (буфер);
Изпраща LSB към I2C
Wire.write (буфер);
Завършва предаването
Wire.endTransmission ();
Сега най-накрая покажете тези резултати на LCD 16x2 дисплея с помощта на lcd.print ()
lcd.setCursor (0,0); lcd.print ("A IP:"); lcd.print (adc); lcd.setCursor (10,0); lcd.print ("V:"); lcd.print (ipvolt); lcd.setCursor (0,1); lcd.print ("D OP:"); lcd.print (analogread); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); забавяне (500); lcd.clear ();
Цифрово в аналогово преобразуване с помощта на MCP4725 и Arduino
След като завършите всички верижни връзки и качите кода в Arduino, променете потенциометъра и гледайте изхода на LCD . Първият ред на LCD ще покаже входящата стойност на ADC и напрежението, а вторият ред ще покаже изходната стойност на ЦАП и напрежението.
Можете също да проверите изходното напрежение, като свържете мултицет към извода OUT и GND на MCP4725.
Ето как можем да конвертираме цифрови стойности в аналогови чрез свързване на DAC модул MCP4725 с Arduino.