前言
DAC8563为16位低功耗、电压输出、双通道的数模转换器,其包括一个2.5V4ppm/°C 内部基准,从而提供了一个 2.5V 或 5V 的满量程输出电压范围。 此内部基准有一精度,并且能够在 VREFIN/VREFOUT引脚上提供或吸收高个 ±5mV 的初始达 20mA 的电流。这些设备是单调的,提供优良的线性,并最小化不需要的代码到代码的瞬态电压。他们使用一个多功能的三线串行交错面是补偿在时钟速率高达50MHz。该接口兼容标准的SPI、QSPI、微线和数字信号处理器(DSP)接口。DAC8562设备包含了一个电源复位电路,确保DAC输出通电,并在写入有效代码之前保持输出电平在0V,而DAC8563设备同样在输出电平1/2输出量程。这些设备包含一个降电功能,在5V时将电流消耗降低到550 nA。低功耗、内部参考和小占用使这些设备成为便携式电池操作设备的理想选择。DAC8562设备相互兼容,DAC8563设备也相互兼容。
一、DAC8563
1.1 参数特性
1. 相对精度:16 位时为 4 最低有效位
2. 双向基准引脚:输入或 2.5V 输出
– 4ppm/°C 温度漂移(典型值)
3. 上电复位至零量程或量程中点
4. 低功耗:5V AVDD 时为 4mW
5. 宽电源范围:2.7V 至 5.5V
6. 带有施密特触发输入的 50MHz 串行外设接口 (SPI)
1.2 DAC8563时序图
二、锯齿波例程代码
1.DAC8563.c .h参考代码
代码如下(示例):
#ifndef __DAC8562_H
#define __DAC8562_H
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void Delay(vu32 nCount);
void ADC1_Configuration(void);
void DAC8562_WRITE(uint8_t cmd,uint16_t data);
#endif
#include"stm32f10x_conf.h"
#define DIN_H GPIO_SetBits(GPIOA,GPIO_Pin_0)
#define DIN_L GPIO_ResetBits(GPIOA,GPIO_Pin_0)
#define SCLK_H GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define SCLK_L GPIO_ResetBits(GPIOA,GPIO_Pin_1)
#define CLR_H GPIO_SetBits(GPIOA,GPIO_Pin_2)
#define CLR_L GPIO_ResetBits(GPIOA,GPIO_Pin_2)
#define SYNC_H GPIO_SetBits(GPIOA,GPIO_Pin_3)
#define SYNC_L GPIO_ResetBits(GPIOA,GPIO_Pin_3)
#define LDAC_H GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define LDAC_L GPIO_ResetBits(GPIOA,GPIO_Pin_4)
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { }
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08) { }
}
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void DAC8562_WRITE(uint8_t cmd,uint16_t data)
{
SYNC_H;
Delay(0x01);
SYNC_L;
SCLK_L;
for(uint8_t s=0;s<8;s++)
{
if((cmd&0x80)==0x80){DIN_H;}
else{DIN_L;}
Delay(0x01);
SCLK_H;
Delay(0x01);
cmd<<=1;
SCLK_L;
Delay(0x01);
}
for(uint8_t s=0;s<16;s++)
{
if((data&0x8000)==0x8000){DIN_H;}
else{DIN_L;}
Delay(0x01);
SCLK_H;
Delay(0x01);
data<<=1;
SCLK_L;
Delay(0x01);
}
}
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
#ifdef DEBUG
void assert_failed(u8* file, u32 line)
{
while (1) { }
}
#endif
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "dac8563.h"
2.main.c
代码如下(示例):
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
DAC8562_WRITE(0x28,0x0001);
DAC8562_WRITE(0x20,0x0003);
DAC8562_WRITE(0x38,0x0001);
uint16_t test;
while (1)
{
DAC8562_WRITE(0x18,test);
DAC8562_WRITE(0x19,test);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
Delay(0x01);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
test+=200;
}
}
总结
双通道DAC,轨到轨输出,16bit分辨率,支持50MHz的SPI时钟速度。自带2.5V的内部参考基准,典型的温飘是4ppm/℃,使用内部2.5V参考基准的情况下,根据增益设置不同,DAC的输出量可以为0到2.5V或者0到5V。DAC8562和DAC8563完全兼容,区别仅仅在于CLR引脚有效时,DAC8562数据设置为0, DAC8563数据设置为32767,注意这是DAC的内部数据,不表示输出电压。 对于-10 ~ +10V输出的模块,DAC8562输出-10V, DAC8563输出0V。无论是用DAC8562还是DAC8563芯片,只要软件不启动,本模块输出电压缺省状态都是0V。CLR脚悬浮时,电压在1.9V左右,容易受到干扰导致输出被清零。因此即使不用CLR控制功能,这个CLR脚也需要接固定电平(推荐接GND)。CLR是边沿触发,仅在下降沿信号出现执行清零。