我是靠谱客的博主 愉快香氛,最近开发中收集的这篇文章主要介绍Arduino UNO驱动MCP4725 12位数模转换器DAC目录,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Arduino UNO驱动MCP4725 12位数模转换器DAC

  • 目录
    • MCP4725简介
    • 引脚定义与电路原理图
    • Arduino UNO与MCP4725模块接线
    • 程序与实验结果

目录

MCP4725简介

MCP4725是一个12位精度的,单通道缓冲电压输出的DAC,内部集成存储器EEPROM。用户可使用IIC接口命令将数字量电压值输入并配置保存到EEPROM,以便下次上电启动时能立刻输出模拟电压值。6us的快速建立时间,IIC通信接口高速模式可达3.4Mbps。
无需外部提供参考电压(供电电压VCC与参考电压一致),支持3.3~5V宽电压供电,板载I2C地址选择焊点(两个I2C地址0x60或0x61可选),最大支持2个DA模块的级联。虽然主控板要实现模拟量输出可使用PWM模拟,但这种模拟的纹波很大,而且精度不高。如要得到稳定准确的直流电压信号,必须要用DAC。此外,DAC可用于一些有趣的应用,如用作为信号发生器产生正弦波、三角波甚至是任意波形。

引脚定义与电路原理图

在这里插入图片描述
在这里插入图片描述

Arduino UNO与MCP4725模块接线

Arduino UNOMCP4725
VCC5V
GNDGND
SDAA4
SCLA5

MCP4725的信号输出OUT、GND引脚接万用表测试电压或示波器观察输出波形

程序与实验结果

Arduino IDE库管理器搜索安装MCP4725示例程序库,打开上传示例程序到开发板。

在这里插入图片描述

校准与可调模拟电压输出,虽然DAC的电压输出精度受多种因素影响,使实际输出电压与用户所指定电压值产生误差,但MCP4725的DAC参考电压Vref与供电电压VCC相同,供电电压的不准(实际电压并非准确的5.000V或3.300V)往往使输出误差较大。这里提供一种简易的校准方法,消除由于参考电压不准造成的误差。若不进行校准,也可根据所使用的控制器电平将下方代码中的REF_VOLTAGE设为5000(如Arduino等5V控制器)或3300。

用户需要自备一块高精度(3位或以上)数字万用表来完成该校准,使用万用表测量VOUT输出电压并将电压值写入REF_VOLTAGE。如:测得VOUT=4950mV,将“#define REF_VOLTAGE 5000”改为“#define REF_VOLTAGE 4950”。校准完成。在变量OUTPUT_VOLTAGE输入不超过REF_VOLTAGE的指定电压值(单位:mV),即可输出误差较小的模拟输出电压。在使用下面的样例代码前,可先把校准数值写入REF_VOLTAGE,以获得更准确的输出电压。

#include "Wire.h"
#include "DFRobot_MCP4725.h"
#define  REF_VOLTAGE    5000

DFRobot_MCP4725 DAC;

uint16_t OUTPUT_VOLTAGE = 5000;        // unit : mV 

void setup(void) {
  
  Serial.begin(115200);
  /* MCP4725A0_address is 0x60 or 0x61  
   * MCP4725A0_IIC_Address0 -->0x60
   * MCP4725A0_IIC_Address1 -->0x61
   */
  DAC.init(MCP4725A0_IIC_Address0, REF_VOLTAGE);

}

void loop(void) {

  Serial.print("DFRobot_MCP4725 output: ");
  Serial.print(OUTPUT_VOLTAGE); 
  Serial.println(" mV");
  
  DAC.outputVoltage(OUTPUT_VOLTAGE);

  delay(200);
}

在这里插入图片描述
正弦波模拟电压输出程序

#include "Wire.h"
#include "DFRobot_MCP4725.h"

#define  REF_VOLTAGE    5000

DFRobot_MCP4725 DAC;

int i =0;
void setup(void) {
  Serial.begin(115200);
  /* MCP4725A0_address is 0x60 or 0x61  
   * MCP4725A0_IIC_Address0 -->0x60
   * MCP4725A0_IIC_Address1 -->0x61
   */
  DAC.init(MCP4725A0_IIC_Address0, REF_VOLTAGE);
}

void loop(void) {
  /*Output a magnitude of 5000mv, the frequency of 10HZ, DC offset 2500mv sine wave*/
  DAC.outputSin(2500,10,2500);
}

函数说明:产生一个Vo=Voffset+Vpsin(2pift)的正弦波信号。当Vo>REF_VOLTAGE时,取值REF_VOLTAGE;当Vo<0时,取值0。
amp:单位(mV),设定正弦波幅度Vp。取值范围0-REF_VOLTAGE,取值大于REF_VOLTAGE时取REF_VOLTAGE,取0时为直流信号。
freq:单位(Hz),设定正弦波频率f。取值范围0~100,取值大于100时取100,取0时为直流信号。
offset:单位(mV),设定正弦波直流偏置Voffset。取值范围0-REF_VOLTAGE,取值大于REF_VOLTAGE时取REF_VOLTAGE。
在这里插入图片描述

在这里插入图片描述
三角波模拟电压输出程序

#include "Wire.h"
#include "DFRobot_MCP4725.h"
#define  REF_VOLTAGE    5000

DFRobot_MCP4725 DAC;

int i =0;
void setup(void) {
  Serial.begin(115200);
  /* MCP4725A0_address is 0x60 or 0x61  
   * MCP4725A0_IIC_Address0 -->0x60
   * MCP4725A0_IIC_Address1 -->0x61
   */
  DAC.init(MCP4725A0_IIC_Address0, REF_VOLTAGE);
}

void loop(void) {
  /*Output amplitude 5000mv, frequency 10HZ, 
   *the rise of the entire cycle accounted for 50% of the DC offset 0mv triangular wave.
   */
  DAC.outputTriangle(5000,10,0,50);
}

函数说明:产生一个三角(锯齿)波信号Vo。当Vo>REF_VOLTAGE时,取值REF_VOLTAGE;当Vo<0时,取值0。
amp:单位(mV),设定三角(锯齿)波幅度。取值范围0-REF_VOLTAGE,取值大于REF_VOLTAGE时取REF_VOLTAGE。
freq:单位(Hz),设定三角(锯齿)波频率。取值范围0~100。取值大于100时取100,取0时输出恒定0V。
offset:单位(mV),设定三角(锯齿)波直流偏置。取值范围0-REF_VOLTAGE,取值大于REF_VOLTAGE时取REF_VOLTAGE。
dutyCycle:单位(%),设定三角(锯齿)波占空比。取值范围0~100,取值大于100时取100,取0或100时成为锯齿波。
在这里插入图片描述
在这里插入图片描述

最后

以上就是愉快香氛为你收集整理的Arduino UNO驱动MCP4725 12位数模转换器DAC目录的全部内容,希望文章能够帮你解决Arduino UNO驱动MCP4725 12位数模转换器DAC目录所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部