一.明确ADS1018其2个寄存器的作用,并对其进行正确配置
一般SPI芯片编程步骤都是如此,先明确哪个是要读取数据的寄存器,哪个是用来起配置作用的寄存器,ADS1018就是一个典型的例子,其有2个寄存器,
1.Conversion Register转换结果寄存器
转换结果寄存器里有12位有效数据,左对齐格式,低4位预留,
2.Config Register配置寄存器
配置寄存器有15位有效数据,具体每位的功能,详见其手册描述,下面主要讲几个重要的配置位:
MUX[2:0]:采样通道选择配置模块,
序号 | MUX[2:0] | 手册描述 | 解释 |
1 | 000 | AINP is AIN0 and AINN is AIN1 (default) | AIN0管脚作为测量正极,AIN1作为测量负极 |
2 | 001 | AINP is AIN0 and AINN is AIN3 | AIN0管脚作为测量正极,AIN3作为测量负极 |
3 | 010 | AINP is AIN1 and AINN is AIN3 | AIN1管脚作为测量正极,AIN3作为测量负极 |
4 | 011 | AINP is AIN2 and AINN is AIN3 | AIN2管脚作为测量正极,AIN3作为测量负极 |
5 | 100 | AINP is AIN0 and AINN is GND | AIN0管脚作为测量正极,测量负极是GND |
6 | 101 | AINP is AIN1 and AINN is GND | AIN1管脚作为测量正极,测量负极是GND |
7 | 110 | AINP is AIN2 and AINN is GND | AIN2管脚作为测量正极,测量负极是GND |
8 | 111 | AINP is AIN3 and AINN is GND | AIN3管脚作为测量正极,测量负极是GND |
PGA[2:0]:最大测量量程选择配置模块
根据检测电路能够检测到的最大电压值,配置该寄存器,
学会上述2个配置模块后,其它配置采用另默认,基本就可以满足基本采样功能的使用了.
二.转换结果换算成真实采样电压值
FS表示最大测量量程值,下面以FS等于2.048V为例进行举例,
根据上表可知,当测量最大量程电压时,其转换结果寄存器值7FF0(HEX),由于其转换结果寄存器是左对方格式,所以其实际CODE应该是7FF0(HEX) >> 4 = 7FF(HEX) = 2047(DEC),
当测量电压值2.048/211= 0.001V=1mv时,其转换结果寄存器值0010(HEX),实际CODE是2;
测量电压值是0时,其转换结果寄存器值是0,
所以测量0~2.048V的电压时,其实际CODE值随着测量电压成正比增长,实际范围是:0~2047,OCDE范围:0~7FF0(H);
当测量电压值负2.048/211= -0.001V=-1mv时,其转换结果寄存器值FFF0(HEX),实际CODE是 4095;
当测量电压值是负的最大量程电压时,其转换结果寄存器值8000(HEX),实际CODE是 2048
所以测量0~-2.048V的电压时,其CODE值随着测量电压变大而变小,实际范围是:4095~2048,OCDE范围:FFF0~8000(H);
那么实际测量电压值的计算方式如下:
设转换结果寄存器CODE是X1;X1右移4位后的CODE值是X2,
最大测量量程电压值是V1,当前测量电压值是V2,
如果X2小于等于2047(测量电压是正电压)
V2 = (X2 * V1)/(7FF0 >> 4),即
V2= (X2 * V1) / 2047
如果X2大于2047(测量电压是负电压)
V2 = ((4095 - X2) * V1)/(7FF0 >> 4),即
V2 = ((4095 - X2) * V1)/2047
至此,完成了基本功能,实际测量电压就正确的读取出来了,满足了一些基本要求,
实际使用过程中,要随着实际使用情况,加一些偏移,以使读取结果更加准确.
================================================我是分割线======2017-9-2增加以下内容=====================================
自己按上述步骤编写程序,调试过程中出了点小问题,现在将问题现象总结一下,
自己用了一路SPI和多路ADS1018芯片进行通信,靠CPU控制ADS1018的CS信号,选择指定ADS1018进行通信,
首先读取单个ADS1018的转换结果时,没有问题,读取结果都正确,
问题来了,当读分时读取多个ADS1018的转换结果时,读取的转换结果在正确值和0之间跳动,
使用示波器测量发现读取多个芯片转换结果时,如读取芯片1的结果,此时芯片2的SDA管脚给出了低电平,导致芯片1的结果被影响,仔细阅读手册,发现这样现象的原因是对芯片使用方法的理解的不透彻,其过程应该是先发送读取指令,然后再读取结果,而不是自己一开始的发送指令的同时读取结果。
按上述方法修改程序,即可得到正确结果,分时读取多个ADS1018转换结果,也都能得到正确值了。遇到同样问题的小伙伴,可以按上述方法去解决。