ADS1118 做为经常使用温度测量芯片被愈来愈多的开发者熟知,TI官方给出的是基于 MSP430 的驱动测试程序,因为 STM32 的普及,闲暇中移植了 MSP430 的 ADS1118 驱动程序到 STM32F103 平台下,并进行了测试,特在此记录,以飨读者。函数
使用 STM32F103 的 SPI2 接口链接 ADS1118 的通讯接口:测试
STM32F103|ADS1118
—|—|—|
PB12|CS
PB13|SCLK
PB14|DOUT
PB15|DINui
ADS1118 手册建议数据线之间接一个50欧电阻,实际测试可不接。ADS1118 电源接3.3V并加滤波电容。spa
ADS1118 接口的时序要求如图:设计
DIN 接口接收控制器送过来的配置数据,而且在 SCLK 的降低沿将数据锁存读入 ADS1118 内部,而且在 SCLK 的上升沿中将数据送出到 DOUT。基于此将 STM32F103 的 SPI 接口作以下配置,CPOL=0,CPHA = 1;
3d
1 |
void SPI_config(void){ |
对应 GPIO 的配置:
code
1 |
void SPI_GPIO_Configuration(void) |
另外记得使能端口时钟:
blog
1 |
void (void){ |
ADS1118 在发送寄存器配置的同时会传输转换结果,手册中提到既支持16bits 模式也支持32bits模式。接口
16bits模式:ip
32bits模式:
DIN 接口接收寄存器配置的同时DOUT接口输出转换结果,在32bits模式下发送完寄存器配置后第二次能够发送数据0,具体可参考手册。基于此设计数据发送读取函数:
1 |
//读写寄存器16bits模式 |
获取 ADS1118 的片内温度须要将 ADS1118 的寄存器的第4bit修改成1,启动单次转换将第15bit写1便可:
1 |
float ads1118_get_temperature(void) |
ADS1118默认开启ADC模式,经过配置寄存器的12-14bit能够选择开启哪一个通道,具体可参考手册。另外关于片内温度模式时,使用的是14bit左对齐模式。并且ADS1118的转换结果中,负数使用二进制补码格式,所以须要作一个转换,每一个值表明0.03125℃,测试中的SPI通讯数据:
ADS1118 可使用差分方式链接两路热电偶温度传感器,本篇也是参考了TI官方文档 使用ADS1118进行精密热电偶测量。冷端温度读取片内温度便可,将片内温度转换成热电偶对应的电压,而后加上热端获取的电压值,反向查表便可获取热电偶温度值。实际测试时使用的是K型热电偶,从网上查到K型热电偶的温度电压对应表,进行查表:
1 |
type_k_thermo_lookup_table type_k_thermo_lookup[16] = { |
测试时冷端温度通常高于室内温度2摄氏度左右,由于芯片内部发热所致,获取差分输入的代码设置以下:
1 |
uint16_t ads1118_get_differential_0_1(uint8_t PGA) |
实际测试时,温度精度在2摄氏度左右,并无达到TI官方公布的精度,在硬件电路方面有待进一步提升。所有源码后续会放出。