我们都知道微控制器只能使用数字量,但在现实世界中有很多模拟信号需要处理。这就是为什么使用ADC(模数转换器Analog to Digital Converters)将现实世界的模拟量转换为数字量,以便微控制器可以处理这些信号。但是,如果我们需要将数字量转换成模拟信号,那么就需要DAC(数模转换器)。
使用数字转模拟转换器的简单示例是在工作室中录制一首歌曲,歌手使用麦克风唱歌。这些模拟声波被转换成数字形式,然后存储在数字格式文件中,当使用存储的数字文件播放歌曲时,这些数字值被转换成用于扬声器输出的模拟信号。所以在这个系统中使用DAC。
DAC可用于许多应用,如电机控制、LED灯的控制亮度、音频放大器、视频编码器、数据采集系统等。
在许多微控制器中,内部会有一个DAC可用于产生模拟输出。但是ATmega328 / ATmega168等Arduino处理器没有内置DAC。 Arduino具有ADC功能(模数转换器),但没有DAC(数模转换器)。它在内部ADC中有一个10位DAC,但该DAC不能单独使用。所以在这个Arduino DAC教程中,我们使用一个名为MCP4725 DAC模块的扩展电路板。
MCP4725 DAC模块(数模转换器) MCP4725 IC是一款12位数模转换器模块,用于产生(0至5V)输出模拟电压,并通过I2C通信进行控制。它还带有板载非易失性存储器EEPROM。
该IC具有12位分辨率。这意味着我们使用(0到4096)作为输入来提供相对于参考电压的电压输出。最大参考电压为5V。
计算输出电压的公式 - O/P Voltage = (Reference Voltage / Resolution) x Digital Value
复制代码例如,如果我们使用5V作为参考电压,并假设数字值为2048。那么计算DAC输出。 - O/P Voltage = (5/ 4096) x 2048 = 2.5V
复制代码
MCP4725的引脚说明 以下MCP4725的图像清楚地显示了各个引脚名称。
MCP4725的引脚 | 用途 | OUT | 输出模拟电压 | GND | GND用于输出 | SCL | I2C串行时钟线 | SDA | I2C串行数据线 | VCC | 输入参考电压5V或3.3V | GND | GND用于输入 |
MCP4725 DAC中的I2C通信 该DAC IC可以使用I2C通信与任何微控制器连接。 I2C通信仅需要两条线SCL和SDA。默认情况下,MCP4725的I2C地址为0x60或0x61或0x62。我使用的这个电路板的地址是0x61。使用I2C总线,我们可以连接多个MCP4725 DAC IC。唯一的问题是我们需要更改IC的I2C地址。
在本篇文章中,我们将使用Arduino Uno开发板连接MCP4725 DAC IC,并使用电位计为Arduino引脚A0提供模拟输入值。然后ADC将用于将模拟值转换为数字形式。之后,这些数字值通过I2C总线发送到MCP4725,并使用DAC MCP4725 IC转换为模拟信号。 Arduino引脚A1用于从引脚OUT检查MCP4725的模拟输出,最后在1602 LCD显示屏中显示ADC和DAC值以及电压。
所需的组件 ● Arduino Nano / Arduino Uno开发板 ● 1602 LCD显示模块 ● MCP4725 DAC IC ● 10k电位器 ● 面包板 ● 跳线
电路原理图
下表显示了MCP4725 DAC IC、Arduino Nano和万用表之间的连接 MCP4725 | Arduino Nano
| 万用表
| SDA | A4
| NC | SCL | A5 | NC | A0或OUT | A1 | + ve终端 | GND | GND | -ve终端 | VCC | 5V | NC |
将电位器的中间引脚连接到Arduino Nano的A0模拟输入,左侧引脚连接到GND,右侧引脚连接到Arduino的5V。
DAC Arduino编程 在本文末尾处给出了完整的Arduino代码。这里我们逐行解释代码。
首先,使用wire.h和liquidcrystal.h库包含I2C和LCD库。 - #include<Wire.h>
- #include <LiquidCrystal.h>
复制代码接下来根据我们与Arduino Nano连接的引脚定义并初始化LCD引脚 - LiquidCrystal lcd(2,3,4,5,6,7); //Define LCD display pins RS,E,D4,D5,D6,D7
复制代码接下来定义MCP4725 DAC IC的I2C地址
在void setup()函数中,首先在Arduino Nano的引脚A4(SDA)和A5(SCL)上开始I2C通信: - Wire.begin(); //Begins the I2C communication
复制代码接下来将LCD显示器设置为1602模式并显示欢迎信息。 - lcd.begin(16,2); //Sets LCD in 16X2 Mode
- lcd.print("CIRCUIT DIGEST");
- delay(1000);
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("Arduino");
- lcd.setCursor(0,1);
- lcd.print("DAC with MCP4725");
- delay(2000);
- lcd.clear();
复制代码
在void loop()函数中, 1. 首先在缓冲区[0]中输入控制字节值(0b01000000),(010-将MCP4725设置为写入模式) 2. 以下代码从引脚A0读取模拟值并将其转换为数字值(0-1023)。 Arduino ADC的分辨率为10位,因此乘以4得出:0-4096,因为DAC的分辨率为12位。 - adc = analogRead(A0) * 4;
复制代码3. 接下来的代码用于从ADC输入值(0至4096)和参考电压5V中得到相应的电压 - float ipvolt = (5.0/4096.0)* adc;
复制代码4. 下面的第一行代码通过在ADC变量中将4位向右移位来将最高有效位值置于缓冲器[1]中,第二行通过在ADC变量中将4位向左移位来将最低有效位值置于缓冲器[2]中。 - buffer[1] = adc >> 4;
- buffer[2] = adc << 4;
复制代码5. 以下语句读取A1输出的模拟电压,即DAC输出(MCP4725 DAC IC的OUTPUT引脚)。此引脚也可以连接到万用表以检查输出电压。 - unsigned int analogread = analogRead(A1)*4 ;
复制代码6. 此外,使用下面的公式基于analogread计算电压值 - float opvolt = (5.0/4096.0)* analogread;
复制代码7. 以下代码用于开始使用MCP4725进行传输 - Wire.beginTransmission(MCP4725);
复制代码将控制字节发送到I2C 将MSB发送到I2C 将LSB发送到I2C 结束传输
最后使用lcd.print()在LCD 1602显示屏上显示这些结果 - 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);
- delay(500);
- lcd.clear();
复制代码
使用MCP4725和Arduino进行数模转换 完成所有电路连接并将代码上传到Arduino后,变换电位器并观察LCD上的输出。第一行LCD将显示输入ADC值和电压,第二行将显示输出DAC值和电压。
您还可以通过将万用表连接到MCP4725的OUT和GND引脚来检查输出电压。
以上就是我们如何通过DAC模块MCP4725与Arduino连接来实现将数字值转换为模拟值。
代码 本文使用的完整代码如下:
main.rar
(914 Bytes, 下载次数: 138)
|