德州仪器的12位采样芯片ads1015调试

来源:互联网 发布:linux shell exit 1 编辑:程序博客网 时间:2024/05/01 19:32

一、使用背景

       公司产品需要用到ad采样芯片,由于采样路数较多且分布比较分散,检测的是电平值,变化率较慢,所以想选择分辨率高、体积小、最好是iic接口的芯片。因为个人比较喜欢德州仪器这个公司,所以就先去TI的官网上查询了一番。一番查询,发现了ads1015芯片还是比较适合的,12位的分辨率,能有4路输入,iic接口。所以下载了该芯片的datasheet,仔细阅读一看,发现居然有更多惊喜!!这款芯片内置震荡源,内置参考电压源,而且内置PGA(可编程增益控制器),也就是说,在检测电平较小的情况下,通过调节PGA单元,可以适当将信号放大,这样以增加检测精度。去淘宝简单查询了价格,一片大概15元左右,心中一喜,就这么愉快地决定了。


二、调试过程

       芯片回来后,第一时间拿到手里,芯片很小,引脚也很密。焊上板子后,就开始调试了。通过datasheet可知,这个芯片用的是标准的iic接口。我是用单片机GPIO模拟的iic口,去读写芯片。iic通信,首先要弄清楚器件的地址,ads1015设定地址的方式很巧妙。ads1015有一个专门的addr引脚,这个引脚可以分别和VDD、GND、SDA、SCL相连,分别可以得到4个不同的器件地址(详见datasheet)。地址确定后,就要开始初步调试,尝试读取芯片内部某个可读寄存器的值,看看读出的值是否和datasheet内部写的一致。

一开始iic的时序不对,浪费了一点时间。确定好iic时序正确后,尝试读取ads1015内部的寄存器。ads1015内部寄存器数量只有4个,分别是8位的pointer寄存器,用于指明要写的寄存器位置,16位的配置寄存器,16位的转换寄存器(用于存放转换结果),至于这些寄存器每一位的作用,详见datasheet(http://www.ti.com.cn/product/cn/ads1015)。

     这里有个需要注意的地方,也是我调试花费最多的地方,就是,存放转换数据的寄存器有16位,而转换结果是12位的,而且是带有符号位的,是以二进制补码的形式读取的。数据寄存器的高12位是有效的,低四位不做数据用。问题就在这,datasheet里说明,系统上电之后自动复位,数据寄存器全部清零,置‘0’,在图表里,D0~D3的空格里填写的都是‘0’。见下图:


问题就出在这!这是说明这低四位,在任意时候读取出来都是0吗?这个文档里没有明确说明,但是按照描述的样子应该是的。所以,一开始我一直按照这一假设进行调试,因为,只要我读取这个寄存器,读到的最后四位都是零,就表明我的程序已经能够访问这个芯片了。但是,每次读取,后四位都不是0,这是为什么?我百思不得其解。没办法,拿来示波器,直接看波形!!

   示波器看出,我读取ads1015,它确实有输出了,但是波形上看,最后四位并不是全是0,也不全是1,而且每次还不太一样。就在困惑之际,我想除了这个数据寄存器之外,还有其他可读的寄存器,比如配置寄存器config寄存器,接着我配置了几次不同的值进去,然后再读取这个寄存器,用示波器看ads1015输出的波形是与我配置进芯片的数据是一致的!!

     得到这个结果,我踏实了许多,这说明我写的模拟iic通信协议是正确的,而且已经能够访问到芯片内部,那么既然文档没有明确说,低四位一定是0,那么有可能是不定的吧,但是不定的话,为什么不在对应的位置上打个“X”呢?直接写‘0’,给人感觉就是固定的。不管了,把读出数据转化成int型,然后通电加电压信号上去,看读出的值会不会跟着变化吧。

    结果看到取出高12位后,发现器件输出的值就是对应的ad转换后的值,当然这里有个主意的地方,寄存器里存储的数据是二进制补码的形式,包含一位符号位,所以,在读取之后,直接在程序里将值赋给一个int型的变量,那么不用做转换,这个变量直接就是正确的数值了,直接可以参与数学运算等。

    所以,这次调试最重要的是读取数据手册的重要性,特别是这类功能强大,模式多的芯片,偶然发现这个芯片在安卓源代码里有有专门的一份驱动,可见这个芯片并不是很冷门的,是一款很典型很强大的adc芯片。

    最后希望这篇日志,对其他正在调试ads1015的朋友有帮助!




0 0
原创粉丝点击