一、简介

性质:数模转换器
生厂商:TI(德州仪器)
分辨率:16位
通道数量:4
相对精度:±4LSB
输出阻抗:1Ω
电源电压(AVDD):2.7V~5.5V
参考电压(VREF):0~AVDD
输出电压:0~VREF

数据手册可点击链接免费下载:DAC8554 Datasheet

二、硬件

1、芯片引脚

在这里插入图片描述

序号 引脚名称 描述
1 VOUTA 电压输出通道A
2 VOUTB 电压输出通道B
3 VREFH 正参考电压
4 AVDD 电源电压
5 VREFL 负参考电压
6 GND
7 VOUTC 电压输出通道C
8 VOUTD 电压输出通道D
9 SYNC 低电平时开始传输数据
10 SCLK 时钟,最高50MHz
11 DIN 数据输入
12 IOVDD 数字电路电源
13 A0 地址设置位
14 A1 地址设置位
15 ENABLE 低电平使能SPI
16 LDAC 加载DAC寄存器,上升沿触发

DAC8554提供了两种数据同步更新功能,包括软件和硬件。

软件更新即用LD0/LD1控制更新方式,这时LDAC用不上,永久接地就好了;

硬件更新用LDAC控制,将数据存入缓冲器,随着LDAC从低变高,所有通道将一步更新到位。

2、芯片原理

芯片内部框图
在这里插入图片描述
可以看到芯片采用两级缓冲结构(Data Buffer ->DAC Register),这样的结构有4组,分别对应四个通道。从DIN输入的数据首先进入24位移位寄存器,然后进入缓冲器buffer,最后进入DAC寄存器,经过运放处理才得到最终电压。

DAC8554属于开关树形DA转换器,关于它的原理可查看【数电】DAC

其内部结构如下图所示:
在这里插入图片描述
其中电阻串结构如下所示
在这里插入图片描述
电阻串顶端接VREF_H,底端接VREF_L,经过65536个电阻R和一个电阻R_DIVIDER分压,且
R D I V I D E R = 65536 ∗ R R_{DIVIDER}=65536*R RDIVIDER=65536R
将分压信号输入给同向放大器,由

V o V i = 1 + R 2 R 1 \frac{Vo}{Vi}=1+\frac{R2}{R1} ViVo=1+R1R2
得到放大器增益为2.

故最终输出电压为:

V o u t = 2 ∗ ( V R E F L + ( V R E F H − V R E F L ) / 2 65536 ∗ D I N ) Vout=2*(V_{REF}L+\frac{(V_{REF}H-V_{REF}L)/2}{65536}*D_{IN}) Vout=2(VREFL+65536(VREFHVREFL)/2DIN)$$

电阻串电路中,每次只会有一个开关导通!

2、电路设计

在这里插入图片描述

(1)正参考电压接5V(由REG195G提供),负参考电压接地
(2)地址位为00
(3)ENABLE永久接地

为什么要接47电阻?

三、软件

1、时序图

在这里插入图片描述

采用3线制串行接口,可兼容SPI通讯协议。

将SYNC拉低,写时序开始。

在SCLK每个下降沿,DIN上数据被存入24位移位寄存器。

在24个数据写入过程中,如果SYNC拉高,则数据写入失败,之前写入的数据将丢弃。

从图中可以看出,总线空闲状态下,SCLK为1,故CPOL=1。

从图中可以看出,在第1、3、5个边沿进行数据采样,故CPHA=0。

SPI可采用模式2与DAC8554通讯。

2、片内寄存器

在这里插入图片描述
输入移位寄存器一共有24位,其中高8位为控制位,低16位为数据位.

A1/A0:地址位,可使一个主机最多控制4个DAC8554共16个通道的芯片,写入A1A0的地址必须与硬件设置的地址相同。
LD1/LD0:加载模式控制,使用指定的 16 位数据值或掉电命令控制每个模拟输出的更新。

LD1 LD0 模式 描述 (请结合芯片内部结构框图阅读)
0 0 单通道存储模式 被选中的DAC通道的缓冲器加载输入移位寄存器中的数据,或者加载掉电模式命令
0 1 单通道更新模式 被选中的DAC通道的缓冲器DAC寄存器加载输入移位寄存器中的数据,或者加载掉电模式命令
1 0 同步更新模式 选中通道从移位寄存器中更新数据,同时其他通道从缓冲器中更新之前的数据
1 1 广播更新模式 不管地址是否匹配,挂载的所有DAC8554都会响应。若DAC Select1=0,则所有通道更新缓冲器中保存的数据;若DAC Select1=1,则所有通道更新移位寄存器中保存的数据

数据存储进缓冲器还不会有对应电压输出,必须加载进入DAC寄存器才会

X:
DAC Select1/2:选择通道,A(00)/B(01)/C(10)/D(11)
PD0:选择掉电模式。若PD0=1,D15和D14将表示掉电模式:
在这里插入图片描述
从表中可以看出,不同的掉电模式有不同的输出阻抗。

3、程序编写

在这里插入图片描述
使用SPI模式2与DAC8554通讯,即CPOL=1,CPHA=0。由于DAC8554最高通讯速率为50MHz,故这里设置为30M。

初始化函数

void MX_SPI2_Init(void)
{

  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES_TXONLY;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 0x0;
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  hspi2.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
  hspi2.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
  hspi2.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi2.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi2.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
  hspi2.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
  hspi2.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
  hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
  hspi2.Init.IOSwap = SPI_IO_SWAP_DISABLE;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    Error_Handler();
  }

}

写移位寄存器函数

/**********************************************************************
* 名称 : DAC_Write_Reg
* 功能 : DAC 写数据寄存器函数
* 输入 : Addr -- 地址
		 nCH -- 通道
		 DAC_Code -- DAC内码
* 输出 :无
* 说明 : 无
***********************************************************************/
void DAC_Write_Reg(uint8_t Addr,uint8_t nCH,uint16_t DAC_Code)
{
	uint8_t CMD = 0x00;
	uint8_t dac_code[2];//将16位数据存储在数组中
	dac_code[0]=DAC_Code >> 8;//高位先行
	dac_code[1]=DAC_Code >> 0;
	
	//采用硬件进行数据更新
	HAL_GPIO_WritePin(GPIOC, LDAC_Pin, GPIO_PIN_RESET);	//LDAC = 0(上升沿加载DAC)

	//1.设置命令  
	CMD = CMD | (Addr << 6);				//设置地址(A1/A0)
	CMD = CMD | (nCH  << 1);				//设置输出通道(SEL1/SEL0)

	//2.写入DAC数据 
	HAL_GPIO_WritePin(SPI2_SYNC_GPIO_Port, SPI2_SYNC_Pin, GPIO_PIN_RESET);//SYNC = 0,开始写入
 	HAL_SPI_Transmit(&hspi2, &CMD, 1, 1000);
	HAL_SPI_Transmit(&hspi2, dac_code, 2, 1000);
 	HAL_GPIO_WritePin(SPI2_SYNC_GPIO_Port, SPI2_SYNC_Pin, GPIO_PIN_SET);//SYNC = 1,结束写入
	
	HAL_GPIO_WritePin(GPIOC, LDAC_Pin, GPIO_PIN_SET);//LDAC = 1,上升沿完成DAC加载
}

翻译函数

/**********************************************************************
* 名称 : DAC_Translate
* 功能 : 将目标电压翻译为DAC内码,支持分辨率0.076mV
* 输入 : nCH -- 通道
		 Votage -- 电压值
* 输出 :无
* 说明 : 1.输出范围:0 <= Votage <= +VREF
		 2.关于校正系数DAC_Coeff,当DAC输出存在线性误差时可通过校正系数
		   来修正输出值,假如设定值位Vset = 2.5V,实际Vout= 2.485V
		   此时的校正系数为DAC_Coeff = Vset÷ Vout = 1.006f
		
***********************************************************************/
void DAC_Translate(uint8_t nCH,float Votage)
{
	uint16_t r_Value = 0x0000;			//寄存器数据
	
   	r_Value = (uint16_t)((float)CODE_MAX * Votage * DAC_Coeff / DAC_VREF);  //计算DAC内码
	DAC_Write_Reg(DAC_ADDR,nCH,r_Value);//写入数据
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐