| 我们都知道微控制器只能使用数字量,但在现实世界中有很多模拟信号需要处理。这就是为什么使用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) |