AD5686R(16位高精度DAC)硬件和程序设计

AD5686R(16位高精度DAC)硬件和程序设计

前言

  由于不太喜欢使用STM32内部的DAC和想要学习外部DAC的原因,做了这个DAC的硬件和程序,作为自己的技术积累,和大家分享

简介

AD5686R:
  16位精度、自带2.5V基准电压源.
在2.5V基准电压下,通过内部2倍增益,最大可以输出5V电压
接口:SPI,最大速度:25M(官方),我跑到过32M

硬件设计

在这里插入图片描述
在这里插入图片描述
  首先是电源部分,AD5686R最大可以输入5.5V电压,数字IO电压独立,所以可以兼容STM32和arduino两大最常用的阵营。在VDD方面,通过排针可以选择输入的电压,分别是3.3V,直接输入的5V,和LDO稳压后的5V。
  数字引脚方面,除了SPI的上下拉之外,对复位、LDAC、RSTSEL、GAIN等功能引脚均有上下拉,做了硬件调试的冗余。
  四个模拟输出都有滤波电容和泄放电阻。
  整体设计参照了官方给出的DEMO。并且已经实验,完全可用,PCB和原理图全部开源,和代码一起放在Github上了,链接在文末,自行取用。

硬件设计

  AD5686R的寄存器不多,驱动部分也比较简单。由于驱动的代码太过长(约500行)。所以在这里只介绍移植相关和API代码。

代码移植部分

  代码文件由AD5684_5_6R.c和AD5684_5_6R.h,两个文件构成。需要与HAL库配合使用,需要硬件部分一个完整的四线SPI和两个GPIO输出的资源,SPI时钟小于25M。
  将代码文件复制和添加到开发环境后。以下是需要按照硬件不同而修改的部分:

int AD5686x_Init(void)
{
    /*用户定义参数*/
    DAC1_AD5686.Name = AD5686;
	DAC1_AD5686.SPI_Aisle=hspi1;
    DAC1_AD5686.EN_Pin=GPIO_PIN_4;
    DAC1_AD5686.EN_Prot=AD5686R_EN_GPIO_Port;
    DAC1_AD5686.LDAC_Pin=GPIO_PIN_3;
    DAC1_AD5686.LDAC_Prot=AD5686R_LDAC_GPIO_Port;
    DAC1_AD5686.RESET_Pin=AD5686R_RESET_Pin;
    DAC1_AD5686.RESET_Prot=AD5686R_RESET_GPIO_Port;
    DAC1_AD5686.Vref = 2.5;
    DAC1_AD5686.GAIN = Double_GAIN;
    DAC1_AD5686.Renew_Mode = asynchronous;
}

解释一下,这是创建了一个关于AD5686的结构体,各个参数有一些规范
  Name:由于此代码兼容三种芯片规格,所以需要在Name中表明芯片型号:AD5684、AD5685、AD5686
  SPI_Auske:所使用的SPI的结构体名称,可以在SPI.c的文件中复制过来。
  脚位设置:NSS(EN)、LDAC、RESET,的脚位,可以在Main.h中复制(需要在STM32 CUBEMX设置引脚的名称)
  Vref:参考电压,一般使用片内自带的2.5V电压,也可以从外部输入。
  GAIN:是否使用片内的增益,Single_GAIN(不使用增益)、Double_GAIN(2倍增益)
  Renew_Mode:更新方式,可以选择同步更新(Synchronize)和异步更新(asynchronous)。在使用写入寄存器n的API时,如果模式为同步更新,则会自动使能LDAC引脚同步数据。
  到此,代码部分已经移植完毕,十分的简单。

API部分

  先呈上一个最常用的API,如果对输出时许没有太多要求的场合,学习这一个API就可以操作这个芯片了

/**
  * @brief 使用V为单位直接写入DAC
  * @param AD568x:写目标设备
  * @param Aisle:选择的通道
  * @param Mode:选择的模式
  * @retval 写操作反馈
  */
int AD568x_write_V(AD5686_5_4R *AD568x, uint8_t Aisle, double DATA_D)
例如
AD568x_write_V(&DAC1_AD5686,Aisle_A,1.75);

Aisle:选择的通道,可以为Aisle_A、Aisle_B、Aisle_C、Aisle_D。
DATA_D:可以是0-(参考电压*增益倍数)的任意小数

  其他的API

/**
  * @brief 设置LDAC屏蔽
  * @param AD568x:写目标设备
  * @param Aisle:选择的通道
  * @param Mode:选择的模式
  * @retval 写操作反馈
  */
int AD568x_ldac_mask(AD5686_5_4R *AD568x, uint8_t Aisle, int Mode)
/**
  * @brief 设置掉电模式
  * @param AD568x:写目标设备
  * @param Aisle:选择的通道
  * @param Mode:选择的模式
  * @retval 写操作反馈
  */
int AD568x_power_mode(AD5686_5_4R *AD568x, uint8_t Aisle, int Mode)
/**
  * @brief 写入并更新n
  * @param AD568x:写目标设备
  * @param Aisle:选择的通道
  * @retval 写操作反馈
  */
int AD568x_write_update_register(AD5686_5_4R *AD568x, uint8_t Aisle, int DATA)
/**
  * @brief 通过写入寄存器n更新DAC
  * @param AD568x:写目标设备
  * @param Aisle:选择的通道
  * @retval 写操作反馈
  */
int AD568x_update_register(AD5686_5_4R *AD568x, uint8_t Aisle)
/**
  * @brief 写入输入寄存器n
  * @param AD568x:写目标设备
  * @param Aisle:选择的通道
  * @param DATA:数值
  * @retval 写操作反馈
  */
int AD568x_set_shift_reg(AD5686_5_4R *AD568x, uint8_t Aisle, int DATA)
/**
  * @brief 通过LDAC引脚对AD568x的寄存器数据更新
  * @param AD568x:写目标设备
  * @retval 无
  */
int AD568x_Renew_LDAC(AD5686_5_4R *AD568x)

其一些模式和参数在.h文件夹中有解释。

芯片性能

  使用这些程序简单的测试了一下这个DAC,基本可以满足我对DAC的需求,从0-5V的跳跃是需要4ns,输出频率由于SPI的限制,只能跑到15k左右。但作为高精度的DAC也是足够了。

开源地址

可以去白嫖了~下载的时候求求点一下星星,抱拳了!
github :https://github.com/lijinlong21549/AD5686R-Module
关于硬件有什么问题欢迎私信。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值