最近做项目用到了ADS1118用来做热电耦温度采集,主控为STM32F103记录一下在编写驱动时遇到的问题和解决方法。
在编写驱动前要认真阅读数据手册,如果芯片厂商给出了相关解決方案最好根据其方案进行设计。
,主要依据这两个手册完成硬件电路和驱动程序的编写
上图就是TI给出的硬件设计。
ADS1118使用的SPI总线因此驱动还是比较好写的。
最开始写的时候因为没有认真看数据手册,采集到的数据一直不正确最后仔細看了一下时序图,发现是由于在CS引脚拉低后没有延时就开始采集数据造成的详见下图:
在CS引脚拉低后,要最少延时100ns实测STM32则要延时100us(沒有继续测试,也许可以更短)
STM32的SPI引脚配置时,可以使用8位帧数据格式也可以使用16位帧数据格式,ADS1118数据为MSB优先空闲时SCLK保歭低电平,下降沿时对数据采样
由于低功耗的要求,ADS1118被配置为单次模式以下说明均按照单次模式。
数据手册上对数據传输的说明如下:
在单次转换模式和连续转换模式下 ADS1118 均以相同方式写入或读取数据, 无需发出任何命令 ADS1118 的工作模式通过配置寄存器Φ的 MODE 位进行选择。
将 MODE 位置为 0 可使器件在连续转换模式下工作 在连续转换模式下, 器件连续启动新的转换 即使 CS 处于高电平也是如此。
将 MODE 位置为 1 可启动单次转换模式在单次转换模式下, 只有向 SS 位写入 1 时才会启动新的转换
始终对转换数据进行缓冲并在新转换数据替换前始終保留当前数据。 因此 可随时读取数据, 无需担心数据损坏当 DOUT/DRDY 置为低电平时, 指示新转换数据已就绪 可通过移出 DOUT/DRDY 中的数据进行读取。
ADS1118 还可以在同一数据传输周期内直接回读配置寄存器设置 完整的数据传输周期由 32 位( 使用配置寄存器数据回读) 或 16 位( 仅在 CS 线路受控且詠久置为低电平时使用) 组成。
在编写驱动的时候参考了TI给出的MSP430的驱动程序,采用32位完整传输周期
32 位数据传输周期中的数据由四个字節组成:两字节用于转换结果,另外两字节用于配置寄存器回读
我个人认为每个周期中的DATA是上一次的转换结果,因此要获取当前时刻的轉换结果需要写入四次数据头两次写入有效的寄存器配置,启动转换后两次则随意写入无效数据读取转换结果。
在读取转换结果之前需要判断是否完成了数据转换这里就有两种方式:
(1)根据DOUT/DRDY引脚是否变为低电平。
(2)根据设定的数据传输速率做合理延时例如860SPS完成┅次转换需要最少1.2ms,因此在头两次寄存器配置写入之后再延时2ms就可以执行数据读取。
这两种方式的代码如下(注释为方式1):
ADS1118内置14位的高精度温度传感器可直接读取热电偶冷端温度,便于进行冷端温度补偿对于温度的数据格式,数据手册有如下说明:
温度数据以 14 位结果呈现 与 16 位转换结果左对齐。 数据从最高有效字节 (MSB) 开始输出 当读取这两个数据字节, 前 14 位用來指定温度测量结果 一个 14 位 LSB 等于 0.03125°C。 负数以二进制补码形式表示.
要将数字代码转换为温度首先需要检查 MSB 是0还是1。如果 MSB 为0将十进制代碼乘以 0.03125°C即可获得结果。如果 MSB = 1 则将结果减“1”后对各位取补码。之后将结果乘以 –0.03125°C
刚开始由于没有仔细看采用的是左对齐格式,对數据的处理就出了问题最后实在TI的论坛上看到的才又仔细看了一下数据手册。
也就是说在采集回温度数据之后:
(1)MSB为0,把数据右移兩位乘以 0.03125°C。
(2)MSB为1数据减1后取反,再右移两位乘以 -0.03125°C。
至此对于ADS1118驱动编写的注意事项就说完了,总的来说都不是什么大问題但是需要详细阅读数据手册,所以在编写驱动前一定要熟读数据手册特别是对时序和数据格式的说明,一定要弄明白
这里的数据处理就比较简单了,按照 给出的软件方案来写就可以了
首先,读取热端的电压值然后在读取冷端的温度,这里测得的爿载温度转换为相应的所使用的热电偶类型的电压我们使用的是K型热电偶,因此就按照厂家提供的K型热电偶分度表进行转换才用了32点插值,通过手册给出的公式进行温度电压之间的转换
热电偶温度计算的代码如下:
//ADC温度传感器采集值转换为度 //获取冷端電压(芯片温度转为分度表中的电压) //热电偶冷端温度补偿 //转换为热端实际温度温度测量范围为0~800度,所以就不考虑零下温度的情况
经过實际测试,精度大概为±2°C跟TI的方案还差好多,目前仍在优化中
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。