AD7689驱动
最近在做一个项目用到了AD7689采样芯片,AD7689是一个16bit、250K、SPI通信最多支持8通道采集的AD芯片,说起这个芯片真的坑,刚开始的时候采用按通道0到通道7的顺序采集方式,发现读到的AD值就是不对,一直在跳变,刚开始一直怀疑是自己写的驱动程序不对,然后按着芯片手册重新对照了自己的驱动,发现驱动没有问题,然后自己仔细看了下这个AD芯片的内部结构后豁然开朗,原来这个芯片内部硬件采用的是模拟开关控制采集通道,并且在模拟开关后面添加了一个滤波器,导致采样太快在切换通道的时候压差越大滤波器滤波时间越长,导致读下一个通道的采集电压值的时候可能是上一个通道还没有滤波完的数据,最后处理方式是降频采集方式,等此次通道采样值稳定后再切换到下一个通道进行采样。最后获取的采样值才是正确有效的。前期吃过的亏都是为后期开发避免走弯路的铺垫。
1.AD7689采样芯片内部功能框图
2.寄存器配置表
3.AD7689驱动程序
这是我个人写的AD7689的驱动,经测试有效。
#define AD7689_RB 1 //不回读CFG寄存器配置内容
#define AD7689_SEQ 0 //禁止序列器
#define AD7689_REF 1 //内部基准电压源REF = 4.096V
#define AD7689_BW 1 //全带宽低通滤波器
#define AD7689_INCC 7 //单级性,以GND为参考
#define AD7689_CFG 1 //覆盖寄存器内容
uint16_t SPI_AD7689_Read( uint8_t AD7689_INx)
{
uint8_t i = 0;
uint16_t AD7689_Config=0;
uint16_t AD7689_Data;
AD7689_Config = (AD7689_CFG<<13)|(AD7689_INCC<<10)|(AD7689_INx<<7)|(AD7689_BW<<6)|(AD7689_REF<<3)|(AD7689_SEQ<<1)|AD7689_RB;
AD7689_Config <<=2; //根据芯片手册左移2位末位补0
AD7689_CNV_SET_H(); //CNV = 1;
delay_us(6);
AD7689_CNV_SET_L(); //CNV = 0;
delay_us(6);
AD7689_CNV_SET_H(); //CNV = 1;
delay_us(6);
AD7689_CNV_SET_L(); //CNV = 0;
delay_us(1);
for(i=0;i<16;i++)
{
if(AD7689_Config&0x8000)
{
AD7689_DIN_SET_H(); //DIN = 1;
}
else
{
AD7689_DIN_SET_L(); //DIN = 0;
}
delay_50ns(1);
AD7689_CLK_SET_L(); //CLK = 0;
delay_50ns(1);
AD7689_Config <<= 1;
AD7689_CLK_SET_H(); //CLK = 1;
delay_50ns(1);
AD7689_Data <<=1;
if(Read_AD7689_SDO_Value)
{
AD7689_Data |=1;
}
}
delay_us(2);
AD7689_CLK_SET_L();
delay_us(2);
AD7689_CNV_SET_H();
return (AD7689_Data&0xFFFF);
}
希望这次开发经验分享对后期使用AD7689采集芯片的IT发烧友们有一定的帮助,谢谢!