一些时候,我们需要通过热电偶获取温度数据。在这里我们将讨论如何实现并使用MAX31855热电偶温度便送去的驱动问题。

1、功能概述

  MAX31855是具有冷端补偿,能将K、J、N、T或E型热电偶信号转换成数字量的热偶温度变送器。该热偶温度变送器输出14位带符号数据,通过SPI兼容接口、以只读格式输出。其引脚定义疾风传如下图所示:

  MAX31855器件处理来自热电偶的读数,并通过串口发送数据。当片选信号为低电平,并在SCK端施加时钟信号,即可从SO读取结果。MAX31855器件始终在后台执行转换,只有片选信号CS为高电平时才能更新故障状态和温度数据。片选信号CS为低电平时,SO引脚将输出第一位数据。通过SPI接口读取完整的冷端补偿热电偶温度,需要14个时钟周期。读取热电偶和参考端温度需要32个时钟周期,其格式如下图所示:

  在时钟下降沿读取输出位。第一位D31为热电偶温度符号位。D[30:18]位包含温度转换数据,顺序为MSB至LSB。D16位正常状态下为低电平,热电偶输入开路或对GND或VCC短路时变为高电平。参考端温度数据从D15开始。个数据位的定义如下:

  MAX31855热偶温度变送器的温度分辨率为0.25℃,最高温度读数为+1800℃,最低温度读数为-270℃,对于K型热电偶,温度范围为-200℃至+700℃,保持±2℃精度。

2、驱动设计与实现

  我们已经了解了MAX31855热偶温度变送器的基本情况。接下来我们将依据MAX31855热偶温度变送器的各种配置参数设计并实现MAX31855热偶温度变送器的驱动程序。

2.1、对象定义

  与以前的驱动设计一样,我们依然是基于对象来设计MAX31855热偶温度变送器的驱动程序。所以我们要先抽象并定义MAX31855热偶温度变送器对象类型。一般来讲对象包括属性与操作两方面,我们将据此逐一分析MAX31855热偶温度变送器对象的属性与操作。
  先考虑MAX31855热偶温度变送器对象的属性。对于MAX31855热偶温度变送器来说,每次访问返回的数据格式是固定的,这其中包括一些状态位,所以为了记录这些状态位我们定义一个状态量作为对象的属性。还有读回来的原始数据编码、解析出来的检测温度和冷端温度实际上表示了MAX31855热偶温度变送器当时所处的状态,所以我们将其定义为对象的属性。
  再来考虑MAX31855热偶温度变送器对象的操作。对于MAX31855热偶温度变送器来说,操作就是获取温度检测数据,而读取数据操作本身依赖于具体的软硬件平台,所提我们将其定义为对象的操作。而MAX31855热偶温度变送器采用SPI接口需要控制片选信号,当然在总线上只有一台设备时,我们可以直接将其通过硬件选中,但为了通用性我们还是使用软件来控制片选操作,所以我们将片选动作作为对象的一个操作。
  根据上述对MAX31855热偶温度变送器对象属性和操作的分析,我们可以抽象的到MAX31855热偶温度变送器的对象类型如下:

/*定义MAX31855对象类型*/
typedef struct Max31855Object {uint8_t status;uint32_t dataCode;float mTemperature;     //TC测量温度float rTemperature;      //冷端温度void (*ReadData)(uint8_t *rData,uint16_t rSize);void (*ChipSelcet)(Max31855CSType cs);     //片选信号
}Max31855ObjectType;

  抽象了对象类型后就可声明对象变量,可是这个对象变量必须作必要的初始化才能使用。所以我们需要一个初始化函数来对其进行初始化。在此函数中,我们将检测变量的有效性和初始状态赋值,并对设备进行必要的配置。根据这些要求我们设计MAX31855热偶温度变送器的对象初始化函数如下:

/*初始化MAX31855对象*/
void Max31855Initialization(Max31855ObjectType *tc,Max31855ReadDataType read,Max31855ChipSelcetType cs)
{if((tc==NULL)||(read==NULL)){return;}tc->ReadData=read;if(cs!=NULL){tc->ChipSelcet=cs;}else{tc->ChipSelcet=DefaultChipSelect;}tc->status=0;tc->dataCode=0;tc->mTemperature=0.0;tc->rTemperature=0.0;tc->ChipSelcet(Max31855CS_Disable);
}

2.2、对象操作

  我们之所以定义这一对象,目的是为了操作该对象。接下来我们就来考了MAX31855热偶温度变送器对象的操作问题。我们使用MAX31855热偶温度变送器就是为了测量温度。所以对MAX31855热偶温度变送器对象所要做的主要操作就是获取温度的转换数据并解析出温度值。对于MAX31855热偶温度变送器来说,除了热电偶的测量温度还有冷端的温度,这两个数据转换值都是可以读出来的,他们的格式如下:

  根据前面的分析以及数据格式,我们可以设计获取温度数据的操作函数如下:

/*获取MAX31855测量数据*/
void Max31855GetDatas(Max31855ObjectType *tc)
{uint8_t rData[4];uint16_t tCode=0;uint16_t rCode=0;tc->ChipSelcet(Max31855CS_Enable);tc->ReadData(rData,4);tCode=(rData[0]<<8)+rData[1];tCode=(tCode>>2);rCode=(rData[2]<<8)+rData[3];rCode=(rCode>>4);tc->mTemperature=CalcMeasureTemperature(tCode);tc->rTemperature=CalcColdEndTemperature(rCode);tc->dataCode=(rData[0]<<24)+(rData[1]<<16)+(rData[2]<<8)+rData[3];tc->ChipSelcet(Max31855CS_Disable);
}

3、驱动的使用

  我们已经设计并实现了MAX31855热偶温度变送器对象的驱动程序。这一驱动程序的设计还需要验证,所以我们需要设计一个简单的应用来验证这一驱动程序的正确性。

3.1、声明并初始化对象

  为了基于对象操作MAX31855热偶温度变送器,我们还是需要声明并初始化MAX31855热偶温度变送器对象变量。

Max31855ObjectType max31855;

  声明了这个对象变量,我们还需要使用前面设计的Max31855Initialization对象初始化函数对这个变量进行初始化。这个变量有几个参数:

Max31855ObjectType *tc,     //MAX31855对象变量
Max31855ReadDataType read,  //读MAX31855函数指针
Max31855ChipSelcetType cs   //片选操作函数指针

  其中第一个参数为需要初始化的对象变量,后面两个为操作回调函数的指针,这几个函数我们是炫耀实现的,其原型定义如下:

typedef void (*Max31855ReadDataType)(uint8_t *rData,uint16_t rSize);
typedef void (*Max31855ChipSelcetType)(Max31855CSType cs);     //片选信号

  这些函数的实现依赖于具体的软硬件平台,我们这里实现基于STM32F103的操作函数,依据原型定义我们实现如下:

/*SPI1读数据操作*/
static void BmtcReadData(uint8_t *rData,uint16_t rSize)
{HAL_SPI_Receive (&hspi1, rData, rSize, 1000);
}
/*SPI1片选操作函数*/
static void BmtcChipSelcet(Max31855CSType cs)
{if(Max31855CS_Enable == cs){HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET);return;}HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_SET);
}

  这要初始化函数的全部参数皆已定义,我们可以初始化MAX31855热偶温度变送器对象如下:

/*初始化MAX31855对象*/Max31855Initialization(&max31855,BmtcReadData,BmtcChipSelcet);

3.2、基于对象进行操作

  事实上,这个驱动程序我们已经应用于具体的项目当中,并且使用正常。所以在这个验证中,我们直接将项目中的实现代码节选如下:

/*获取MAX31855测量数据*/Max31855GetDatas(&max31855);aPara.phyPara.temperature=max31855.mTemperature;aPara.phyPara.rTemperature=max31855.rTemperature;

4、应用总结

  在我们的项目中,我们使用驱动实现了热电偶的温度采集,在使用过程中运行很稳定,数据获取及解析也没有问题,所以驱动程序的设计应该是符合要求的。
  在使用驱动程序的时候要注意,MAX31855热偶温度变送器SPI端口的时钟频率有要求,主设备输出的串行时钟最大不要超过5MHz,我们设置为2.5MHz时运行比较稳定。
  在使用驱动时需注意,采用SPI接口的器件需要考虑片选操作的问题。如果片选信号是通过硬件电路来实现的,我们在初始化时给其传递NULL值。如果是软件操作片选则传递我们编写的片选操作函数。

欢迎关注:

外设驱动库开发笔记46:MAX31855热偶变送器驱动相关推荐

  1. 外设驱动库开发笔记3:AD527x系列数字电位器驱动

    在一些时候我们需要使用精度更高的数字电位器来实现我们的应用.我们经常使用AD527x系列数字电位器来实现这类应用.在通常情况下,AD527x系列数字电位器完全能够满足要求.为了减少重复工作,在这里我们 ...

  2. 外设驱动库开发笔记2:AD8400系列数字电位器驱动

    一些时候我们需要在系统使用过程中改变某些电路电阻值以达到改变设定的目的,这时候我们就会使用电位器.在我们使用数字控制电路时多选择数字电位器.在这一篇我们就来设计AD8400系列数字电位器的驱动. 1. ...

  3. 外设驱动库开发笔记53:MAX31856热偶变送器驱动

      在我们的产品中经常有需要温度检测的地方,而热电偶温度检测电路是我们常用的.热电偶温度检测的方法很多,有时出于简单方便的考虑我们会选择热偶温度变送器来实现,这一篇我们就来讨论使用MAX31856热电 ...

  4. 外设驱动库开发笔记24:FM24xxx系列FRAM存储器驱动

    虽然说使用EEPROM保存参数很有效,但操作及使用次数均有一下限制.当我们的一些参数需要不定时修改或存储时,使用FRAM就更为方便一点.这一节我们就来设计并实现FM24xxx系列FRAM的驱动. 1. ...

  5. 外设驱动库开发笔记30:宇电AI-BUS通讯驱动

    嵌入式系统通常都会与外部设备进行通讯,这就涉及到通讯协议的问题.这些通讯协议有的是标准协议有的厂家自定义的协议,如宇电的AI-BUS.在本篇中,我们将讨论AI-BUS的驱动,以便于与宇电设备的通讯. ...

  6. 外设驱动库开发笔记48:MCP4725单通道DAC驱动

      在产品设计过程中,我们经常会遇到数模转换的应用需求.在本篇种我们就来讨论一下MCP4725单通道数模转换器的驱动设计与实现. 1.功能概述   MCP4725是一个低功耗,高精度,单通道,12位缓 ...

  7. 外设驱动库开发笔记0:EPD总体设计

    在产品开发过程中,不可避免需要使用很多外部的元件及传感器,这些元器件也许是板载的,也许是板外的,但不管怎样,为其开发驱动程序都是必须的.每次都需要为这些元器件编写驱动程序.但每次重复编写调试很麻烦,于 ...

  8. 外设驱动库开发笔记26:nRF24L01无线通讯驱动

    现在无线在我们的生活中无处不在.而我们开发的物联网产品也大量使用无线通讯.在这一篇文章中,我们将讨论nRF24L01无线通讯模块驱动程序的开发与实现. 1.功能概述 nRF24L01是一款工作在2.4 ...

  9. 外设驱动库开发笔记13:MLX90614红外温度传感器驱动

    红外温度传感器一般用于非接触式的温度检测.在我们的系统中经常会有这样的需求.所以我们将其设计为通用的驱动库以备复用.这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现. 1.功能概述 ML ...

最新文章

  1. 基于卷积神经网络(CNN)的仙人掌图像分类
  2. java 5 2_java 图形界面5.2
  3. linux运行c程序a. out,bash:./a.out:在由ld生成的运行可执行文件上没有这样的文件或目录。...
  4. python教程:ConfigParser模块使用教程
  5. activity7 拖不动_Activiti7相关问题汇总
  6. 第三次作业:个人项目-小学四则运算 “软件”之初版
  7. java treemap lastkey_Java TreeMap lastKey()用法及代码示例
  8. 信息学奥赛一本通 2023:【例4.8】数据统计
  9. java计算奇数阶魔方阵
  10. 股价暴跌 特斯拉市值周四蒸发上千亿美元
  11. Python+matplotlib绘制动态更新的柱状图
  12. T-SQL语言(一)
  13. XP 上金山词霸 占CPU 特别大的问题
  14. Xweibo插件版20110809重要补丁及下载
  15. VS.NET(C#)-3.13_Panel控件
  16. LeetCode刷题-反转字符串中的元音字母
  17. 计算机网络课程设计组建大型网吧局域网,计算机网络课程设计组建网吧局域网...
  18. ubuntu自带Firefox安装flash插件
  19. 22.1.11京东大数据实习面试
  20. 什么是EDM营销?EDM营销和一般营销方式的区别分析

热门文章

  1. 对联广告关闭挖扭的制作
  2. 游戏 星陨传说 刺客 小捣蛋 攻略及装备建议
  3. Linux?Mac?Windows?
  4. Vue使用:style动态绑定backgroundImage
  5. 正则表达式元字符含义
  6. 颈椎病怎么治_得了颈椎病怎么治
  7. 计算机考证看哪种书(全了)
  8. 用html+css+js制作幻灯片显示
  9. 国内常见的路由器默认帐户及密码
  10. 梯度下降法(GD、SGD、BGD、MINI-BGD)