• 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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113

    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;
      } 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    总结

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

  • 相关阅读:
    蓝桥杯练习题十 - 煤球数目(c++)
    MySQL基本命令行的应用
    jvm八股
    Python - 字符串编解码
    码住!双11支付宝小程序云云市集,享骨折优惠最强购物清单,抽奖赢iPhone 15 Pro!
    python基于PHP+MySQL的投资理财网站的设计与实现
    一些额外且好用的 icon 图库
    TMD,JVM类加载原来是这样的!!!!
    14:00面试测试岗,14:06就出来了,问的问题有点变态。。。
    SendKeys.SendWait 函数模拟键盘输入
  • 原文地址:https://blog.csdn.net/qq_42250136/article/details/133841974