DAC8563数模转换模块的使用介绍

前言

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是边沿触发,仅在下降沿信号出现执行清零。

猜你喜欢

转载自blog.csdn.net/qq_42250136/article/details/133841974
今日推荐