概述
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 UNO | MCP4725 |
---|---|
VCC | 5V |
GND | GND |
SDA | A4 |
SCL | A5 |
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目录所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复