我是靠谱客的博主 明亮哑铃,最近开发中收集的这篇文章主要介绍E-03 MCP4725一直输出一半输入电压的解决方法 附stm32f103 mcp4725驱动示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

关于MCP4725

stm32f103c8t6是经常使用的微控制器,用来做各种电子控制系统实验或者简单的毕设、比赛作品等。stm32f103c8t6有片上的ADC单元,可以进行模拟量到数字量的转换,但是没有DAC单元,不能进行数字量到模拟量的转换。(在大型的stm32f103zet6上有DAC单元,但是一般最小系统板不会采用这块大芯片,一是昂贵,二是体积大)。
为了弥补这一不足,可以采用DAC芯片对最小系统板进行扩展,从而实现DAC功能。MCP4725可以满足数字量到模拟量的转换,最高5V输出(相较stm32f103zet6的最高3.3V输出增大的量程)。
MCP4725

现象

MCP4725的out输出引脚输出的电压总是为输入电压的一半,例如输入5V,输出2.5V,输入3.3V输出1.65V。

原因与解决方法

  • 原因:MCP4725提供了一个A0引脚给用户选择IIC器件的地址,上面这个模块的默认地址A0为0,如果程序中用的地址是A0:1,那么就会导致这个错误。
    在这里插入图片描述
    在这里插入图片描述

  • 解决方法
    ①把焊盘上地址A0与VCC相连。
    在这里插入图片描述
    ②或者更改程序,使之与硬件地址对应。
    ADDR接VCC:0xC2
    ADDR接GND:0xC0

正确的输出现象

MCP4725输出

硬件连接

MCP4725

  • SCL - PA4
  • SDA - PA5
  • VCC - 5V
  • GND - GND
  • OUT - 测试端
  • ADDR - VCC

板载硬件

  • KEY - PA0
  • LED - PC13

程序源码

这里提供MCP4725的驱动程序
MCP4725.c

#include "MCP4725.h" 
#include "delay.h"

u16 MCP4725_DAC_Value=3000;

//初始化IIC接口
void MCP4725_Init(void)
{
	IIC_Init();
	MCP4725_WriteData_Voltage(MCP4725_DAC_Value);//初始3V
}

//使用快速模式写命令写DAC寄存器
//如果A0设为1
void MCP4725_WriteData_Voltage(u16 Vout)   //电压单位mV
{
  u8 temp;
	u16 Dn;
	if(Vout>=5000) Vout=4999;
	Dn = ( 4096 * Vout) / VREF;
	temp = (0x0F00 & Dn) >> 8;  //12位数据
	IIC_Start();
	IIC_Send_Byte(0XC2);      //器件寻址,器件代码:1100; 地址位A2,A1,A0为 0 , 0 , 1;-> 1100 0010
	IIC_Wait_Ack();	 
	IIC_Send_Byte(temp); 	
	IIC_Wait_Ack();	 
	IIC_Send_Byte(Dn);        //将低8位送到DAC寄存器
	IIC_Wait_Ack();	
  IIC_Stop();//产生一个停止条件  	
	delay_ms(10);	
}

//如果A0设为0
void MCP4725_WriteData_Digital(u16 data)   //12位数字量
{
  u8 data_H=0,data_L=0;
	data_H = ( 0x0F00 & data) >> 8;
	data_L = 0X00FF & data ;
	IIC_Start();
	IIC_Send_Byte(0XC0);      //器件寻址,器件代码:1100; 地址位A2,A1,A0为 0 , 0 , 0;-> 1100 0010
	IIC_Wait_Ack();	 
	IIC_Send_Byte(data_H); 	
	IIC_Wait_Ack();	 
	IIC_Send_Byte(data_L);
	IIC_Wait_Ack();	
  IIC_Stop();//产生一个停止条件  	
	delay_ms(10);	
}

MCP4725.h

#include "myiic.h"
#ifndef __MCP4725_H
#define __mcp4725_H

//VREF:参考电压5000mV
#define VREF      5000 
extern u16 MCP4725_DAC_Value;

void MCP4725_Init(void);
void MCP4725_WriteData_Digital(u16 data);
void MCP4725_WriteData_Voltage(u16 Vout);

#endif

完整工程文件

亲测可用~最大误差0.01V,0 ~ 5000mV范围可调
https://download.csdn.net/download/Z_KIND/16615442

最后

以上就是明亮哑铃为你收集整理的E-03 MCP4725一直输出一半输入电压的解决方法 附stm32f103 mcp4725驱动示例的全部内容,希望文章能够帮你解决E-03 MCP4725一直输出一半输入电压的解决方法 附stm32f103 mcp4725驱动示例所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部