我們都知道微控制器只能處理數(shù)字值,但在現(xiàn)實(shí)世界中我們必須處理模擬信號(hào)。這就是為什么ADC(模數(shù)轉(zhuǎn)換器)可以將現(xiàn)實(shí)世界的模擬值轉(zhuǎn)換為數(shù)字形式,以便微控制器可以處理信號(hào)。但是,如果我們需要來自數(shù)字值的模擬信號(hào)怎么辦,那么就來了DAC(數(shù)模轉(zhuǎn)換器)。
數(shù)模轉(zhuǎn)換器的一個(gè)簡單示例是在錄音室錄制歌曲,藝術(shù)家歌手正在使用麥克風(fēng)唱歌。這些模擬聲波被轉(zhuǎn)換為數(shù)字形式,然后存儲(chǔ)在數(shù)字格式文件中,當(dāng)使用存儲(chǔ)的數(shù)字文件播放歌曲時(shí),這些數(shù)字值被轉(zhuǎn)換為模擬信號(hào)用于揚(yáng)聲器輸出。所以在這個(gè)系統(tǒng)中使用了 DAC。
DAC 可用于許多應(yīng)用,例如電機(jī)控制、控制 LED 燈的亮度、音頻放大器、視頻編碼器、數(shù)據(jù)采集系統(tǒng)等。
在許多微控制器中,都有一個(gè)可用于產(chǎn)生模擬輸出的內(nèi)部 DAC。但是 ATmega328/ATmega168 等 Arduino 處理器沒有內(nèi)置 DAC。Arduino 具有 ADC 功能(模數(shù)轉(zhuǎn)換器),但它沒有 DAC(數(shù)模轉(zhuǎn)換器)。它在內(nèi)部 ADC 中有一個(gè) 10 位 DAC,但該 DAC 不能單獨(dú)使用。所以在這個(gè) Arduino DAC 教程中,我們使用了一個(gè)名為MCP4725 DAC 模塊的附加板和 Arduino。
MCP4725 DAC 模塊(數(shù)模轉(zhuǎn)換器)
MCP4725 IC 是一款12 位數(shù)模轉(zhuǎn)換器模塊,用于生成(0 至 5V)的輸出模擬電壓,并通過I2C 通信進(jìn)行控制。它還帶有板載非易失性存儲(chǔ)器 EEPROM。
該 IC 具有 12 位分辨率。這意味著我們使用(0 到 4096)作為輸入來提供相對(duì)于參考電壓的電壓輸出。最大參考電壓為 5V。
計(jì)算輸出電壓的公式
O/P 電壓 = (參考電壓/分辨率) x 數(shù)字值
例如,如果我們使用 5V 作為參考電壓,假設(shè)數(shù)字值為 2048。因此要計(jì)算 DAC 輸出。
O/P 電壓 = (5/ 4096) x 2048 = 2.5V
MCP4725的引腳排列
下面是 MCP4725 的圖像,清楚地標(biāo)明了引腳名稱。
MCP4725 DAC 中的 I2C 通信
該 DAC IC 可通過 I2C 通信與任何微控制器連接。I2C 通信只需要兩條線 SCL 和 SDA。默認(rèn)情況下,MCP4725 的 I2C 地址為 0x60 或 0x61 或 0x62。對(duì)我來說它是 0x61。使用 I2C 總線,我們可以連接多個(gè) MCP4725 DAC IC。唯一的事情是我們需要更改 IC 的 I2C 地址。Arduino中的 I2C 通信已在之前的教程中詳細(xì)解釋過。
在本教程中,我們將MCP4725 DAC IC 與 Arduino Uno 連接,并使用電位計(jì)為 Arduino 引腳 A0 提供模擬輸入值。然后ADC將用于將模擬值轉(zhuǎn)換為數(shù)字形式。之后,這些數(shù)字值通過 I2C 總線發(fā)送到 MCP4725,以使用 DAC MCP4725 IC 轉(zhuǎn)換為模擬信號(hào)。Arduino 引腳 A1 用于從引腳 OUT 檢查 MCP4725 的模擬輸出,最后在16x2 LCD 顯示屏上顯示 ADC 和 DAC 值和電壓。
所需組件
Arduino Nano / Arduino Uno
16x2液晶顯示模塊
MCP4725 DAC集成電路
10k 電位器
面包板
跳線
電路原理圖
下表顯示了 MCP4725 DAC IC、Arduino Nano 和萬用表之間的連接
16x2 LCD 和 Arduino Nano 之間的連接
使用電位器,中心引腳連接到 Arduino Nano 的 A0 模擬輸入,左側(cè)引腳連接到 GND,最右側(cè)引腳連接到 Arduino 的 5V。
DAC Arduino 編程
DAC 教程的完整 Arduino 代碼在最后附有演示視頻。這里我們逐行解釋了代碼。
首先,使用wire.h和liquidcrystal.h庫包含I2C 和LCD庫。
#include#include
接下來根據(jù)我們與 Arduino Nano 連接的引腳定義和初始化 LCD 引腳
液晶液晶(2,3,4,5,6,7); //定義LCD顯示引腳RS,E,D4,D5,D6,D7
接下來定義 MCP4725 DAC IC 的 I2C 地址
#define MCP4725 0x61
在 void setup()
首先在 Arduino Nano 的引腳 A4 (SDA) 和 A5 (SCL) 開始 I2C 通信
Wire.begin(); //開始I2C通信
接下來將 LCD 顯示屏設(shè)置為 16x2 模式并顯示歡迎信息。
lcd.開始(16,2);//將 LCD 設(shè)置為 16X2 模式 lcd.print("CIRCUIT DIGEST"); 延遲(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Arduino"); lcd.setCursor(0,1); lcd.print("帶有 MCP4725 的 DAC"); 延遲(2000); lcd.clear();
在無效循環(huán)()
1.首先在buffer[0]中放入控制字節(jié)值(0b01000000)
(010-將 MCP4725 設(shè)置為寫模式)
緩沖區(qū)[0] = 0b01000000;
2. 以下語句從引腳 A0 讀取模擬值并將其轉(zhuǎn)換為數(shù)字值(0-1023)。Arduino ADC 是 10 位分辨率,因此將其乘以 4 得出:0-4096,因?yàn)?DAC 是 12 位分辨率。
adc = 模擬讀取(A0)* 4;
3.此語句是從ADC輸入值(0到4096)和參考電壓為5V求電壓
浮動(dòng) ipvolt = (5.0/4096.0)* adc;
4. 第一行下方通過在 ADC 變量中向右移動(dòng) 4 位將最高有效位值放入緩沖區(qū) [1],第二行通過在 ADC 變量中向左移動(dòng) 4 位將最低有效位值放入緩沖區(qū) [2]。
緩沖區(qū)[1] = adc >> 4; 緩沖區(qū)[2] = adc << 4;
5. 以下語句從作為 DAC 輸出(MCP4725 DAC IC 的 OUTPUT 引腳)的 A1 讀取模擬電壓。該引腳也可以連接到萬用表以檢查輸出電壓。在此處了解如何使用萬用表。
無符號(hào) int 類比讀取 = 類比讀取(A1)*4 ;
6. 此外,變量analogread的電壓值使用以下公式計(jì)算
浮動(dòng) opvolt = (5.0/4096.0)* 模擬讀數(shù);
7. 以下語句用于開始使用 MCP4725 進(jìn)行傳輸
Wire.beginTransmission(MCP4725);
將控制字節(jié)發(fā)送到 I2C
Wire.write(buffer[0]);
將 MSB 發(fā)送到 I2C
Wire.write(buffer[1]);
將 LSB 發(fā)送到 I2C
Wire.write(buffer[2]);
結(jié)束傳輸
Wire.endTransmission();
現(xiàn)在最后使用 lcd.print() 在 LCD 16x2 顯示器中顯示這些結(jié)果
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(模擬讀取); lcd.setCursor(10,1); lcd.print("V:"); lcd.print(opvolt); 延遲(500); lcd.clear();
使用 MCP4725 和 Arduino 進(jìn)行數(shù)模轉(zhuǎn)換
完成所有電路連接并將代碼上傳到 Arduino 后,改變電位器并觀察 LCD 上的輸出。LCD 第一行顯示輸入 ADC 值和電壓,第二行顯示輸出 DAC 值和電壓。
您還可以通過將萬用表連接到 MCP4725 的 OUT 和 GND 引腳來檢查輸出電壓。
#include
#include
#define MCP4725 0x61 //MCP4725 地址為 0x61 相應(yīng)地更改你
的 LiquidCrystal lcd(2,3,4,5,6,7); //定義LCD顯示引腳RS,E,D4,D5,D6,D7
unsigned int adc;
字節(jié)緩沖區(qū)[3];
void setup()
{
Wire.begin(); //開始 I2C 通信
lcd.begin(16,2); //將 LCD 設(shè)置為 16X2 模式
lcd.print("CIRCUIT DIGEST");
延遲(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Arduino");
lcd.setCursor(0,1);
lcd.print("帶有 MCP4725 的 DAC");
延遲(2000);
lcd.clear();
}
無效循環(huán)()
{
緩沖區(qū)[0] = 0b01000000;//使用控制字節(jié)設(shè)置緩沖區(qū)0(010-設(shè)置為寫入模式)
adc = analogRead(A0) * 4; //從引腳 A0 讀取模擬值并轉(zhuǎn)換為數(shù)字 (0-1023) 乘以 4 得到 (0-4096)
float ipvolt = (5.0/4096.0)* adc; //求電壓公式(A0)
buffer[1] = adc >> 4; //放置最高有效位值
buffer[2] = adc << 4; //輸入最低有效位值
unsigned int analogread = analogRead(A1)*4 ; //從 A1 讀取模擬電壓
float opvolt = (5.0/4096.0)* analogread; //求電壓公式 (A1)
Wire.beginTransmission(MCP4725); //通過地址為0x61的MCP4725加入I2C總線
Wire.write(buffer[0]); //發(fā)送控制字節(jié)到I2C
Wire.write(buffer[1]); //將 MSB 發(fā)送到 I2C
Wire.write(buffer[2]); //發(fā)送LSB到I2C
Wire.endTransmission(); //結(jié)束傳輸
lcd.setCursor(0,0);
lcd.print("A IP:");
lcd.print(adc); //從A0打印ADC值
lcd.setCursor(10,0);
lcd.print("V:"); //在 A0 打印輸入電壓
lcd.print(ipvolt);
lcd.setCursor(0,1);
lcd.print("D OP:");
lcd.print(模擬讀取);//從 A1 (From DAC) 打印 ADC 值
lcd.setCursor(10,1);
lcd.print("V:");
lcd.print(opvolt);
//在 A1(來自 DAC)延遲(500)處打印輸入電壓;
lcd.clear();
}
-
adc
+關(guān)注
關(guān)注
99文章
6567瀏覽量
546720 -
模數(shù)轉(zhuǎn)換器
+關(guān)注
關(guān)注
26文章
3239瀏覽量
127281 -
Arduino
+關(guān)注
關(guān)注
188文章
6479瀏覽量
188680
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
MCP4725單通道數(shù)模轉(zhuǎn)換器的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

EasyEDA開源硬件——I2C數(shù)字模擬轉(zhuǎn)換器模塊(MCP4725)
如何將ascii字符轉(zhuǎn)換為十進(jìn)制值
基于Arduino Nano的MCP4725模塊簡介
關(guān)于MCP4725模塊的知識(shí)點(diǎn)總結(jié)的太棒了
arduino atmega328P MCP4725 proteus仿真程序分享
MCP4725 pdf datasheet
基于MCP4725帶 EEPROM 存儲(chǔ)器的 12 位數(shù)模轉(zhuǎn)換器

MCP4725 PICtail Plus子板開發(fā)工具的詳細(xì)中文資料概述
12位數(shù)碼轉(zhuǎn)換器MCP4725 模塊 支持I2C 控制的DAC

arduino atmega328P MCP4725 proteus 仿真 程序

MSP432 P401R 單片機(jī) 呼吸燈 PWM MCP 4725 DAC

Σ?Δ模數(shù)轉(zhuǎn)換器(SDADC)用于將模擬信號(hào)轉(zhuǎn)換為數(shù)字值
基于MCP4725 DAC設(shè)計(jì)一個(gè)使用Raspberry Pi的數(shù)模轉(zhuǎn)換器

基于MCP4725設(shè)計(jì)使用STM32F103C8的數(shù)模轉(zhuǎn)換器

評(píng)論