[附源码] STM32F103C8T6+外接MCP4725 外部DAC

这篇具有很好参考价值的文章主要介绍了[附源码] STM32F103C8T6+外接MCP4725 外部DAC。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于stm32f103c8t6的DAC

        STM32F103C8T6最小系统板是大家很常用的一款单片机,它内部有多个ADC模数转换通道,但并没有DAC数模转换功能,当需要进行数字量转换为模拟量时就需要借助外部DAC。    

stm32怎么外接dac,stm32,DAC,MCP4725,stm32,嵌入式硬件,单片机

关于MCP4725

        MCP4725是具有非易失性存储器的单通道12位缓冲电压输出DAC。用户可将配置寄存器位(2位)和DAC输入数据(12位)存储 到非易失性EEPROM (14位)存储器中。通过设置配置寄存器位可以把DAC配置成正常模式或节省功耗的关断模式。器件可以使用2线I2C兼容串行接口,且由电压范围为2.7V至5.5V的单电源供电。

         通过I2C总线外接MCP4725模块,从而弥补了STM32F103C8T6无DAC的不足。并且当用5V单电源供电时,其DAC通道可以输出5V的电压。stm32怎么外接dac,stm32,DAC,MCP4725,stm32,嵌入式硬件,单片机

接线图

      

 VCC接3.3V,

GND接GND,

SCL接PB6,

SDA接PB7,

OUT,GND测试引脚

效果展示: 

电压误差值0.01V

stm32怎么外接dac,stm32,DAC,MCP4725,stm32,嵌入式硬件,单片机

 问题解答:

        如果你接线正确并运行代码后,用万用表测的电压为供电电压的一半,与实际应该输出的电压值不相符,修改MCP4725.C代码中的地址

        如果ADDR接VCC地址为:0xc2

        如果ADDR接GND地址为:0xc0

stm32怎么外接dac,stm32,DAC,MCP4725,stm32,嵌入式硬件,单片机

我使用的是这款,所以代码中的地址为0XC0

 代码:

I2C.C代码:
#include "stm32f10x.h"                  // Device header
#include "myIIC.h"
#include "delay.h"

/*引脚配置*/
#define MCP4725_W_SCL(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(x))
#define MCP4725_W_SDA(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(x))
#define MCP4725_W_SDAIN			GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)


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

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

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

//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
MCP4725.C代码:
#include "stm32f10x.h"                  // Device header

#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(0XC0);      //器件寻址,器件代吗:1100; 地址位A2,A1,A0为 0 , 0 , 1;-> 1100 0010
    //这个地址0XC0或0XC1,根据自己购买的模块决定
    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);	
}
MCP4725.h代码:
#ifndef __MCP4725_H
#define __MCP4725_H
#include "myIIC.h"   


#define VREF_5V      3260//这个数值根据自己给模块的供电电压而定

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

#endif

main.c代码:
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

#include "MCP4725.H"
#include "myIIC.H"
 
int main(void)
{

	MCP4725_Init();
	
	while(1)
	{ 
		MCP4725_WriteData_Voltage(1500);
		
	}
}

实测过,代码绝对可用,初学者,还请多多关照!文章来源地址https://www.toymoban.com/news/detail-764055.html

到了这里,关于[附源码] STM32F103C8T6+外接MCP4725 外部DAC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • JQ8400语音模块-stm32f103c8t6(内含全代码)-亲测有效

    一.模块介绍 1.常见的JQ8400-FL语音模块有两种,一种是带3W功放,有4M的存储空间,可通过USB拷贝声音文件,通过单片机串口控制;另外一种是附有SD卡槽,用SD卡存储文件的文件(MP3格式)进行语音播报,也是通过单片机串口控制 2.我用的是二线串口通信,一线的没试过 3.程序

    2023年04月26日
    浏览(22)
  • MQ2烟雾传感器 - STM32F103C8T6-HAL库

    ADC.c 文件 ADC.h文件 main函数中的调用

    2024年04月26日
    浏览(14)
  • STM32F103C8T6+ESP8266WIFI+DHT11模块连接巴法云

    1.MCU:STM32F103C8T6 2.ESP8266:正点原子WIFI模块 3.串口模块:正点原子串口模块 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: ESP8266固件刷写 我用的是安信可的固件,可以在官网上下载。正点

    2023年04月27日
    浏览(38)
  • 【沧海拾昧】STM32F103C8T6/C6T6的ISP烧录

    #C0105 沧海茫茫千钟粟,且拾吾昧一微尘 ——《沧海拾昧集》@CuPhoenix 【阅前敬告】 沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系 【如有问题必是本集记录有谬,切勿深究】   对于某种STM32F103C8T6/C6T6最小系统板,没有配置J-LINK/ST-LINK烧录口,此时可以

    2024年02月03日
    浏览(42)
  • STM32F103C8T6---定时器1&定时器8输出PWM信号注意事项

    博主今天在驱动定时器1的通道1输出PWM信号的时候,遇到了好多问题,在这里指出,警醒自己的同时希望能给各位带来帮助 首先,第一个错误, 第一:PA8引脚默认模式就是定时器1的通道一,我们在代码里面,直接 将PA8的输出模式改为复用推挽输出,不要去重定向它,也不要

    2024年02月16日
    浏览(17)
  • STM32单片机PWM控制实现电机调速度(小车运动,STM32F103C8T6&TB6612&TT电机)

    作者:公子易平 时间:2023/6/6 前段时间做一个智能小车的相关项目时,发现很少有人能够将STM32的PWM控制讲清楚,故而书此文,希望对后来的学习者有所帮助。 STM32F103C8T6最小系统板 直流TT电机 电机驱动芯片(TB6612) 杜邦线若干 接线情况: TB6612引脚说明: STM32主控芯片与TB6612接

    2024年02月15日
    浏览(21)
  • 蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)

    一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇) 二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速) 三、小车3.0——避障小车(超声波+舵机云台) 四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传) 五、双轮自平衡小车(HAL库版

    2023年04月09日
    浏览(23)
  • STM32F103C8T6+ESP-01S+MQTT服务器实现数据上传和接收(一)

    文章目录 STM32F103C8T6+ESP-01S+MQTT服务器实现数据的上传和接收(二) ESP-01S推荐使用安信可官网1471号固件,烧录配置如下图。 请替换其中里面的内容 使用PA9、PA10分别连接ESP8266的RXD、TXD引脚。 由于每次发送的AT指令都会被8266通过串口再发送回来,为了缓解串口的压力,并且更

    2024年04月17日
    浏览(19)
  • STM32F103C8T6+2.4寸SPI TFT触摸屏代码+标准库 项目开发

    目录 模块清单: 模块介绍: 1:STM32F103C8T6 2:2.4寸SPI TFT触摸屏 项目结果展示 2.4寸 TFT SPI显示触摸屏 2.4寸 SPI TFT 显示触摸屏代码下载链接: https://download.csdn.net/download/weixin_49492286/88458377 清单 STM32F103C8T6 2.4寸SPI TFT触摸屏         STM32F103C8T6是意法半导体(STMicroelectronics)推

    2024年02月07日
    浏览(25)
  • stm32f103c8t6的外部中断

    在单片机中存在着中断系统,这个系统的逻辑和功能在51单片机中已经有所了解。 1.在32单片机中的内核有一个nvic 里面存放许多优先级的设定,外接许多中断源,比如“exti、tim、adc、usart等”接入之后,nvic再通过中断优先级进行排队,再内接入cpu中进行处理,这样子大大减少

    2024年02月09日
    浏览(19)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包