一、芯片信息
ADS8326 是TI设计的一款 16 位采样模数转换器,属于SAR型ADC。电源电压范围为 2.7V ~5.5V。
优点是低功耗,高速率,有效速率范围是24kHz~6MHz。
ADS8326 提供出色的线性度和极低的噪声和失真,INL仅有±1 LSB,DNL仅有±0.4 LSB。数据传输采用串行(SPI/SSI 兼容)接口和差分接口。参考电压可设置为 0.1V 至 VDD 范围内的任何电平。低功耗和小尺寸使 ADS8326 在用便携式和电池供电系统种成为理想之选。此外,也非常适合远程数据采集、隔离数据采集、工控、机器人和数据分析。 有MSOP-8 和 SON-8两种封装。
二、典型应用电路
选择双端输入,输入信号接在正端+IN和负端-IN两端,之间要加个1nF的电容,然后输入信号得正负端对地都要接1000pF的滤波电容。
选择单端输入,输入信号对地借一个1000pF的滤波电容即可。
三、时序图分析+软件实现
1.IO口设置
我们只需要用到ADS8326的5、6、7号引脚,对应封装图的CS/SHDN、DOUT和DCLOCK。
CS/SHDN和DCLOCK是MCU输入给ADS8326的,故设置为推挽输出;而DOUT是ADS8326的输出引脚,因为MCU需要读取其bit数据,所以设置为浮空输入,片选位拉高,ADS8326默认状态为失能模式。代码如下:
// An highlighted block
void ADS8326_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //DOUT是ADS8326的数据输出口,故PA6设置为浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_4); //片选先拉高
}
2.采集信号
代码的编写需要根据时序图。这里给出了两种时序方式,我用第一种。
先把CS拉低,再给个下降沿的时钟脉冲信号,开始采集。
ADS8326_CS = 0; //片选拉低,使能模块
//起始信号
ADS8326_DCLK = 1;
delay_us(1);
ADS8326_DCLK = 0;
delay_us(1);
下列是采集的实现。根据手册数据,采集过程标准是5个时钟周期(上升沿),那么代码内为何多了一个周期呢?因为第6个周期内,DOUT电平从高到低变化,准备进入转换模式,所以整个采集过程需要耗费6个时钟周期。
//发送6个时钟周期,进行采样
for(u8 i=0; i<6; i++)
{
ADS8326_DCLK = 0
delay_us(1);
ADS8326_DCLK = 1;
delay_us(1);
}
3.转换信号
采集结束后,需要转换为Code。由下图可见,一个转换过程需要16个时钟周期,每个上升沿期间DOUT输出一个bit,最高位MSB最先输出,最低为LSB最后输出。数据处理时需要把最高为左移至最高,最低为放在最低。
代码实现如下:
//再发送16个时钟周期,转换数值
for(u8 a=16; a>0; a--)
{
ADS8326_DCLK = 0;
delay_us(1);
ADS8326_DCLK = 1;
delay_us(1);
temp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6); //读取每个时钟周期的数据位
data |= temp<<(a-1); //第一个得到的bit为MSB,放在最高位;最后一个是LSB,放在最低位
}
//结束信号
ADS8326_DCLK = 0;
delay_us(1);
ADS8326_DCLK = 1;
delay_us(1);
ADS8326_CS = 1; //片选拉高,失能模块
return data;
如果在转换结束时保持低电平,则新的数据流以 LSB 优先的数据移出,然后无限输出零,所以,采集结束后需要把片选置高,结束采集过程。整个16 位转换至少需要 22 个时钟周期。
四、实际测试
ADS8326的VREF和VDD相连,3.3V供电。之后用开关电源给一个2.55V的电压到ADS8326,万用表测量值如下,保证精确度。
下列是ADS8326实际采集到的电压值,误差特别小,代码运行成功!
五、资源
完整版代码点此链接下载!(注意:代码内的6个采样周期是下降沿,需要自行改为上升沿,虽然两者对采集的正确性没有影响,但还是要严格按照时序来)。
ads8326驱动代码下载地址