我们都知道微控制器仅适用于数字值,但在现实世界中,我们必须处理模拟信号。这就是为什么使用ADC(模数转换器)将现实世界中的模拟值转换为数字形式以便微控制器可以处理信号的原因。但是,如果我们需要来自数字值的模拟信号怎么办,那么这里就是DAC(数模转换器)。
数模转换器的一个简单示例是在录音棚中录制歌曲,在录音棚中,歌手使用麦克风并唱歌。这些模拟声波被转换为数字形式,然后存储在数字格式的文件中,当使用存储的数字文件播放歌曲时,这些数字值将转换为用于扬声器输出的模拟信号。因此,在此系统中使用了DAC。
DAC可用于许多应用,例如电机控制,LED灯的控制亮度,音频放大器,视频编码器,数据采集系统等。
在许多微控制器中,都有一个内部DAC可用于产生模拟输出。但是像ATmega328 / ATmega168这样的Arduino处理器没有内置DAC。Arduino具有ADC功能(模数转换器),但没有DAC(数模转换器)。它在内部ADC中具有10位DAC,但该DAC不能单独使用。因此,在本Arduino DAC教程中,我们在Arduino上使用了另外一块名为MCP4725 DAC模块的板。
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的引脚 |
采用 |
出 |
输出模拟电压 |
地线 |
GND输出 |
SCL |
I2C串行时钟线 |
SDA |
I2C串行数据线 |
VCC |
输入参考电压5V或3.3V |
地线 |
输入地 |
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纳米/ Arduino Uno
- 16x2 LCD显示模块
- MCP4725 DAC IC
- 10k电位器
- 面包板
- 跳线
电路原理图
下表显示了MCP4725 DAC IC,Arduino Nano和万用表之间的连接
MCP4725 |
Arduino纳米 |
万用表 |
SDA |
A4 |
数控 |
SCL |
A5 |
数控 |
A0或OUT |
A1 |
+ ve终端 |
地线 |
地线 |
-ve终端 |
VCC |
5伏 |
数控 |
16x2 LCD和Arduino Nano之间的连接
液晶屏16x2 |
Arduino纳米 |
VSS |
地线 |
VDD |
+5伏 |
V0 |
从电位计中心引脚调整LCD的对比度 |
RS |
D2 |
读写器 |
地线 |
Ë |
D3 |
D4 |
D4 |
D5 |
D5 |
D6 |
D6 |
D7 |
D7 |
一种 |
+5伏 |
ķ |
地线 |
使用一个电位计,其中心引脚连接到Arduino Nano的A0模拟输入,左侧引脚连接到GND,最右侧引脚连接到Arduino的5V。
DAC Arduino编程
最后,通过演示视频给出了DAC教程的完整Arduino代码。在这里,我们逐行解释了代码。
首先,包括I2C和LCD使用库wire.h和liquidcrystal.h库。
#包括
接下来根据我们与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.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”); delay(2000); lcd.clear();
在void loop()中
1.首先在缓冲区中放入控制字节值(0b01000000)
(010-在写模式下设置MCP4725)
缓冲区= 0b01000000;
2.以下语句从引脚A0读取模拟值并将其转换为数字值(0-1023)。Arduino ADC的分辨率为10位,因此将其乘以4可得出:0-4096,因为DAC为12位分辨率。
adc = AnalogRead(A0)* 4;
3.该语句用于从ADC输入值(0至4096)中找到电压,参考电压为5V
浮动ipvolt =(5.0 / 4096.0)* adc;
4.在第一行下面,通过将ADC变量中的右移4位,将最高有效位值存储在缓冲区中,第二行在ADC变量中,通过向左移4位,将最低有效值存储在缓冲区中。
缓冲区= adc >> 4; 缓冲区= adc << 4;
5.以下语句从A1读取模拟电压,该电压是DAC输出(MCP4725 DAC IC的OUTPUT引脚)。该引脚也可以连接到万用表以检查输出电压。在此处了解如何使用万用表。
unsigned int AnalogicRead =模拟量读取(A1)* 4;
6.此外,使用以下公式计算来自可变 模拟读数 的电压值
浮动电压=(5.0 / 4096.0)*模拟读取;
7.以下语句用于从MCP4725开始传输
Wire.beginTransmission(MCP4725);
将控制字节发送到I2C
Wire.write(缓冲区);
将MSB发送到I2C
Wire.write(缓冲区);
将LSB发送到I2C
Wire.write(缓冲区);
结束传输
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(analogread); lcd.setCursor(10,1); lcd.print(“ V:”); lcd.print(opvolt); 延迟(500); lcd.clear();
使用MCP4725和Arduino进行数模转换
完成所有电路连接并将代码上传到Arduino之后,改变电位器并在LCD上观看输出。LCD的第一行将显示输入ADC值和电压,第二行将显示输出DAC值和电压。
您还可以通过将万用表连接到MCP4725的OUT和GND引脚来检查输出电压。
这就是我们如何通过将DAC模块MCP4725与Arduino接口来将数字值转换为模拟值。