最近需要用一款高精度的ADC,选择了TI的ADS1256,现将学习过程中的主要内容整理列出,与大家共同探讨,若有错误还请指正
ADS1256主要特性
- 24位高精度
- 极低噪声
- 最高30kSPS(7.68MHz输入时钟下)
- 双极多路复用器
-- 四路差分输入或八路单端输入 - 内置PGA
- 5V容忍的SPI接口
关键组成
先看框图
主要分为这么几个模块:
- Input Multiplexer:输入多路复用器
- Buffer:可选的输入缓冲
- PGA:程控增益放大器
- A/D Converter:ADC电路,包括一个4阶delta-sigma modulator和一个可编程数字滤波器
- Clock Generator:时钟电路
- Control:复位、同步、掉电控制
- Serial Interface:串行数据接口
然后我们看一下具体功能
先是最基本的,Serial Interface和Input Multiplexer
- 串行数据接口就不多说了,对好时序就没啥问题,下面是我的底层代码
void ADS1256_SendByte(uint8_t _data)
{
uint8_t j;
delay_us(10);
for(j=0;j<8;j++)
{
ADS1256_CLK = 1;
if(_data&0x80)
ADS1256_write_dout = 1;
else
ADS1256_write_dout = 0;
ADS1256_CLK = 0;
_data<<=1;
}
}
uint8_t ADS1256_ReadByte(void)
{
uint8_t i,read=0;
delay_us(10);
for(i=0;i<8;i++)
{
ADS1256_CLK = 1;
delay_us(10);
ADS1256_CLK = 0;
read<<=1;
if(ADS1256_read_din)
{
read++;
}
delay_us(1);
}
return read;
}
void ADS1256WriteREG(unsigned char regaddr,unsigned char databyte)
{
ADS1256_CS=0;
ADS1256_SendByte(CMD_WREG|regaddr);
ADS1256_SendByte(0x00);
ADS1256_SendByte(databyte);
ADS1256_CS=1;
}
u8 ADS1256_ReadREG(unsigned char regaddr)
{
u8 temp = 0;
ADS1256_CS=0;
ADS1256_SendByte(CMD_RREG|regaddr);
ADS1256_SendByte(0x00);
delay_us(10);
temp = ADS1256_ReadByte();
ADS1256_CS=1;
return temp;
}
unsigned int ADS1256ReadData()
{
unsigned int sum=0;
ADS1256_CS=0;
while(ADS1256_DRDY);
//ADS1256WriteREG(REG_MUX,channel);
ADS1256_SendByte(CMD_SYNC);delay_us(50);
ADS1256_SendByte(CMD_WAKEUP);delay_us(50);
ADS1256_SendByte(CMD_RDATA);delay_us(50);
sum|=(ADS1256_ReadByte()<<16);
sum|=(ADS1256_ReadByte()<<8);
sum|=(ADS1256_ReadByte());
ADS1256_CS=1;
return sum;
}
- 输入信号的多路复用器
这个多路复用器很简单,就是选择任意两路作为输入信号的正负端。
但需要注意一下:
- 输入为单端信号时可使用AINCON脚作为公共地,其它各通道分别接不同的输入信号
- 差分输入时最好选择相邻通道分别作为信号正端与负端(例如:选择AIN0和AIN1分别作为输入信号的正端和负端)
通过设置REG_MUX寄存器可设置该多路复用器
ADS1256WriteREG(REG_MUX,channel);
delay_us(100);
return ADS1256ReadData();
- PGA
现在不少ADC都会内置一个PGA(程控增益放大器),以更好地应对不同动态范围的输入信号,而在很多时候就不需要在前级模拟电路中,设计专门的放大电路进行调整。
增益倍数:1、2、4、……64
int ADS1256_PGA_Set(int G)
{
u8 temp = 0;
temp = 0xf8 & ADS1256_ReadREG(REG_ADCON);
ADS1256WriteREG(REG_ADCON, G | temp);
delay_us(10);
return 1;
}
然后看下其它的
Buffer输入缓冲器
可选的输入缓冲器,可提供80MΩ的阻抗-
A/D Converter
包括一个4阶delta-sigma modulator和一个可编程数字滤波器
调制器的full-scale input range为 ±2VREF (PGA = 1).
数字滤波器如下
可通过更改Num_Ave来增加求均值所用的样本量同时完成对前级数据的进一步抽取而改变采样率
Control部分
这部分仅引出两个功能引脚,RESET_N,和SYNC_N/PDWN_N
RESET_N用于芯片复位,拉低再拉高即可
SYNC_N/PDWN_N用于AD转换的同步控制和Power-Down模式的控制,控制方法:
--同步转换:拉低再拉高,低电平不超过20个DRDY_N周期
--进入Power-Down模式:保持低电平大于20个DRDY_N周期,所有电路均会失能
暂时就涉及到这些,互相交流学习,有没注意到的地方还请指教~