MCP4725介绍和STM32模拟IC2驱动

这篇具有很好参考价值的文章主要介绍了MCP4725介绍和STM32模拟IC2驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.MCP4725

简单总结为下面几个特点。
1路DAC输出
12位分辨率
I2C 接口(标准,快速,高速支持)
供电电压2.7-5.5
内部EEPROM存储设置
I2C地址可配置(A0)(A1、A2内置,默认为‘00’)
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机

二.硬件设计

MCP4725的管脚定义如图所示,比较简单
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机
官方的电路图如下
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机

一般上拉电阻选择10K就可以了,后级的比较器看项目需要,可以更换为同相放大器。

三.软件设计

MCP4725的输出电压由下面的公式计算得出
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机
可以理解为VDD除以4096份,我们想要输出相对应的电压只要计算好相对应的份数就可以了。
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机
MCP4725采用I2C接口。写命令如图
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机
MCP4725带一个EEPROM,可以存储上一次输出的电压指令。
快速模式写DAC寄存器
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机
其实第一个字节一般是固定的,如果I2C只连接了一个MCP4725那就是写入0XC2。第二个字节关断模式一般选择为00,接下来就是想要输出的电压分数,比如参考电压为5V,想要输出2.5V就是2048份,也就是0X800。
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机接下来的写EEPROM和读EEPROM也是一样的操作。就不详细写了
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机
MCP4725介绍和STM32模拟IC2驱动,STM32,电路,元器件使用,stm32,嵌入式硬件,单片机

代码
H文件

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


#define VREF_5V      5000

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

#endif

C文件

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


//初始化IIC接口
void MCP4725_Init(void)
{
	IIC_Init();
}

//使用快速模式写命令写DAC寄存器
void MCP4725_WriteData_Voltage(u16 Vout)   //电压单位mV
{
  u8 temp;
	u16 Dn;
	Dn = ( 4096 * Vout) / VREF_5V; //这里的VREF_5V宏定义为5000
	temp = (0x0F00 & Dn) >> 8;  //12位数据。0000XXXX XXXXXXXX 
	IIC_Start();
	IIC_Send_Byte(0XC2);      //器件寻址,器件代吗:1100; 地址位A2,A1,A0为 0 , 0 , 1;-> 1100 0010
    IIC_Wait_Ack();	 
    IIC_Send_Byte(temp); 	  //将高8位送到DAC寄存器
    IIC_Wait_Ack();	 
    IIC_Send_Byte(Dn);        //将低8位送到DAC寄存器
	IIC_Wait_Ack();	
    IIC_Stop();//产生一个停止条件  	
	delay_ms(10);	
}
 
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);	
}

I2C文件文章来源地址https://www.toymoban.com/news/detail-604482.html

#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"

//IO方向设置
// 
//#define SDA_IN()  {GPIOL->CRH&=0XFF0FFFFF;GPIOA->CRL|=(u32)8<<12;}    //PA5
//#define SDA_OUT() {GPIOL->CRH&=0XFF0FFFFF;GPIOA->CRL|=(u32)3<<12;}
 

//IO操作函数	 
#define IIC_SCL    PAout(4) //SCL
#define IIC_SDA    PAout(5) //SDA	 
#define READ_SDA   PAin(5)  //输入SDA 

//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);			        //IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号

void SDA_IN(void);
void SDA_OUT(void);

void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);	  
#endif
#include "myiic.h"
#include "delay.h"

//初始化IIC
void IIC_Init(void)
{					     
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA, ENABLE );	//使能GPIOA时钟
	   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;         //PA4 ->SCL;  PA5->SDA
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5); 	//PA4,PA5 输出高,因为IIC空闲状态都是高电平
}

//SDA设置为输入
void SDA_IN (void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA, ENABLE );	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//SDA设置为输出
void SDA_OUT(void)
{ 
	GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA, ENABLE );	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//产生IIC起始信号
void IIC_Start(void)
{
	SDA_OUT();     //sda线设置为输出
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(10);
 	IIC_SDA=0;     //START:when CLK is high,DATA change form high to low 
	delay_us(10);
	IIC_SCL=0;     //钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)
{
	SDA_OUT();//sda线输出
	IIC_SCL=0;
	IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 	delay_us(10);
	IIC_SCL=1; 
	IIC_SDA=1;//发送I2C总线结束信号
	delay_us(10);							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
	u8 ucErrTime=0;
	SDA_IN();      //SDA设置为输入  
	IIC_SDA=1;delay_us(2);	   
	IIC_SCL=1;delay_us(2);	 
	while(READ_SDA)
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			IIC_Stop();
			return 1;
		}
	}
	IIC_SCL=0;//时钟输出0 	   
	return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(5);
	IIC_SCL=1;
	delay_us(5);
	IIC_SCL=0;
}
//不产生ACK应答		    
void IIC_NAck(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;
	delay_us(5);
	IIC_SCL=1;
	delay_us(5);
	IIC_SCL=0;
}					 				     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
	SDA_OUT(); 	    
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)    //开始准备信号线
    {              
        //IIC_SDA=(txd&0x80)>>7;
		if((txd&0x80)>>7)
			IIC_SDA=1;
		else
			IIC_SDA=0;
		txd<<=1; 	  
		delay_us(5);   //对TEA5767这三个延时都是必须的
		IIC_SCL=1;
		delay_us(5); 
		IIC_SCL=0;	
		delay_us(5);
    }	 
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
	unsigned char i,receive=0;
	SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
	{
        IIC_SCL=0; 
        delay_us(5);
		IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
		delay_us(4); 
    }					 
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}

到了这里,关于MCP4725介绍和STM32模拟IC2驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32驱动RFID高频读卡器读取IC卡

    RFID(Radio-Frequency Identification)高频读卡器是一种设备,用于读取和解析高频(13.56 MHz)频段上的RFID标签信息。这种读卡器通过无线射频技术与标签进行通信,并从标签中获取存储的数据。 RFID高频读卡器通常包括以下主要 组件 : 读卡器天线:用于发射和接收射频信号,与标

    2024年02月11日
    浏览(45)
  • STM32基础入门学习笔记:核心板 电路原理与驱动编程

    文章目录: 一:LED灯操作  1.LED灯的点亮和熄灭 延迟闪烁 main.c  led.c led.h BitAction枚举 2.LED呼吸灯(灯的强弱交替变化) main.c  delay.c 3.按键控制LED灯 key.h key.c main.c  二:FLASH读写程序(有记忆可以保存断电之前的状态) flash.h flash.c main.c flash操作注意事项 三:蜂鸣器驱动程序(

    2024年02月13日
    浏览(39)
  • 采用VerilogA和analogLib方法生成模拟IC电路模型之对比

    在模拟IC设计和仿真中,有时会需要一个电路模型(如运放、D触发器),配合主要电路来进行行为或电路仿真,这个电路模型不是用具体工艺的mos管等搭建,而是用VerilogA代码生成,或者用Cadence中analogLib搭建,本文用全差分放大器和D触发器举例说明搭建过程,并比较二者的不

    2024年04月15日
    浏览(31)
  • 基础篇010.3 STM32驱动RC522 RFID模块之三:STM32软件模拟SPI驱动RC522

    目录   1. 实验硬件及原理图 2. 利用STM32CubeMX创建MDK工程 2.1 STM32CubeMX工程创建 2.2 配置调试方式 2.3 配置时钟电路 2.4 配置时钟 2.5 配置GPIO 2.6 配置串口 2.7 项目配置 3. MDK工程驱动代码调试 3.1 按键、LED程序 3.2 SPI软件模拟程序 3.3 RC522驱动程序 3.4 UART串口printf,scanf函数串口重定

    2024年04月17日
    浏览(54)
  • 蓝桥杯嵌入式 STM32G4 MCP4017可编程电阻

    MCP4017为可编程电阻 查阅产品手册可知,MCP4017使用I2C通讯协议,引脚为PB6,PB7 ,控制的电阻连接至PB14,同时跳线帽连接J15.1与J15.2 如下图,Rs为单个电阻阻值;RWS为总阻值,与R17串联,两者对VDD电压进行分压, 可以通过测量PB14的电压判断可编程电阻的阻值。 MCP4017的默认总阻

    2023年04月08日
    浏览(63)
  • STM32管脚模拟协议驱动双路16位DAC芯片TM8211

    TM8211是一款国产的低成本双路16位DAC驱动芯片,可以应用于普通数模转换领域及音频转换领域等。这里介绍STM32 HAL库驱动TM8211的逻辑,时序和代码。 TM8211的功能特性为: TM8211的内部电路功能框图为: TM8211支持典型的3.3V供电和5V供电,在驱动后进行电压输出时, 需要注意,如以

    2024年02月16日
    浏览(46)
  • 关键元器件选型设计指引--通用逻辑器件(逻辑IC)

    标准数字逻辑IC集成电路可以从工艺、功能和电平三个方面划分,列表所示。 注:常见的逻辑电路有54军用系列和74商用系列,两者电路功能一致,本文仅讨论74系列。 按照制造工艺特点分类: 工艺 逻辑器件产品族 优点 不足 Bipolar TTL 、S、LS、AS、F、ALS、ECL 速度快,强电流驱

    2024年02月20日
    浏览(52)
  • 【STM32篇】SPI时序驱动W25Q64(硬件SPI和模拟SPI)

            由于MCU的FLASH空间有限,在特殊使用场所中会存在FLASH存储不够使用的情况。例如上篇中驱动LCD屏,需要将一个中文字库保存到MCU的FLASH中是不太现实的(STM32F103ZET6内部FLASH大小512KB),为此可使用外部FLASH作为拓展。         W25Q64(64Mbit)是为系统提供一个最小的空

    2024年02月08日
    浏览(51)
  • 详细介绍,驱动IC的功能和作用

    在LED显示屏的工作当中,驱动IC的作用是接收符合协议规定的显示数据(来自接收卡或者视频处理器等信息源),在内部生产PWM与电流时间变化,输出与亮度灰度刷新等相关的PWM电流来点亮LED。驱动IC和逻辑IC以及MOS开关组成的周边IC,共同作用于LED显示屏的显示功能并决定其

    2024年02月10日
    浏览(56)
  • 【模拟IC】DCDC电荷泵设计指标介绍与解析

    设计一个 DC-DC 转换器,例如电荷泵,理解设计指标的重要性是很关键的。随后,彻底熟悉如何使用正确的设计指标来评估电荷泵的性能。 电荷泵设计规范决定了技术、电路结构和调节方案。 工艺包括电荷泵设计中可选的晶体管、电容和电阻类型。晶体管决定了电荷泵的速度

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包