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就可以操作这个芯片了
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
int AD568x_ldac_mask(AD5686_5_4R *AD568x, uint8_t Aisle, int Mode)
int AD568x_power_mode(AD5686_5_4R *AD568x, uint8_t Aisle, int Mode)
int AD568x_write_update_register(AD5686_5_4R *AD568x, uint8_t Aisle, int DATA)
int AD568x_update_register(AD5686_5_4R *AD568x, uint8_t Aisle)
int AD568x_set_shift_reg(AD5686_5_4R *AD568x, uint8_t Aisle, int DATA)
int AD568x_Renew_LDAC(AD5686_5_4R *AD568x)
其一些模式和参数在.h文件夹中有解释。
芯片性能
??使用这些程序简单的测试了一下这个DAC,基本可以满足我对DAC的需求,从0-5V的跳跃是需要4ns,输出频率由于SPI的限制,只能跑到15k左右。但作为高精度的DAC也是足够了。
开源地址
可以去白嫖了~下载的时候求求点一下星星,抱拳了! github :https://github.com/lijinlong21549/AD5686R-Module 关于硬件有什么问题欢迎私信。
|