ADS1118基本功能
ADS1118是TI的16位ADC,内置1MHz晶振和参考电压源,转换速度8~860次每秒可调,量程±0.256V到±6.144V可调,可选单端输入或差分输入,内部集成温度传感器。
ADS1118寄存器
ADS1118的寄存器非常简单,只有2个16bit的寄存器。其中一个为只读寄存器,保存ADC转换后的值;另一个为配置寄存器,配置采集通道、正负量程、采集模式、采集速率、采集源(电压或温度)等。
ADS1118的转换寄存器
ADS1118的转换寄存器长度为16位,以补码的形式编码,用来保存每次AD转换后的结果。
ADS1118的配置寄存器
位 | 名字 | 读写类型 | 初始值 | 描述 |
---|---|---|---|---|
15 | SS | 读写 | 0h | 单次转换开始,只用于单次转换模式,没有转换时写入1表示开始转换,写入0没有作用,正在转换时写入1也没有作用,此位永远读取为0 |
14~12 | MUX | 读写 | 0h | 选择电压的输入通道: 000=Ain0+ Ain1-(差分);001=Ain0+ Ain3-(差分);010=Ain1+ Ain3-(差分);011=Ain2+ Ain3-(差分);100=Ain0+(单端);101=Ain1+(单端);110=Ain2+(单端);111=Ain3+(单端) 单端输入负参考为GND |
11~9 | PGA | 读写 | 2h | 量程选择:000=±6.144V;001=±4.096V;010=±2.048V;011=±1.024V;100=±0.512V;101=110=111=±0.256V; |
8 | MODE | 读写 | 1h | 选择转换模式,0=连续转换模式,1=单次转换模式(单次转换完成后变为掉电状态) |
7~5 | DR | 读写 | 4h | 转换速率:000=8;001=16;010=32;011=31;100=128;101=250;110=475;111=860(次每秒) |
4 | TS_MODE | 读写 | 0h | 0=采集电压;1=采集内部温度传感器 |
3 | PULLUP_EN | 读写 | 1h | 控制是否使能DOUT/DRDY引脚的内部弱上拉:0=不上拉,1=上拉(推荐) |
2~1 | NOP | 读写 | 1h | 确定此次参数设置是否有效:01=设置生效,其他皆为使ADS1118忽略此次设置 |
0 | 保留 | 只读 | 1h | 保留位,写0或写1没有任何影响,读取永远为1 |
ADS1118读写时序分析
ADS1118共有两种读写模式:32-Bit模式和16-Bit模式,两种模式均为高位在前。32-Bit模式用于CS(片选)引脚始终为低的情况,16-Bit模式用于片选引脚由单片机IO控制的情况。
32-Bit模式
32-Bit模式下CS引脚可以一直保持为低,节省一个IO口。32-Bit模式可以细分为两种,一种是把设置寄存器(16bit)写入两次,一种是写入一次后第二次(后16bit)写0。
读取到的数据只有一种格式,前16位为转换寄存器中储存的上次转换的值,后16位为刚才写入的寄存器设置。在每次完成32-Bit通信后,DOUT/DRDY引脚再次拉低时代表下一次AD采集已完成,可以读取数据。
16-Bit模式
16-Bit模式要求在每两次通信之间CS(片选)引脚要拉高一次。每次通信可写入16bit的配置寄存器值和读取到16bit的转换寄存器值。
ADS1118数据格式
电压采集数据格式
ADS1118采用补码的数据格式,采集电压时,读取到的16bit数据可以直接赋给C语言中的short(有符号16bit整数)类型然后根据量程乘以比例系数得到电压值。量程和比例系数表如下。
量程 | 比例系数 |
---|---|
±6.144V | 187.5μV |
±4.096V | 125μV |
±2.048V | 62.5μV |
±1.024V | 31.25μV |
±0.512V | 15.625μV |
±0.256V | 7.8125μV |
温度采集数据格式
ADS1118通信得到的16位温度数据中只有高14位有效(低两位永远为0),为一个14位有符号整数。在处理过程中可以将数据先按照无符号数向右位移(>>)2位,再判断第14位是否为1(1则表示温度为负),若为1则减一转化为反码,在将低13位按位取反得到原码,再取负,就能将其转化为16位有符号整数(short)直接进行下一步运算。参考C语言程序如下:
val = ((unsigned short)val) >> 2;//温度数据高十四位有效
if(val & 0x2000){//温度数据第十四位表明是否为负数
unsigned short temp = ((unsigned short)val) ^ 0x2000;//第十四位清零
temp = temp-1;//转换为反码
temp = (~temp)&0x1FFF; //低十三位按位取反得原码
val = -temp; //重新取负转换为十六位的补码格式
}
测试代码
包含ADS1118.c和ADS1118.h,封装了4个通道单端采集函数和温度采集函数,采用模拟全双工SPI,STM32 HAL库风格,移植的朋友需要改一下ADS1118_ReadWrite。