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

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: STM32F103C8T6是一种常用的32位ARM Cortex-M3微控制器单片机,它具有广泛的应用领域,包括工业控制、嵌入式系统和移动设备等。它采用72MHz的主频,内置了64KB闪存和20KB的SRAM,可通过多种接口(包括I²C、SPI和USART)与外部设备进行通信。此外,它还支持多种外设,如定时器、ADC和DAC等,以满足各种应用的需求。 MCP4725是一款数字到模拟转换器(DAC),常用于在微控制器中生成模拟输出信号。它是一款12位分辨率DAC芯片,具有内部EEPROM,能够存储用户配置的设置,即使在断电后也能保持。MCP4725通过I²C总线与微控制器通信,只需使用几个引脚便可实现高分辨率的模拟输出。它广泛应用于音频设备、仪器仪表和传感器校准等领域。 在使用STM32F103C8T6和MCP4725时,可以通过STM32的I²C模块与MCP4725进行通信。首先,需要配置STM32的I²C端口,设置I²C的时钟频率和其他参数。然后,通过发送指令和数据,可以向MCP4725写入模拟输出值,控制模拟信号的幅度。此外,还可以通过读取MCP4725的内部EEPROM来读取之前保存的配置,实现断电后的数据保持。 总之,STM32F103C8T6和MCP4725是两款功能强大的电子器件,通过它们可以实现复杂的控制和信号处理任务。这对于需要精确控制模拟信号的应用来说是非常有价值的,并且STM32F103C8T6和MCP4725都具有良好的可扩展性和兼容性,使得它们可以灵活地应用于各种场景中。 ### 回答2: STM32F103C8T6 是一款基于ARM Cortex-M3内核的微控制器,具有丰富的外设资源和强大的处理能力。MCP4725 是一款数字到模拟转换器(DAC),能够将数字信号转换为模拟电压输出。下面是关于它们的一些回答: 1. STM32F103C8T6 是一款强大的微控制器,适用于各种应用场景。它具有高性能的CPU和丰富的外设资源,可以满足各种通信、控制和计算需求。同时,它还支持多种通信接口,如SPI、I2C和USART,方便与其他设备进行通信。 2. 对于MCP4725数字到模拟转换器,它可以将数字信号转换为模拟电压输出。这对于需要输出模拟电压的应用非常有用,如音频处理、传感器驱动和控制电路等。MCP4725还具有非常小的封装尺寸和低功耗特性,非常适合嵌入式系统的应用。 3. STM32F103C8T6 可以与 MCP4725 进行通信。我们可以通过STM32微控制器上的SPI或I2C接口来连接MCP4725,并使用相应的软件驱动程序来控制它。通过发送相应的指令和数据,STM32可以向MCP4725发送数字信号,MCP4725会将其转换为模拟电压输出,并将其送到相应的输出引脚上。这样就可以实现STM32MCP4725的通信和数据交换。 总而言之,STM32F103C8T6是一款功能强大的微控制器,MCP4725是一款实现数字到模拟转换功能的器件。通过将它们结合在一起,我们可以实现更复杂的电路和应用。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值