DAC8562的配置与使用(基于STM32F103ZET6)

  说明:以下图片有些来自Ti的DAC8562的芯片手册,仅供参考;STM32的库是使用的正点原子的库函数。

这里我们介绍一下DAC8562的配置与使用,DAC8562是Ti公司的一款高精度DA,其位数为16位,输出量程可以根据参考电压选择,其特性简介如下:

Relative Accuracy: 
DAC756x (12-Bit): 0.3 LSB INL
DAC816x (14-Bit): 1 LSB INL
DAC856x (16-Bit): 4 LSB INL
Glitch Impulse: 0.1 nV-s
Bidirectional Reference: Input or 2.5-V Output
Output Disabled by Default
±5-mV Initial Accuracy (Max)
4-ppm°C Temperature Drift (Typ)
10-ppm/°C Temperature Drift (Max)
20-mA Sink and Source Capability
Power-On Reset to Zero Scale or Mid-Scale
Low-Power: 4 mW (Typ, 5-V AVDD, Including Internal Reference Current)
Wide Power-Supply Range: 2.7 V to 5.5 V
50-MHz SPI With Schmitt-Triggered Inputs
LDAC and CLR Functions
Output Buffer With Rail-to-Rail Operation
Packages: WSON-10 (3 mm × 3 mm), VSSOP-10
Temperature Range: –40°C to 125°C

我们将其翻译成中文,如下:

相对精度:
DAC756X(12位):0.3 LSB输入  
DAC816X(14位):1 LSB输入 
DAC856X(16位):4 LSB输入   
故障脉冲:0.1 nv-s              
双向参考:输入或2.5-V输出              
默认情况下禁用输出             
 ±5-mV初始精度(最大值)             
 4-ppm°C温度漂移(典型)             
 10 ppm/°C温度漂移(最大)              
20 mA水槽和电源容量              
上电重置为零刻度或中刻度              
低功率:4 mW(典型,5-V AVDD,包括内部参考电流)              
宽电源范围:2.7 V至5.5 V              
带施密特触发输入的50兆赫SPI              
ldac和clr函数              
带轨对轨操作的输出缓冲器             
封装:WSON-10(3 mm×3 mm),VSSOP-10              
温度范围:–40°C至125°C

在配置该DAC8562之前,我们需要知道其引脚图,以及相应的引脚定义:

                                                                    图一 芯片引脚图

                                                                        图二 引脚定义图

从图中我们可以知道:

AVDD:供电引脚,电压范围从2.7V到5.5V;

CLR:异步复位引脚,下降沿触发,这里DAC8562的寄存器会复位成0;

DIN:数据输入引脚:

GND:接地;

LDAC:数据装载引脚;

SCLK:时钟输入;

SYNC:同步帧;

VOUT_A:电压输出通道A;

VOUT_B:电压输出通道B;

VREF:参考电压输入/输出;

同时我们还需要知道芯片内部的原理框图,如下:

                                                                     图三 芯片内部原理图

我们需要知道其电路原理图,下面给大家两个电路图,一个是Ti给的评估板参考电路图,一个是自己画的电路图:

                                                                                 图四 官方电路图

                                                                             图五 自己的电路图

DAC8562的配置流程,其实非常简单,其流程图如下:

                                                                          图六 DAC8562配置流程图 

我们需要将数据和指令写入相应的寄存器,就需要知道相应的写入时序,这里DAC8562的写入时序如下:

                                                                                    图七 时序图

当SYNC为低时,写入的数据才有效,同时,数据在时钟下降沿会被写入寄存器,最后LDAC的的下降沿将其装入相应的寄存器中。

其数据的格式如下:

                                                                                   图八 数据格式图     

那么我们相应的程序就如下:

void DAC856x_Write_Data(u8 command,u16 data)
{
	int i;
	SYNC = 1;
	delay_us(1);	
	SYNC = 0;
	for(i=7;i>=0;i--)  //写入指令与地址
	{
		SCLK = 1;
		delay_us(10);
		DIN = (command>>i)%2;
		delay_us(10);
		SCLK = 0;
		delay_us(10);
	}
	for(i=15;i>=0;i--) //写入相应的数据
	{
		SCLK = 1;
		delay_us(10);
		DIN = (data>>i)%2;
		delay_us(10);
		SCLK = 0;
		delay_us(10);
	}
}

前面8位为我们需要写入的指令与地址,后面为需要写入的数据。其指令表可以参考芯片手册的第38页,非常详细,链接:http://202.114.207.36/cache/3/03/www.ti.com/8296d63ca25b9f6e1ab766ab35f3c5db/dac8562.pdf

接下来我们就需要进行相应的配置了,其配置程序如下:

void DAC856x_Init(void)
{
		//将CLR,SYNC拉高
		GPIO_SetBits(GPIOC,GPIO_Pin_2);
		GPIO_SetBits(GPIOC,GPIO_Pin_0);
		//将时钟拉低,CLR拉高
		GPIO_ResetBits(GPIOC,GPIO_Pin_3);
		GPIO_ResetBits(GPIOC,GPIO_Pin_1);
		//初始化配置
		DAC856x_Write_Data((WrtirToInputReg_Command_Reset_All_Regs>>16),(WrtirToInputReg_Command_Reset_All_Regs&0xFFFF)); //复位
		DAC856x_Write_Data((WrtirToInputReg_Command_POWERUP_DAC_A_B>>16),(WrtirToInputReg_Command_POWERUP_DAC_A_B&0xFFFF)); //启动
		DAC856x_Write_Data((WrtirToInputReg_Command_ENABLE_INTERNAL>>16),(WrtirToInputReg_Command_ENABLE_INTERNAL&0xFFFF)); //选用内部参考电压
}

接下来我们需要设置DAC的输出电压,这里由于我们选用的是内部参考,其增益默认为两倍,其输电压计算的原理框图如下:

                                                                        图九 输出电压计算框图 

这里我们的输出电压函数如下:

void DAC856x_SetVoltage(u8 DAC_Channel,u16 Dac_Data) 
{
	if(DAC_Channel == WrtirToInputReg_Command_DAC_A)
	{
		if(Dac_Data <= Max_Dac_Data)
			DAC856x_Write_Data(WrtirToInputReg_Command_DAC_A,Dac_Data);
		else
			DAC856x_Write_Data(WrtirToInputReg_Command_DAC_A,Max_Dac_Data);
	}
	if(DAC_Channel == WrtirToInputReg_Command_DAC_B)
	{
		if(Dac_Data <= Max_Dac_Data)
			DAC856x_Write_Data(WrtirToInputReg_Command_DAC_B,Dac_Data);
		else
			DAC856x_Write_Data(WrtirToInputReg_Command_DAC_B,Max_Dac_Data);
	}
	if(DAC_Channel == WrtirToInputReg_Command_DAC_AB)
	{
		if(Dac_Data <= Max_Dac_Data)
			DAC856x_Write_Data(WrtirToInputReg_Command_DAC_AB,Dac_Data);
		else
			DAC856x_Write_Data(WrtirToInputReg_Command_DAC_AB,Max_Dac_Data);
	}
	LDAC = 0;
	delay_us(100);
	LDAC = 1;
}

最后我们需要初始化相应的IO口,其程序如下:

void DAC856x_GPIO_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOC, ENABLE);	//使能GPIOC时钟
	   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}

我们相应的头文件定义如下:

#ifndef __DAC8563_H
#define __DAC8563_H
#include <sys.h>

#define LDAC PCout(0)
#define CLR PCout(1)
#define SYNC PCout(2)
#define SCLK PCout(3)
#define DIN PCout(4)
/*Voltage Set*/
#define WrtirToInputReg_Command_DAC_A 0x18
#define WrtirToInputReg_Command_DAC_B 0x19
#define WrtirToInputReg_Command_DAC_AB 0x1F
/*Command Set*/
#define WrtirToInputReg_Command_DAC_AB_Gain_2 0x020000 //Normal Default
#define WrtirToInputReg_Command_DAC_B_Gain_2_A_Gain_1 0x020001
#define WrtirToInputReg_Command_DAC_B_Gain_1_A_Gain_2	0x020002
#define WrtirToInputReg_Command_DAC_B_Gain_1_A_Gain_1	0x020003 //Power_Down Default
#define WrtirToInputReg_Command_Reset_All_Regs 0x280001
#define WrtirToInputReg_Command_POWERUP_DAC_A_B 0x200003
#define WrtirToInputReg_Command_ENABLE_INTERNAL 0x380001

#define Max_Dac_Data 43254 //输出电压为3.3V
void DAC856x_GPIO_Init(void);
void DAC856x_Write_Data(u8 command,u16 data);
void DAC856x_Init(void);
void DAC856x_SetVoltage(u8 DAC_Channel,u16 Dac_Data);
#endif

程序经过测试,没有问题,主函数很简单,这里就不在叙述了。

  • 20
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 基于stm32f103zet6的设计是一种基于STM32F103芯片的电路设计方案。该方案可以用于各种应用,如嵌入式系统、工业控制、智能家居等。STM32F103芯片是一种高性能、低功耗的32位微控制器,具有丰富的外设和强大的处理能力。在设计中,可以利用STM32F103芯片的各种外设,如ADC、DAC、定时器、串口等,来实现各种功能。同时,该方案还可以通过外部扩展模块,如LCD显示屏、WiFi模块、蓝牙模块等,来扩展系统的功能。基于stm32f103zet6的设计方案具有成本低、功耗低、性能高、可靠性强等优点,是一种非常实用的电路设计方案。 ### 回答2: STM32F103ZET6是一款核心频率为72MHz的ARM Cortex-M3微控制器。它拥有高性能、低功耗、广泛的开发支持和强大的应用能力,成为现代工业控制、智能家居、物联网等领域的首选控制器之一。 在设计基于STM32F103ZET6的系统时,需要考虑以下方面: 1.硬件设计 硬件设计是基于STM32F103ZET6的系统设计的核心。首先需要根据具体应用场景和需求设计电路图和PCB布局,然后根据设计要求进行调试和验证。在硬件设计过程中,需要注意系统的稳定性和可靠性,并采用合适的外围器件和模块来提高系统的性能和可扩展性。 2.软件开发 STM32F103ZET6的软件开发需要使用相应的开发工具和软件包,如Keil MDK、ST-LINK、STM32CubeMX等。首先需要编写基本的驱动程序和应用程序,然后根据具体需求进行优化和修改,最终进行调试和测试。 3.系统集成 系统集成包括硬件和软件集成两个方面。在硬件集成方面,需要将各个模块、器件、接口等进行正确连接和配置,确保系统硬件的正常工作。在软件集成方面,需要进行系统的调试、优化和测试,确保系统的稳定性和可靠性。 4.应用场景 基于STM32F103ZET6的系统具有广泛的应用场景。例如,可以应用于智能家居控制器、工业控制器、安防系统、机器人控制器等领域。在不同的应用场景下,设计者需要根据具体需求进行功能设计和优化,以实现系统的高性能和稳定性。 总之,基于STM32F103ZET6的设计需要设计者具备扎实的电子技术和嵌入式开发知识,同时需要具备深入了解不同应用场景和需求的能力。只有在综合考虑硬件、软件、系统集成和应用场景等方面,才能设计出高性能、高可靠性和高可扩展性的系统。 ### 回答3: 基于stm32f103zet6的设计是指使用stm32f103zet6这款单片机进行系统的设计和开发。作为一款常见的ARM Cortex-M3系列单片机,stm32f103zet6具有丰富的外设和功能,可以满足各种应用场景的需求。 在进行基于stm32f103zet6的设计时,首先需要进行系统的架构设计。常见的系统架构设计包括单核架构、双核架构、多核架构等。在单核架构下,所有系统任务都运行在同一个处理器核上;在双核架构下,系统任务被分为两部分,分别运行于不同的处理器核上,以提高系统的性能和可靠性;在多核架构下,则需要使用多个处理器核同时处理任务,以满足更高的性能需求。 接下来,需要选择适合的开发工具和编程语言。针对stm32f103zet6,常见的开发工具包括Keil uVision、IAR Embedded Workbench、Linaro GCC等。编程语言方面,可以选择C语言或汇编语言进行编写。 在进行系统开发时,需要明确系统的需求和功能模块,并设计相应的硬件电路和软件程序。常见的硬件电路包括外设接口、通信接口、存储器、时钟和电源等。常见的软件程序包括系统初始化程序、驱动程序、任务调度程序、应用程序等。 最后,需要进行系统测试和调试,验证系统的性能和可靠性,并对系统进行优化和升级。 基于stm32f103zet6的设计是一项复杂而重要的任务,在实际开发中需要结合实际需求和场景,进行细致而全面的规划和设计,才能开发出高质量和高性能的系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值