目录
前言
DAC8563是TI的低功耗、电压输出、双通道、16位数据转换器(DAC)。其包括一个2.5V,4ppm/℃内部基准,提供2.5V或者5V的满量程输出电压范围。内部基准具有 ±5mV 的初始精度,并且可以提供或吸收20 mA电流。这些器件是线性的,可提供出色的线性度并最大限度地减少不需要的代码间瞬态电压(毛刺)。它们使用以高达 50 MHz 的时钟速率运行的多功能三线串行接口。该接口与标准 SPI、QSPI、Microwire 和数字信号处理器 (DSP) 等接口兼容。 DAC8563 器件包含一个上电复位电路,可确保 DAC 输出上电并保持在零电平,直到向器件写入有效代码,具有断电功能,可将 5 V 时的典型电流消耗降低至 550 nA。低功耗、内部基准和小尺寸使这些器件成为便携式电池供电设备的理想选择。
1 DAC8563硬件设计
1.1 DAC8563主要参数
- 供电电压:2.7~5.5V;
- 分辨率:16bit,双通道;
- 通讯接口:3线SPI串行通讯,速率最高至50MHz,(有MOSI/CLK/SYNC)
- 内部自带2.5V参考电压。使用内部参考电压时,DAC通道输出电压根据增益设置的不同可输出0~ 2.5V(增益为1)或0~ 5V(增益为2,默认)
1.2 DAC8563引脚功能
DAC8563主要有两种封装:
各个引脚的功能说明如下:
- AVDD:供电范围2.7-5.5V;
- CLR:异步清除输入,下降沿有效,触发后,DAC8562输出最低电压值,DAC8563输出中间值。用户写入操作的的第24个时钟下降沿将退出清除模式,激活清除模式将终止写操作;
- DIN:串行数据输入,每个时钟下降沿将24bit数据写到输入移位寄存器;
- GND:接地端;
- LDAC:同步模式下,数据更新发生在第24个SCLK周期的下降沿,之后伴随着SYNC的下降沿。 这种同步更新不需要LDAC,此时LDAC必须可靠接地,或者通过命令发送到设备使其保持低电平。异步模式下,LDAC是低电平触发,用于同步DAC更新,可以编写多个单通道命令进行设置,然后在LDAC引脚上产生一个下降沿将同步更新DAC输出寄存器;
- SCLK:时钟输入端,最高支持50MHz;
- SYNC (片选):低电平有效,当SYNC变为低电平时,它使能输入移位寄存器,并且数据采样在随后的时钟下降沿。 DAC输出在第24个时钟下降沿之后更新。 如果SYNC在第23个时钟沿之前变高,SYNC的上升沿将充当中断,此次的写入会被无效;
- VoutA:模拟电压输出通道A;
- VoutB:模拟电压输出通道B;
- Vrefin/Vrefout:双向电压参考引脚,可以使用外部电压作为内部电压基准,也可以使用内部电压作为基准,此时该引脚是输出2.5V。
1.3 DAC8563输出电压计算公式
DAC856X的计算公式如下:
- DIN:配置DAC856X数据输出寄存器的数值,范围0 到2^16 – 1,即0到65535;
- 2^n:对于DAC8563来说,由于分辨率为16位,故n是16;
- VREF:如果使用内部参考电压,那么此数值是2.5V,如果使用外部参考电压,由该引脚的电压决定,但是值得说明的是,最大的输出不应超过AVDD;
- Gain:增益设置。禁止内部电压基准后,默认增益是1。如果使能内部电压基准后,默认增益是2。具体增益是1还是2,可以通过DAC8563的寄存器设置。
1.4 DAC8563时序图
DAC856X的时序图如下:
其中,必要的延迟时间如下:
值得注意的是上图中的两个参数尤其重要:
- t4:每传输24bit数据后,SYNC要保持一段时间的高电平,DAC8563要求至少要80ns;
- t5:SYNC低电平有效到SCLK第1个下降沿信号的时间,最小值13ns。;
1.5 DAC8563寄存器配置
整个写数据为24位,其中位23-22可以不用管,位21-16为主要的命令数据,低16位为具体的数据。
1.6 DAC8563后级调理电路
对于有些应用场合,0 ~ 5V的输出范围往往是不够用的,因此加入后级电路是有必要的。根据官方给的例子。可以使用一个高精度运放设计得到具有正负电压或者多量程输出的DAC功能板。
1.7 DAC8563硬件设计还需要注意的地方
由上图可以看到,Vout的输出电压范围为-0.3 ~ AVDD+0.3。因此,假如DAC8563的供电电压改变为3.3V,那么写入65535的数据,最多只能输出3.3V,但是输入32768,依旧能输出2.5V。
另外,控制信号的高电平与AVDD也有关系,也就是输入的高电平为0.7*AVDD。这对于绝大多数ARM以及DSP都是不友好的,因为引脚电平的输出电压往往只有3.3V,而AVDD通常使用要得到5V的满偏量程至少要3.5V的高电平。当然,设计者也可以使用内部增益为1,也就是量程为2.5V,这样是能得到线性的输出的。
由于笔者是在设计好后级电路之后才发现了这个问题,因此只能硬着头皮找方法。对于STM32这类芯片可以使用开漏输出,外部上拉到AVDD即可,但是如DSP类的芯片却没有这个功能。因此也可以使用SPI专用的电平转换器,但是转换器带来的响应延迟造成多大的影响也不可知。最终,在尝试的结果下,发现只要尽量减少信号线的距离就可以尽可能提高DAC信号端的电压值,保证3.3V的单片机高电平也是有效的。
2 DAC8563软件设计
SPI的使用一般有软件IO模拟时序,以及硬件SPI两种办法,前者在复杂的时序中具有简单,灵活的优势,不过在速度上要逊色硬件SPI不少。
2.1 SPI总线配置
spi总线配置通过如下函数实现:
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
SPI1_ReadWriteByte(0xff);//启动传输
这里配置了一次发送的数据位为8个,这样只要发送三次8位数据就可以组成一个24位的数据。同时配置先发高位,即MSB。极性配置为高电平,并在第一个跳变沿采样数据,这也是根据DAC8563的时序得到的。
2.2 SPI发送配置
void Dac8563_reg_write(u8 cmd,u16 dat)
{
DAC8563_CS=0; //使能器件
delay_us(1);
SPI1_ReadWriteByte(cmd); //发送写取状态寄存器命令
SPI1_ReadWriteByte(dat>>8); //写入一个字节
SPI1_ReadWriteByte((dat) );
delay_us(1);
DAC8563_CS=1; //取消片选
}
通过调用SPI1_ReadWriteByte读写函数,即可实现8位数据的发送,这里值得注意的是要发送的数据应该处于低八位。另外可以忽略SPI1_ReadWriteByte中的接收函数。第一个延时主要是为了保证低电平的时间与SPI的下降沿时间差,不过考虑到SPI的速度如果设置的比较慢,不是20M往上(估计),可以忽略,因为本身SPI的下降沿之间也有一段时间,这段时间与时钟的频率有关。第二个延时是为了保证SPI的数据发送结束的,因为SPI的数据虽然发送完,但是形成电平也需要时间,所以需要等待一会,同样,如果SPI的频率很高,那么这个延时时间也可以减小。
2.3 DAC8563初始化
void DAC8563_Init(void)
{
SPI1_Init(); //初始化SPI
SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //设置时钟频率
DAC8563_CS=1;
delay_us(1);
Dac8563_reg_write(0x20,0x0003); //上电
Dac8563_reg_write(0x30,0x0003); //不使能LDAC
DAC_OutAB(32687,32687); //设置输出中间电压
Dac8563_reg_write(0x38,0x0001); //配置内部参考电压,增益为2
}
可以看到DAC的初始化主要分为三个步骤,需要写入三次数据。另外值得说明的是,在初始化中对使能引脚置高是为了使得第一次写数据时高电平能够保持一定的时间,这也是时序中要求的。
2.4 DAC8563更新输出
void DAC_OutAB(u16 dat_a, u16 dat_b)
{
Dac8563_reg_write(0x18, dat_a);
Dac8563_reg_write(0x19, dat_b);
}
通过更新对应寄存器的数据可以更新输出。本设计没有使用CLR及LDAC功能。
3 成果展示
3.1 硬件

3.2 测试波形


说在后面
这个小项目的设计资料我已上传至硬创社(项目链接),有需要的各位自取。