ADS1118 作为常用温度测量芯片被越来越多的开发者熟知,TI官方给出的是基于 MSP430 的驱动测试程序,由于 STM32 的普及,闲暇中移植了 MSP430 的 ADS1118 驱动程序到 STM32F103 平台下,并进行了测试,特在此记录,以飨读者。
使用 STM32F103 的 SPI2 接口连接 ADS1118 的通信接口:
STM32F103|ADS1118
—|—|—|
PB12|CS
PB13|SCLK
PB14|DOUT
PB15|DIN
ADS1118 手册建议数据线之间接一个50欧电阻,实际测试可不接。ADS1118 电源接3.3V并加滤波电容。
SPI 配置
ADS1118 接口的时序要求如图:
DIN 接口接收控制器送过来的配置数据,并且在 SCLK 的下降沿将数据锁存读入 ADS1118 内部,并且在 SCLK 的上升沿中将数据送出到 DOUT。基于此将 STM32F103 的 SPI 接口做如下配置,CPOL=0,CPHA = 1;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
void SPI_config(void){ SPI_Cmd(SPI_MASTER, DISABLE);//配置之前先关闭SPI接口
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//主模式 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8bits SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;// CPOL=0 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//CPHA=1 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//CS设置为软件配置 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;//通信速率 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//高位在前 SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI_MASTER, &SPI_InitStructure);
SPI_Cmd(SPI_MASTER, ENABLE);//配置完成使能SPI接口 }
|
对应 GPIO 的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
void SPI_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;
/* Configure SPI_MASTER pins-*/
// Pin PB13 (SCLK) must be configured as as 50MHz push pull GPIO_StructInit( GPIO_InitStructure.GPIO_Pin = SPI_MASTER_PIN_SCK; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SPI_MASTER_GPIO,
// Pin PB14 (MISO) must be configured as as input pull-up GPIO_StructInit( GPIO_InitStructure.GPIO_Pin = SPI_MASTER_PIN_MISO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(SPI_MASTER_GPIO,
// Pin PB15 (MOSI) must be configured as as 50MHz push pull GPIO_StructInit( GPIO_InitStructure.GPIO_Pin = SPI_MASTER_PIN_MOSI; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SPI_MASTER_GPIO, &GPIO_InitStructure);
//SPI1 NSS GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = SPI_MASTER_PIN_NSS; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(SPI_MASTER_GPIO, &GPIO_InitStructure);
GPIO_SetBits(SPI_MASTER_GPIO, SPI_MASTER_PIN_NSS); }
|
另外记得使能端口时钟:
1 2 3 4 5 6
|
void (void){ /* Enable GPIO clock for SPI_MASTER */ RCC_APB2PeriphClockCmd(SPI_MASTER_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE); /* Enable SPI_MASTER Periph clock */ RCC_APB1PeriphClockCmd(SPI_MASTER_CLK, ENABLE); }
|
读写实现
ADS1118 在发送寄存器配置的同时会传输转换结果,手册中提到既支持16bits 模式也支持32bits模式。
16bits模式:
32bits模式:
DIN 接口接收寄存器配置的同时DOUT接口输出转换结果,在32bits模式下发送完寄存器配置后第二次可以发送数据0,具体可参考手册。基于此设计数据发送读取函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
//读写寄存器16bits模式 uint16_t SPI_read_write_Reg(uint16_t CofigReg) {
getdata1=SPI_send_Byte((uint8_t)(CofigReg>>8)); getdata2=SPI_send_Byte((uint8_t)CofigReg);
getdata= (uint16_t)getdata2|((uint16_t)getdata1<<8);
return getdata; } uint8_t SPI_send_Byte(uint8_t byte) {
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}
SPI_I2S_SendData(SPI2, byte);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){}
return SPI_I2S_ReceiveData(SPI2); }
|
获取 ADS1118 的片内温度需要将 ADS1118 的寄存器的第4bit修改为1,启动单次转换将第15bit写1即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 大专栏 STM32F103驱动ADS1118/pre> |
float ads1118_get_temperature(void) { uint16_t adc=0; float value=0; adsConfigReg.stru.NOP = DATA_VALID; adsConfigReg.stru.TS_MODE = TEMPERATURE_MODE; adsConfigReg.stru.DR = DR_8_SPS; adsConfigReg.stru.MODE = SIGNLE_SHOT; adsConfigReg.stru.OS = SINGLE_CONVER_START;
ADS1118_ENABLE;
adc = SPI_read_write_Reg(adsConfigReg.word);
//conver to temperture if(adc&0x8000) { //-xx.xxx c adc>>=2; value=(0x3fff-adc+1)*(-0.03125); } else { //+xx.xxx c adc>>=2; value=adc*0.03125; } ADS1118_DISABLE; return value; }
|
ADS1118默认开启ADC模式,通过配置寄存器的12-14bit可以选择开启哪个通道,具体可参考手册。另外关于片内温度模式时,使用的是14bit左对齐模式。而且ADS1118的转换结果中,负数使用二进制补码格式,因此需要做一个转换,每个值代表0.03125℃,测试中的SPI通信数据:
热电偶
ADS1118 可以使用差分方式连接两路热电偶温度传感器,本篇也是参考了TI官方文档 使用ADS1118进行精密热电偶测量。冷端温度读取片内温度即可,将片内温度转换成热电偶对应的电压,然后加上热端获取的电压值,反向查表即可获取热电偶温度值。实际测试时使用的是K型热电偶,从网上查到K型热电偶的温度电压对应表,进行查表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
type_k_thermo_lookup_table type_k_thermo_lookup[16] = { {-200,-5.891}, {-100,-3.554}, {0,0}, {100,4.096}, {200,8.138}, {300,12.209}, {400,16.397}, {500,20.644}, {600,24.905}, {700,29.129}, {800,33.275}, {900,37.326}, {1000,41.276}, {1100,45.119}, {1200,48.838}, {1300,52.410} };
|
测试时冷端温度一般高于室内温度2摄氏度左右,因为芯片内部发热所致,获取差分输入的代码设置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
uint16_t ads1118_get_differential_0_1(uint8_t PGA) { uint16_t adc=0;
ADS_InitTypeDef ConfigReg;
ConfigReg.stru.NOP = DATA_VALID; ConfigReg.stru.TS_MODE = ADC_MODE; ConfigReg.stru.DR = DR_860_SPS; ConfigReg.stru.PGA = PGA; ConfigReg.stru.MODE = SIGNLE_SHOT; ConfigReg.stru.OS = SINGLE_CONVER_START; //high ConfigReg.stru.MUX = AINPN_0_1; ConfigReg.stru.PULLUP = PULL_UP_EN; ConfigReg.stru.RESV = CONFIG_BIT_RESV; ADS1118_ENABLE; delay_us((uint32_t)1); adc = SPI_read_write_Reg(ConfigReg.word);
ADS1118_DISABLE; delay_ms(1); ADS1118_ENABLE; ConfigReg.stru.NOP = DATA_INVALID; ConfigReg.stru.TS_MODE = ADC_MODE; ConfigReg.stru.DR = DR_860_SPS; ConfigReg.stru.PGA = PGA; ConfigReg.stru.MODE = SIGNLE_SHOT; ConfigReg.stru.OS = SINGLE_CONVER_START; //high ConfigReg.stru.MUX = AINPN_0_1; ConfigReg.stru.PULLUP = PULL_UP_EN; ConfigReg.stru.RESV = CONFIG_BIT_RESV; delay_us((uint32_t)1);
//等待Dout给出数据有效信号--从高变低 while(GPIO_ReadInputDataBit(SPI_MASTER_GPIO,SPI_MASTER_PIN_MISO)); adc = SPI_read_write_Reg(ConfigReg.word); delay_us(1); ADS1118_DISABLE; return adc; }
|
实际测试时,温度精度在2摄氏度左右,并没有达到TI官方公布的精度,在硬件电路方面有待进一步提高。全部源码后续会放出。
- STM32F103驱动GT911
0x00 引脚连接: // SCL-------PB10 // SDA-------PB11 // INT--------PB1 // RST--------PB2 IIC的SCL与SDA需要接上拉电 ...
- 电赛总结(四)——波形发生芯片总结之AD9834
一.特性参数 1.2.3V~5.5V供电 2.输出频率高达37.5MHz 3.正弦波.三角波输出 4.提供相位调制和频率调制功能 5.除非另有说明,VDD = 2.3 V至5.5 V,AGND = D ...
- FLASH 存储学习-串行SPI NOR FLASH
1.1 SST25VF080B简介1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. l 容量:8MBit: l 最高SPI时钟频率:50MHz: l 低功耗模式下电流消耗:5uA ...
- FLASH 存储学习-串行SPI nor
1.1 SST25VF080B简介 1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. 容量:8MBit: 最高SPI时钟频率:50MHz: 低功耗模式下电流消耗:5uA,正常读模 ...
- STM32-串行SPI nor
源:FLASH 存储学习-串行SPI nor 1.1 SST25VF080B简介1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. l 容量:8MBit: l 最高SPI时钟频率: ...
- 从FPGA搞定OV7670 VGA显示 移植到 STM32F10x TFT显示 总结及疑问(高手请进)
OV7670不愧是最便宜的摄像头了最大显示像素:640*480(在VGA显示器上显示效果还不赖,用usb模块采集显示依然显著) 第一步:VGA显示 视频图像(实时)FPGA+SDRAM+OV7670= ...
- STM32F103 USB虚拟串口 驱动例程移植
1)驱动下载及安装.目前ST公司支持WIN7版本号为:VCP_V1.3.1_Setup.exe (在官网上搜索stsw-stm32102即是了):先安装驱动后再插入USB不然安装不成功. 2)固件下载 ...
- 如何为编程爱好者设计一款好玩的智能硬件(八)——LCD1602点阵字符型液晶显示模块驱动封装(中)
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- STM32F103的11个定时器详解(转)
源:STM32F103的11个定时器详解 STM32F103系列的单片机一共有11个定时器,其中:2个高级定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器 出去看门狗定时器和系统滴 ...
随机推荐
- C++ lock_guard 互斥锁
概述根据对象的析构函数自动调用的原理,c++11推出了std::lock_guard自动释放锁,其原理是:声明一个局部的lock_guard对象,在其构造函数中进行加锁,在其析构函数中进行解锁.最终的 ...
- RDD(二)——创建
RDD的创建 1)从内存中创建 从集合中创建RDD,Spark主要提供了两种函数:parallelize和makeRDD val raw: RDD[Int] = sc.parallelize(1 to ...
- Python基础——类new方法与单例模式
介绍: new方法是类中魔术方法之一,他的作用是给类实例化开辟一个内存地址,并返回一个实例化,再由__init__对这个实例进行初始化,故它的执行肯定就是在初始化方法__init__之前了.new方法 ...
- Gitbook在 Mac 环境上的安装及使用
一.在 Mac 环境上搭建 gitbook #.安装node.js,在node.js官网下载,直接安装稳定版本. https://nodejs.org/en/ #.检测 node.js 是否安装成功 ...
- liquibase 注意事项
liquibase 一个changelog中有多个sql语句时,如果后边报错,前边的sql执行成功后是不会回滚的,所以最好分开写sql <changeSet author="lihao ...
- skip-list(跳表)原理及C++代码实现
跳表是一个很有意思的数据结构,它实现简单,但是性能又可以和平衡二叉搜索树差不多. 据MIT公开课上教授的讲解,它的想法和纽约地铁有异曲同工之妙,简而言之就是不断地增加“快线”,从而降低时间复杂度. 当 ...
- HDU-4578 Transformation(线段树的多种区间操作)
http://acm.hdu.edu.cn/showproblem.php?pid=4578 Time Limit: 15000/8000 MS (Java/Others) Memory Lim ...
- day26-socket(server和client通信)
# socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口.它把复杂的TCP/IP协议隐藏到socket #接口的后面,让socket去组织数据,以符合指定的协议. # socket ...
- css后续篇
5.盒模型 在css中,box model这一术语是用来设计和布局时使用的,在网页中显示一些方方正正的盒子,这种盒子就叫盒模型 盒模型有两种: 标准模型和IE模型(了解) 盒模型属性 width : ...
- 用Kinect为听障人士架一座沟通的桥梁
编者按:这是微软亚洲研究院和中国科学院共同进行的一个合作项目,希望通过使用Kinect来帮助提升手语的识别率,从而为听力受损的残障人士(以下简称听障人士)架起一座与外界沟通的桥梁. 文章译自:Digi ...