ads1118实现热电偶测温

文章目录

  • ads1118实现热电偶测温
  • 前言
  • 一、热电偶是什么及测温原理
  • 二、热电偶测温流程
    • 1.用到的基本公式及基本流程:
    • 2.ADS1118读取数据:
    • 3.温度转换

前言

ads1118实现热电偶测温。内容包括:了解热电偶的基本原理;ads1118的adc转换及原理;电偶测试实现;滤波算法


一、热电偶是什么及测温原理

热电偶测温利用的是“热效应”的原理。当有两种不同的导体或者半导体A和B组成一个回路,其两端相互连接时,只要两节点处的温度不同,就会形成电动势,这两个端分别称为“冷端”、“工作端”。因而我们要实现一个完整的热电偶测量过程,就需要测量工作端的ADC值和冷端的温度值。

二、热电偶测温流程

1.用到的基本公式及基本流程:

Created with Raphaël 2.2.0开始启动设置ADS1118初始化启动测量ads1118的ADC并且转化成电压V1启动测试ads1118的内部温度程序查表:热电偶的电压温度转换表(网上能查找到)内部温度T0转化电压V0,V=(V1+V0)[这个为冷端补偿过程]查表将V转换为温度T就是最终的温度了。如果要细化的小数位,一度内的数据线性比例求值就好。

2.ADS1118读取数据:

ADS1118的通讯接口是SPI,SPI的通讯原理及过程就不在这里赘述了。ADS1118内部集成东西比较多,内部温度、可编程运放、16位的ADC,并且设置过程比较简单,里面只有一个寄存器。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021021309252434.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2NjAwNjgy,size_16,color_FFFFFF,t_70)

实现代码如下:

//read once to get data
/********************************************************** @function  Ads1118_ReadData_one* @role      读取一组数据* @input     none* @output    none* @return    none********************************************************/
void Ads1118_ReadData_one(unsigned int* ReadBDate)
{unsigned int temp,temp1,temp2;ads_spi_sck_off();ads1118_delay(10);ads_spi_cs_off();ads1118_delay(50);if(FistEn==1)//the fist time no data to conver{if(ads_spi_do()==1)while(ads_spi_do());}else{FistEn=1;}temp1=Ads_SpiReadU16(0x8ffb);//T command now is AD,and next is T//temp1=ReadU16(0x8f9b);//T command now is AD,and next is TReadBDate[0]=temp1;ads_spi_cs_on();//temp=ReadU16(0xffff);ads1118_delay(50);ads_spi_sck_off();ads1118_delay(10);ads_spi_cs_off();if(ads_spi_do()==1)while(ads_spi_do());temp2=Ads_SpiReadU16(0x8feb);//AD command now is T,and next is AD  0x8feb//temp2=ReadU16(0x8f8b);//AD command now is T,and next is ADReadBDate[1]=temp2;ads_spi_cs_on();ads1118_delay(50);ads_spi_sck_off();ads1118_delay(10);ads_spi_cs_off();if(ads_spi_do()==1)while(ads_spi_do());temp2=Ads_SpiReadU16(0xBfeb);//AD command now is T,and next is AD,start ant2ReadBDate[2]=temp2;ads_spi_cs_on();
}/********************************************************** @function  Ads1118_ReadData* @role      读取一次数据* @input     none* @output    通道2的adc,内部温度,通道1的adc* @return    none********************************************************/
unsigned int Ads1118_ReadData(unsigned int* ReadBDate)
{char i ,j;int Data_1[DataCout];int Data_2[DataCout];int Data_3[DataCout];unsigned int TemData[3];long  temd;//unsigned int dataCou=20;for(i=0;i<DataCout;i++){Ads1118_ReadData_one(TemData);Data_1[i] = TemData[0];Data_2[i] = TemData[1];Data_3[i] = TemData[2];}for(i=DataCout-1;i>0;i--){for(j=0;j<i;j++){if( Data_1[j+1] > Data_1[j] ) {TemData[0]  =Data_1[j+1];Data_1[j+1] =Data_1[j];Data_1[j]   =TemData[0];}}}temd=0;for(i=0;i<(DataCout-6);i++){temd+=(long ) Data_1[i+3];}ReadBDate[0]=temd/(DataCout-6);//ReadBDate[0]=Data_1[5];for(i=DataCout-1;i>0;i--){for(j=0;j<i;j++){if(Data_2[j+1]>Data_2[j]) {TemData[1]  =Data_2[j+1];Data_2[j+1] =Data_2[j];Data_2[j]   =TemData[1];}}}temd=0;for(i=0;i<(DataCout-6);i++){temd +=(long )Data_2[i+3];}ReadBDate[1]= temd/(DataCout-6)  ;for(i=DataCout-1;i>0;i--){for(j=0;j<i;j++){if(Data_3[j+1]>Data_3[j]) {TemData[1]  =Data_3[j+1];Data_3[j+1] =Data_3[j];Data_3[j]   =TemData[1];}}}temd=0;for(i=0;i<(DataCout-6);i++){temd +=(long )Data_3[i+3];}ReadBDate[2]= temd/(DataCout-6)  ;//ReadBDate[1]=Data_2[5];return 0;}

3.温度转换

代码如下:

/********************************************************** @function  Conver_to_T* @role      传感器热电偶温度转换* @input     none* @output    none* @return    none********************************************************/
long Conver_to_T(unsigned int coldJT,unsigned int TU,unsigned char Dire)
{   unsigned int i;//,GetT;long GetT;unsigned int ColdJU,NewTU;ColdJU=ThermocoupleCV[(coldJT/100)+1]+(coldJT%100+1)*4/10;// (coldJT%100)/40*100if(Dire)NewTU=ColdJU+TU;   //positive voltageelse                    //negative voltage{if(ColdJU>=TU){NewTU=ColdJU-TU;      }else{NewTU=TU-ColdJU;  }}if(NewTU>50){GetT=NewTU/50;}else{GetT=0;}if( (Dire==0) && (ColdJU<TU) ) //<0{for(i=GetT;(NewTU>ThermocoupleCV_Cold[i]);i++);if(i==0) i++;GetT=i-1;GetT*=100;GetT+=( NewTU-ThermocoupleCV_Cold[i-1] )*100 / ( ThermocoupleCV_Cold[i]-ThermocoupleCV_Cold[i-1] );//make it's valuse close to device only. It could be delete,if want to more close to real.GetT+=(i-1)/2;GetT+=50;// e=ax+y;a=0.5,b=0.5//make it's valuse close to devicereturn GetT;  //real T*100}else{for(i=GetT;(NewTU>ThermocoupleCV[i]);i++);if(i==0) i++;GetT=i-1;GetT*=100;GetT+=( NewTU-ThermocoupleCV[i-1] )*100 / ( ThermocoupleCV[i]-ThermocoupleCV[i-1] );//make it's valuse close to device only. It could be delete,if want to more close to real.GetT+=(i-1)/100*10;if(GetT>=50)GetT-=50;// e=ax+y;a=1,b=-0.5 //make it's valuse close to devicereturn GetT;  //real T*100}}/********************************************************** @function  RegValueToTemp* @role      传感器值转换最终温度* @input     none* @output    none* @return    none********************************************************/
int RegValueToTemp(unsigned int RegValueCodeT,unsigned int RegValueADC)
{unsigned int McoldJT=0,MJU=0,tem=0;int RealT=0;RegValueCodeT>>=2;RegValueCodeT&=0xfff0;tem=RegValueCodeT*3;//conver to T number  *100   /* 数据只有14位且左对齐 0.03125约等于0.03 */McoldJT=tem;if(RegValueADC&0x8000){RegValueADC=~RegValueADC;RegValueADC=RegValueADC+2;RegValueADC&=0x7fff;//     tem-=(long)RegValueADC*781/40;
//      tem-=5;
//      tem/=10;/ negative voltage//new conver//McoldJT+=50;//McoldJT/=100;MJU=((long)RegValueADC*781+50)/100;RealT=Conver_to_T(McoldJT,MJU,0);  //had real T*100}else{//      tem+=(long)RegValueADC*781/40;//AdData[0]*700/40
//      tem+=5;
//      tem/=10;/ //positive voltage//new conver//McoldJT+=50;//McoldJT/=100;MJU=((long)RegValueADC*781+50)/100;RealT=Conver_to_T(McoldJT,MJU,1); //had real T*100}return RealT;}

最后附上stm32的spi驱动参考:

void ads1118_delay(unsigned char i)
{i=i*10;while(i--);
}/********************************************************** @function  GpioCfg* @role      配置管脚* @input     none* @output    none* @return    none********************************************************/
static void GpioCfg_out( GPIO_TypeDef* GPIO,uint32_t Pin)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIO, &GPIO_InitStruct);
}/********************************************************** @function  GpioCfg* @role      配置管脚* @input     none* @output    none* @return    none********************************************************/
static void GpioCfg_int( GPIO_TypeDef* GPIO,uint32_t Pin)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIO, &GPIO_InitStruct);
}/********************************************************** @function  ads1118_ioCnofig* @role      管脚配置初始化* @input     none* @output    none* @return    none********************************************************/
void ads1118_ioCnofig(void)
{ADS_SPI_CS_PIN_CLK_EN();ADS_SPI_DI_PIN_CLK_EN();ADS_SPI_DO_PIN_CLK_EN();ADS_SPI_SCK_PIN_CLK_EN();GpioCfg_out(ADS_SPI_CS_PIN);GpioCfg_out(ADS_SPI_DO_PIN);GpioCfg_out(ADS_SPI_SCK_PIN);GpioCfg_int(ADS_SPI_DI_PIN);
}
/*
#define ads_spi_cs  P2.1
#define ads_spi_di  P2.2
#define ads_spi_do  P14.7
#define ads_spi_sck P2.0
*//********************************************************** @function  Ads_SpiReadU16* @role      spi的时序* @input     none* @output    none* @return    none********************************************************/
unsigned int Ads_SpiReadU16(unsigned int Cmd)
{char i;unsigned int temp=0;for(i=0;i<16;i++){temp<<=1;ads_spi_sck_on();if(Cmd&0x8000)ads_spi_di_on();else ads_spi_di_off();ads1118_delay(10);ads_spi_sck_off();if(ads_spi_do())temp|=1;ads1118_delay(10);Cmd<<=1;}return temp;
}

最后要说明一下:我这里只加了中值滤波算法,实际产品中还会加入惯性滤波算法,使显示结果更加平稳。

ads1118实现热电偶测温相关推荐

  1. ​热电偶测温电路图(一)​

    高精度热电偶测温电路图 此设计概括了提供传感器诊断所必需的抗混叠滤波器和偏置电阻器.此示例还提供了一种新颖的方式,即使用ADS1118上的板载温度传感器完成对系统的冷端补偿.对于热电偶线性化,此设计还 ...

  2. 热电偶测温电路Multisim仿真及故障字典建立

    一.热电偶测温原理 1.简介 热电偶(thermocouple)是温度测量中常用的测温元件,它直接测量温度,并把温度信号转换成热电动势信号,通过电气仪表(二次仪表)转换成被测介质的温度. 2.热电势形 ...

  3. 基于op07的k型热电偶测量电路_k型热电偶测温电路图解析

    K型热电偶是一种温度传感器,K型热电偶通常和显示仪表,记录仪表和电子调节器配套使用.K型热电偶通常由感温元件.安装固定装置和接线盒等主要部件组成. k型热电偶 K型热电偶作为一种温度传感器,K型热电偶 ...

  4. MAX6675 带冷端补偿的热电偶测温芯片驱动-基于STM32 HAL库

    MAX6675 简介 MAX6675 是一款带冷端补偿的热电偶测温芯片,通过3线SPI总线直接输出热电偶测量温度值. 引脚如下: 与单片机连接关系如下: 通信时序与数据格式如下: MAX6675 驱动 ...

  5. 基于STM32单片机的K型热电偶测温(Proteus仿真+程序)

    编号:17 基于STM32单片机的K型热电偶测温 功能描述: 本设计由STM32单片机+MAX7765+TCK热电偶+1602液晶显示模块组成. 1.主控制器是STM32单片机 2.TCK热电偶测温通 ...

  6. 基于MAX6675的k型热电偶测温系统

    基于MAX6675的k型热电偶测温系统 亲测 本人亲测代码有效 测温整数误差控制在0摄氏度 如果所显示和实际误差相差25摄氏度 请在仿真中点击MAX6675属性调节把环境温度改为0 即k型热电偶冷端温 ...

  7. 基于单片机的热电偶测温仿真设计(#0004)

    在工农业生产中, 温度检测及其控制占有举足轻重的地位, 随着现代信息技术的飞速发展和传统工业改造的逐步实现 , 能够独立工作的温度检测和显示系统已经应用于诸多领域. 功能描述 1.采用51单片机作为主 ...

  8. 基于单片机的PT100热电偶测温仿真设计(#0002)

    功能描述 采用51单片机作为主控单元芯片: 采用PT100热电偶检测温度,测量范围:-50℃~200℃: 采用LM324作为信号放大电路: 采用ADC0804芯片对温度信号进行AD模数转换处理: 采用 ...

  9. 【检测技术】之热电偶测温

    理论基础:热电效应 把两种不同的导体或半导体连接成闭合回路将他们的两个接点分别置于温度TTT和T0T_0T0​则在该回路中就会产生热电势,可用EAB=(T,T0)E_{AB} =(T, T_0)EAB ...

最新文章

  1. Ollydbg 编写脚本的一些语法及例子(OD脚本)
  2. 深度学习: mAP (Mean Average Precision)
  3. 多级联动下拉菜单插件:jquery.cxselect.js
  4. jvm性能调优实战 - 48无限循环调用和没有缓存的动态代理引起的OOM
  5. iOS: 让自定义控件适应Autolayout注意的问题
  6. OPENCV-5 学习笔记
  7. 初始化linux-nginx的安装和使用
  8. oracle dba_waiters中的lockid是什么,查杀oracle lock session and table
  9. easyPR源码解析之chars_segment.h
  10. js变量显示在html中_PythonDjango+JS+Ajax实现网页采集并动态显示PLC变量
  11. 变量的命名规则与惯例
  12. KVC、谓词、单例设计模式
  13. OpenGL入门教程
  14. 小麦亩产一千八(kela)
  15. python如何设置画布开始位置_Python用Turtle绘图,原来如此简单
  16. ubuntu18基本软件安装
  17. 美联储周三无惊喜,降息25个基点:再次获川普严重批评
  18. 淘宝开店首页装修教程分享
  19. 谷歌研究——四足机器人模仿动物动作
  20. 创建自己的Docker映像(技术提示#57)

热门文章

  1. 官宣!KubeCon+CloudNativeCon荣耀回归
  2. alsa ubuntu声卡驱动重新安装
  3. Java中if语句:判断某年是否是闰年,闰年条件:能整除4且不能整除100,或者可以被400整除。
  4. 科目三 补考 注意事项
  5. 翻译接口yandex注册步骤
  6. 智力注意力训练亲子游戏
  7. keepalived实现vip的原理简析
  8. 山东省第四届ACM大学生程序设计竞赛 Thrall’s Dream(单源强连通分量)
  9. 关于MCSE2003认证
  10. 利用POI 从Excel取图,自动制作PPT