风筝
发表于: 2019-2-23 09:35:26 | 显示全部楼层

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


计算输出电压的公式

  1. O/P Voltage = (Reference Voltage / Resolution) x Digital Value
复制代码

例如,如果我们使用5V作为参考电压,并假设数字值为2048。那么计算DAC输出。

  1. O/P Voltage = (5/ 4096) x 2048 = 2.5V
复制代码

MCP4725的引脚说明

以下MCP4725的图像清楚地显示了各个引脚名称。

Pinout-of-MCP4725.png


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地址。

I2C-Start-Stop-Condition.png

在本篇文章中,我们将使用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电位器

●    面包板

●    跳线


电路原理图

Circuit-Diagram-for-Interfacing-MCP4725-Digital-to-Analog-Converter-with-Arduino.png

下表显示了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。

Circuit-Hardware-for-Interfacing-MCP4725-Digital-to-Analog-Converter-with-Arduino.jpg


DAC Arduino编程

在本文末尾处给出了完整的Arduino代码。这里我们逐行解释代码。


首先,使用wire.hliquidcrystal.h库包含I2C和LCD库。

  1. #include<Wire.h>            
  2. #include <LiquidCrystal.h>
复制代码

接下来根据我们与Arduino Nano连接的引脚定义并初始化LCD引脚

  1. LiquidCrystal lcd(2,3,4,5,6,7); //Define LCD display pins RS,E,D4,D5,D6,D7
复制代码

接下来定义MCP4725 DAC IC的I2C地址

  1. #define MCP4725 0x61
复制代码

void setup()函数中,首先在Arduino Nano的引脚A4(SDA)和A5(SCL)上开始I2C通信:

  1. Wire.begin();       //Begins the I2C communication
复制代码

接下来将LCD显示器设置为1602模式并显示欢迎信息。

  1. lcd.begin(16,2);               //Sets LCD in 16X2 Mode
  2. lcd.print("CIRCUIT DIGEST");   
  3.   delay(1000);
  4.   lcd.clear();
  5.   lcd.setCursor(0,0);
  6.   lcd.print("Arduino");
  7.   lcd.setCursor(0,1);  
  8.   lcd.print("DAC with MCP4725");
  9.   delay(2000);
  10.   lcd.clear();   
复制代码

void loop()函数中,

1.  首先在缓冲区[0]中输入控制字节值(0b01000000),(010-将MCP4725设置为写入模式)

  1. buffer[0] = 0b01000000;              
复制代码

2.  以下代码从引脚A0读取模拟值并将其转换为数字值(0-1023)。 Arduino ADC的分辨率为10位,因此乘以4得出:0-4096,因为DAC的分辨率为12位。

  1. adc = analogRead(A0) * 4;      
复制代码

3.  接下来的代码用于从ADC输入值(0至4096)和参考电压5V中得到相应的电压

  1. float ipvolt = (5.0/4096.0)* adc;
复制代码

4.  下面的第一行代码通过在ADC变量中将4位向右移位来将最高有效位值置于缓冲器[1]中,第二行通过在ADC变量中将4位向左移位来将最低有效位值置于缓冲器[2]中。

  1. buffer[1] = adc >> 4;              
  2. buffer[2] = adc << 4;        
复制代码

5.  以下语句读取A1输出的模拟电压,即DAC输出(MCP4725 DAC IC的OUTPUT引脚)。此引脚也可以连接到万用表以检查输出电压。

  1. unsigned int analogread = analogRead(A1)*4 ;  
复制代码

6.  此外,使用下面的公式基于analogread计算电压值

  1. float opvolt = (5.0/4096.0)* analogread;
复制代码

7.  以下代码用于开始使用MCP4725进行传输

  1. Wire.beginTransmission(MCP4725);   
复制代码

将控制字节发送到I2C

  1. Wire.write(buffer[0]);
复制代码

将MSB发送到I2C

  1. Wire.write(buffer[1]);
复制代码

将LSB发送到I2C

  1. Wire.write(buffer[2]);
复制代码

结束传输

  1. Wire.endTransmission();
复制代码

最后使用lcd.print()在LCD 1602显示屏上显示这些结果

  1. lcd.setCursor(0,0);     
  2. lcd.print("A IP:");
  3.   lcd.print(adc);         
  4.   lcd.setCursor(10,0);
  5.   lcd.print("V:");        
  6.   lcd.print(ipvolt);
  7.   lcd.setCursor(0,1);
  8.   lcd.print("D OP:");
  9.   lcd.print(analogread);   
  10.   lcd.setCursor(10,1);
  11.   lcd.print("V:");
  12.   lcd.print(opvolt);         
  13.   delay(500);
  14.   lcd.clear();   
复制代码

使用MCP4725和Arduino进行数模转换

完成所有电路连接并将代码上传到Arduino后,变换电位器并观察LCD上的输出。第一行LCD将显示输入ADC值和电压,第二行将显示输出DAC值和电压。

Interfacing-MCP4725-Digital-to-Analog-Converter-with-Arduino.jpg

您还可以通过将万用表连接到MCP4725的OUT和GND引脚来检查输出电压。

Testing-MCP4725-Digital-to-Analog-Converter-with-Arduino.jpg

以上就是我们如何通过DAC模块MCP4725与Arduino连接来实现将数字值转换为模拟值。


代码

本文使用的完整代码如下: main.rar (914 Bytes, 下载次数: 138)

跳转到指定楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 21:17 , Processed in 0.041986 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表