我们都知道微控制器只能处理数字值,但在现实世界中我们必须处理模拟信号。这就是为什么ADC(模数转换器)可以将现实世界的模拟值转换为数字形式,以便微控制器可以处理信号。但是,如果我们需要来自数字值的模拟信号怎么办,那么就来了DAC(数模转换器)。
数模转换器的一个简单示例是在录音室录制歌曲,艺术家歌手正在使用麦克风唱歌。这些模拟声波被转换为数字形式,然后存储在数字格式文件中,当使用存储的数字文件播放歌曲时,这些数字值被转换为模拟信号用于扬声器输出。所以在这个系统中使用了 DAC。
DAC 可用于许多应用,例如电机控制、控制 LED 灯的亮度、音频放大器、视频编码器、数据采集系统等。
在许多微控制器中,都有一个可用于产生模拟输出的内部 DAC。但是 ATmega328/ATmega168 等 Arduino 处理器没有内置 DAC。Arduino 具有 ADC 功能(模数转换器),但它没有 DAC(数模转换器)。它在内部 ADC 中有一个 10 位 DAC,但该 DAC 不能单独使用。所以在这个 Arduino DAC 教程中,我们使用了一个名为MCP4725 DAC 模块的附加板和 Arduino。
MCP4725 DAC 模块(数模转换器)
MCP4725 IC 是一款12 位数模转换器模块,用于生成(0 至 5V)的输出模拟电压,并通过I2C 通信进行控制。它还带有板载非易失性存储器 EEPROM。
该 IC 具有 12 位分辨率。这意味着我们使用(0 到 4096)作为输入来提供相对于参考电压的电压输出。最大参考电压为 5V。
计算输出电压的公式
O/P 电压 = (参考电压/分辨率) x 数字值
例如,如果我们使用 5V 作为参考电压,假设数字值为 2048。因此要计算 DAC 输出。
O/P 电压 = (5/ 4096) x 2048 = 2.5V
MCP4725的引脚排列
下面是 MCP4725 的图像,清楚地标明了引脚名称。


MCP4725 DAC 中的 I2C 通信
该 DAC IC 可通过 I2C 通信与任何微控制器连接。I2C 通信只需要两条线 SCL 和 SDA。默认情况下,MCP4725 的 I2C 地址为 0x60 或 0x61 或 0x62。对我来说它是 0x61。使用 I2C 总线,我们可以连接多个 MCP4725 DAC IC。唯一的事情是我们需要更改 IC 的 I2C 地址。Arduino中的 I2C 通信已在之前的教程中详细解释过。

在本教程中,我们将MCP4725 DAC IC 与 Arduino Uno 连接,并使用电位计为 Arduino 引脚 A0 提供模拟输入值。然后ADC将用于将模拟值转换为数字形式。之后,这些数字值通过 I2C 总线发送到 MCP4725,以使用 DAC MCP4725 IC 转换为模拟信号。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 模拟输入,左侧引脚连接到 GND,最右侧引脚连接到 Arduino 的 5V。

DAC Arduino 编程
DAC 教程的完整 Arduino 代码在最后附有演示视频。这里我们逐行解释了代码。
首先,使用wire.h和liquidcrystal.h库包含I2C 和LCD库。
#include#include
接下来根据我们与 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 显示屏设置为 16x2 模式并显示欢迎信息。
lcd.开始(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 的 DAC");
延迟(2000);
lcd.clear();
在无效循环()
1.首先在buffer[0]中放入控制字节值(0b01000000)
(010-将 MCP4725 设置为写模式)
缓冲区[0] = 0b01000000;
2. 以下语句从引脚 A0 读取模拟值并将其转换为数字值(0-1023)。Arduino ADC 是 10 位分辨率,因此将其乘以 4 得出:0-4096,因为 DAC 是 12 位分辨率。
adc = 模拟读取(A0)* 4;
3.此语句是从ADC输入值(0到4096)和参考电压为5V求电压
浮动 ipvolt = (5.0/4096.0)* adc;
4. 第一行下方通过在 ADC 变量中向右移动 4 位将最高有效位值放入缓冲区 [1],第二行通过在 ADC 变量中向左移动 4 位将最低有效位值放入缓冲区 [2]。
缓冲区[1] = adc >> 4; 缓冲区[2] = adc << 4;
5. 以下语句从作为 DAC 输出(MCP4725 DAC IC 的 OUTPUT 引脚)的 A1 读取模拟电压。该引脚也可以连接到万用表以检查输出电压。在此处了解如何使用万用表。
无符号 int 类比读取 = 类比读取(A1)*4 ;
6. 此外,变量analogread的电压值使用以下公式计算
浮动 opvolt = (5.0/4096.0)* 模拟读数;
7. 以下语句用于开始使用 MCP4725 进行传输
Wire.beginTransmission(MCP4725);
将控制字节发送到 I2C
Wire.write(buffer[0]);
将 MSB 发送到 I2C
Wire.write(buffer[1]);
将 LSB 发送到 I2C
Wire.write(buffer[2]);
结束传输
Wire.endTransmission();
现在最后使用 lcd.print() 在 LCD 16x2 显示器中显示这些结果
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 进行数模转换
完成所有电路连接并将代码上传到 Arduino 后,改变电位器并观察 LCD 上的输出。LCD 第一行显示输入 ADC 值和电压,第二行显示输出 DAC 值和电压。
您还可以通过将万用表连接到 MCP4725 的 OUT 和 GND 引脚来检查输出电压。

#include
#include
#define MCP4725 0x61 //MCP4725 地址为 0x61 相应地更改你
的 LiquidCrystal lcd(2,3,4,5,6,7); //定义LCD显示引脚RS,E,D4,D5,D6,D7
unsigned int adc;
字节缓冲区[3];
void setup()
{
Wire.begin(); //开始 I2C 通信
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 的 DAC");
延迟(2000);
lcd.clear();
}
无效循环()
{
缓冲区[0] = 0b01000000;//使用控制字节设置缓冲区0(010-设置为写入模式)
adc = analogRead(A0) * 4; //从引脚 A0 读取模拟值并转换为数字 (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]); //发送控制字节到I2C
Wire.write(buffer[1]); //将 MSB 发送到 I2C
Wire.write(buffer[2]); //发送LSB到I2C
Wire.endTransmission(); //结束传输
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
+关注
关注
100文章
7943浏览量
556859 -
模数转换器
+关注
关注
26文章
4099浏览量
130250 -
Arduino
+关注
关注
190文章
6527浏览量
197431
发布评论请先 登录
MCP4725单通道数模转换器的驱动设计与实现
EasyEDA开源硬件——I2C数字模拟转换器模块(MCP4725)
如何将ascii字符转换为十进制值
基于Arduino Nano的MCP4725模块简介
arduino atmega328P MCP4725 proteus仿真程序分享
MCP4725 pdf datasheet
基于MCP4725带 EEPROM 存储器的 12 位数模转换器
MCP4725 PICtail Plus子板开发工具的详细中文资料概述
12位数码转换器MCP4725 模块 支持I2C 控制的DAC
arduino atmega328P MCP4725 proteus 仿真 程序
MSP432 P401R 单片机 呼吸灯 PWM MCP 4725 DAC
Σ−Δ模数转换器(SDADC)用于将模拟信号转换为数字值
基于MCP4725 DAC设计一个使用Raspberry Pi的数模转换器
基于MCP4725设计使用STM32F103C8的数模转换器
用MCP4725与Arduino连接来将数字值转换为模拟值的方法
评论