AD5761R菊花链结构DA输出
AD5761R特性介绍
AD5761R/AD5721R分别是单通道、16/12位串行输入、电压输出数模转换器(DAC),采用单电源(4.75V至30V)或双电源(-16.5V至0VV。和4.75V至16.5VV,n)供电,集成输出放大器、基准电压源缓冲器和基准电压源,是使用极为方便的通用解决方案。
这些器件可保证单调性,选定范围内的积分非线性(INL)为土2LSB(最大值),噪声为35nV/vHz,建立时间为7.5us。
AD5761R/AD5721R采用串行接口,能够以最高50MHz的时钟速率工作,并且与DSP和微控制器接口标准兼容。利用双缓冲,DAC输出可实现异步更新。输入编码为用户可选的二进制补码或偏移二进制。异步复位功能可将所有寄存器复位至默认状态。用户可通过控制寄存器中的RA[2:0]位选择输出范围。
菊花链结构链接示意图
SCLK以及SYNC并联结构,上一个的SDO接下一个的SDI,LDAC引脚在菊花链结构中十分重要需要注意使用,LDAC引脚可实现通过引脚更新DA寄存器数据,在采用菊花链结构时,如果不使用LDAC,假设群位里面有一个数据为0,则每个DA在经过位移时都会将数据值先设置为0在回到设置值
通讯方式
采用SPI通讯方式,16位DA 24字节命令发送,SPI CPOL以及CPHA均配置为0即可
发送实例以及注意要点
单数据传送到某一个DA上
发送不同数据到达指定DA
实验实例
/*************************************************
* 函数名:AD5761R_SetVoltage
* 函数作用:设置通道电压
* 入口参数:ch1_val: 通道1电压 ch2_val: 通道2电压 ch3_val: 通道3电压 ch1_val: 通道4电压
* 出口参数:无
*************************************************/
void AD5761R_SetVoltage(float ch1_val,float ch2_val,float ch3_val,float ch4_val)
{
int buff[4] = {0};
//通道4
if(ch1_val < -30) {ch1_val = -30;}
if(ch2_val < -30) {ch2_val = -30;}
if(ch3_val < -30) {ch3_val = -30;}
if(ch4_val < -30) {ch4_val = -30;}
if(ch1_val > 150) {ch1_val = 150;}
if(ch2_val > 150) {ch2_val = 150;}
if(ch3_val > 150) {ch3_val = 150;}
if(ch4_val > 150) {ch4_val = 150;}
if(ch4_val >= 0 && ch4_val<= 150)
{
buff[3] = 32767.5+(32767.5*(ch4_val/150.0f));
ad5761r_write_update_dac_register(0,buff[3]);
}
else if(ch4_val < 0 && ch4_val >= -30)
{
ch4_val = -ch4_val;
buff[3] = 32767.5-(32767.5*(ch4_val/150.0f));
ad5761r_write_update_dac_register(0,buff[3]);
}
//通道3
if(ch3_val >= 0 && ch3_val<= 150)
{
buff[2] = 32767.5+(32767.5*(ch3_val/150.0f));
ad5761r_write_update_dac_register(0,buff[2]);
}
else if(ch3_val < 0 && ch3_val >= -30)
{
ch3_val = -ch3_val;
buff[2] = 32767.5-(32767.5*(ch3_val/150.0f));
ad5761r_write_update_dac_register(0,buff[2]);
}
//通道2
if(ch2_val >= 0 && ch2_val<= 150)
{
buff[1] = 32767.5+(32767.5*(ch2_val/150.0f));
ad5761r_write_update_dac_register(0,buff[1]);
}
else if(ch2_val < 0 && ch2_val >= -30)
{
ch2_val = -ch2_val;
buff[1] = 32767.5-(32767.5*(ch2_val/150.0f));
ad5761r_write_update_dac_register(0,buff[1]);
}
//通道1
if(ch1_val >= 0 && ch1_val<= 150)
{
buff[0] = 32767.5+(32767.5*(ch1_val/150.0f));
ad5761r_write_update_dac_register(0,buff[0]);
}
else if(ch1_val < 0 && ch1_val >= -30)
{
ch1_val = -ch1_val;
buff[0] = 32767.5-(32767.5*(ch1_val/150.0f));
ad5761r_write_update_dac_register(0,buff[0]);
}
}