0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用MCP4725与Arduino连接来将数字值转换为模拟值的方法

科技观察员 来源:circuitdigest 作者:Pramoth Thangavel 2022-09-20 15:33 次阅读

我们都知道微控制器只能处理数字值,但在现实世界中我们必须处理模拟信号。这就是为什么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 的图像,清楚地标明了引脚名称。

poYBAGMpbCGAD5ZhAAFYysmWS00441.pngpYYBAGMpbByAD4wsAAAXYSDVsx0077.png

MCP4725 DAC 中的 I2C 通信

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

poYBAGMpbBaAG-hEAAAYHH6Maf4861.png

在本教程中,我们将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 电位器

面包板

跳线

电路原理

pYYBAGMpbBCADHQEAAF8qs6EDHI016.png

下表显示了 MCP4725 DAC IC、Arduino Nano 和万用表之间的连接

poYBAGMpbA2AZ8yPAAATMKTgrZ0338.png

16x2 LCD 和 Arduino Nano 之间的连接

pYYBAGMpbAmAAPNKAAAcx5tmmvo516.png

使用电位器,中心引脚连接到 Arduino Nano 的 A0 模拟输入,左侧引脚连接到 GND,最右侧引脚连接到 Arduino 的 5V。

poYBAGMpbASAR0laAAR0wK8fJ_k604.png

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 引脚来检查输出电压。

poYBAGMpa_yAb45gAAaiV9F__GU239.png

#include //包含用于使用 I2C 功能的 Wire 库

#include //包含用于使用 LCD 显示功能的 LCD 库


#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
    adc
    +关注

    关注

    97

    文章

    6384

    浏览量

    543677
  • 模数转换器
    +关注

    关注

    26

    文章

    3082

    浏览量

    126694
  • Arduino
    +关注

    关注

    187

    文章

    6456

    浏览量

    186470
收藏 人收藏

    评论

    相关推荐

    MCP4725单通道数模转换器的驱动设计与实现

    在产品设计过程中,我们经常会遇到数模转换的应用需求。在本篇种我们就来讨论一下MCP4725单通道数模转换器的驱动设计与实现。
    发表于 12-07 10:14 4220次阅读
    <b class='flag-5'>MCP4725</b>单通道数模<b class='flag-5'>转换</b>器的驱动设计与实现

    EasyEDA开源硬件——I2C数字模拟转换器模块(MCP4725

    from a microcontroller, the MCP4725 is the DAC that will let you do it! The MCP4725 is an I2C
    发表于 02-15 10:18

    如何ascii字符转换为十进制

    只显示一行小方框,可能暗示有损坏/空数据。如果有人能给我指出正确的方向,如何最好地ascii字符转换为十进制,那就太好了……注意,我想把它保持为一个数组,因为现在我仍然需要将NMEA格式的坐标
    发表于 09-05 14:19

    基于Arduino Nano的MCP4725模块简介

    MCP4725模块 数字模拟输出测试-基于Arduino NanoMCP4725 模块简介单通道(1路DA输出)12位分辨率I2C 接口(
    发表于 07-26 06:23

    关于MCP4725模块的知识点总结的太棒了

    关于MCP4725模块的知识点总结的太棒了
    发表于 09-27 07:06

    arduino atmega328P MCP4725 proteus仿真程序分享

    #include/* Include the Wire library toI2C *//* This is the I2C Address of the MCP4725, by default
    发表于 12-03 06:15

    MCP4725 pdf datasheet

    The MCP4725 is a low-power, high accuracy, singlechannel, 12-bit buffered voltage output
    发表于 08-07 12:54 54次下载

    基于MCP4725带 EEPROM 存储器的 12 位数模转换

    MCP4725 是低功耗、高精度、单通道的 12 位缓冲电压 输出数模转换器(Digital-to-Analog Convertor, DAC),具有非易失性存储器(EEPROM)。其片上精 密输出放大器使其能够达到轨到轨模拟
    发表于 06-28 14:22 32次下载
    基于<b class='flag-5'>MCP4725</b>带 EEPROM 存储器的 12 位数模<b class='flag-5'>转换</b>器

    MCP4725 PICtail Plus子板开发工具的详细中文资料概述

    本文档介绍了如何使用 MCP4725 PICtail™ Plus 子板开发工具在目标电路板上仿真和调试固件。
    发表于 06-13 10:27 26次下载

    12位数码转换MCP4725 模块 支持I2C 控制的DAC

    12位数码转换MCP4725 模块 支持I2C 控制的DAC(电脑电源配合)-12位数码转换MCP4725 模块,支持I2C 控制的DAC
    发表于 07-26 14:04 44次下载
    12位数码<b class='flag-5'>转换</b>器<b class='flag-5'>MCP4725</b> 模块 支持I2C 控制的DAC

    arduino atmega328P MCP4725 proteus 仿真 程序

    of the MCP4725, by default (A0 pulled to GND). */#define MCP4725_ADDR 0x60/* For devices with A0
    发表于 11-23 17:51 7次下载
    <b class='flag-5'>arduino</b> atmega328P <b class='flag-5'>MCP4725</b>  proteus  仿真 程序

    MSP432 P401R 单片机 呼吸灯 PWM MCP 4725 DAC

    arduino上的MCP4725实验:https://blog.csdn.net/x1131230123/article/details/109365296MSP430上的MCP4725实验
    发表于 12-16 16:54 21次下载
    MSP432 P401R 单片机 呼吸灯 PWM <b class='flag-5'>MCP</b> <b class='flag-5'>4725</b> DAC

    Σ−Δ模数转换器(SDADC)用于模拟信号转换为数字

    Σ−Δ 模数转换器(SDADC)用于模拟信号转换为数字。SDADC 在 1ksps 采样率下
    的头像 发表于 02-28 10:36 6034次阅读

    基于MCP4725 DAC设计一个使用Raspberry Pi的数模转换

    今天我们将使用相同的 MCP4725 DAC IC 来设计一个 使用 Raspberry Pi 的数模转换器。假设您已经在 Raspberry PI 上安装了最新的操作系统,并且可以通过 SSH 访问它。
    发表于 09-07 16:20 2266次阅读
    基于<b class='flag-5'>MCP4725</b> DAC设计一个使用Raspberry Pi的数模<b class='flag-5'>转换</b>器

    基于MCP4725设计使用STM32F103C8的数模转换

    今天我们将使用相同的 MCP4725 DAC IC 来设计一个使用 STM32F103C8 微控制器的数模转换器。
    发表于 09-08 15:24 4456次阅读
    基于<b class='flag-5'>MCP4725</b>设计使用STM32F103C8的数模<b class='flag-5'>转换</b>器