旧乡故客
发表于: 2018-7-28 20:28:03 | 显示全部楼层

通过将EFM8微控制器连接到PC,您可以方便地监控温度并可视化温度随时间的变化情况。


所需的硬件/软件

●    SLSTK2000A EFM8评估板

●    Simplicity Studio集成开发环境

●    SCILAB

●    PmodTC1热电偶模块(包括一个K型热电偶)

●    5根连接导线


分析您的烤箱

在本篇文章中,我们将开发一个监测和记录热电偶温度测量的系统。您当然可以将此系统用于您选择执行的任何温度感应,但我确实有一个特定的应用:回流式烤箱。您可能还没有意识到,通过使用普通烤箱进行回流焊接,可以将表面贴装部件焊接到PCB上。如果您曾经考虑过,两到三块PCB进行专业装配的成本,那么您完全理解这种低成本自助式替代方案的重要性。


然而,使用烤箱进行回流焊接方法的困难之一是温度控制。首先,不能保证烤箱的温度设置足够准确(毕竟,它是专为食品准备而设计的,而不是PCB组装)。其次,最佳回流焊接不仅仅是单个温度。考虑以下:

TCS_leadedprofile.jpg


这是凯斯特(Kester)制造的有铅焊膏推荐的温度曲线。也许是自己动手组装技术人员不需要强调严格遵守温度曲线,但是一致成功的机会肯定会随着您复制推荐曲线的程度而增加。此外,记录您的温度变化 - 即使您没有尝试微调烤箱的性能 - 可以帮助您识别潜在的问题。例如,ChipQuick建议其含铅产品具有更高的最高温度(235°C对225°C),而ChipQuick的无铅焊膏需要更高的峰值温度和变化的曲线。因此,如果您注意到某种类型的锡膏比另一种效果更好,那么您的温度数据可能会帮助您解决问题。


热电偶简介

热电偶由两种不同的金属组成。这些金属在温度传感端形成结。

TCS_pic1.jpg


由于称为塞贝克效应(Seebeck )的现象,热电偶的两个独立部分之间的温度梯度将产生可测量的电压并用于计算热电偶结点处的温度。


热电偶根据其构造材料进行分类。该项目中使用的型号 - 即K型 - 是一种通用的通用热电偶,具有良好的精度和宽温度范围。


PmodTC1模块

在这个项目中,我们将借助PmodTC1模块从热电偶中收集数据,该模块仅仅是MAX31855“冷端补偿热电偶 - 数字转换器”的分线板。顾名思义,这个IC接口直接连接到热电偶并输出测量温度作为二进制数。

TCS_pic2.jpg


TCS_breadboard.jpg

TCS_MAX31855blockdiagram.jpg


如果您想知道“冷端补偿”是什么,请回想一下热电偶实际上是指其结点与热电偶线上的其他点之间的温差。因此,为确定结点的绝对温度,MAX31855测量其自身的芯片温度,并将其计算在内。该方法假设IC的管芯温度非常类似于热电偶的“冷结”的温度,即测量感应电压的结。只要IC没有消耗足够的功率来显着提高其自身温度,这是一个安全的假设。


MAX31855使用标准SPI(串行外设接口)总线将温度数据传输到外部控制器。必要的接口信号以及电源和接地信号被输出到PmodTC1模块上的0.1英寸单排插头。

TCS_Pmodpinout.jpg


PmodTC1提供±2°C的精度和0.25°C的分辨率,并且随附的K型热电偶可以测量-73°C至482°C的温度。有关如何解析14位温度数据的详细信息,请参阅下面的“固件”部分。


端口I / O

以下是Simplicity Studio硬件配置器的端口I / O图:

TCS_pinout.jpg


我们需要的唯一引脚是SPI信号:SCK(串行时钟)、MISO(从器件输出中的主器件)和NSS(从器件选择)。当我们在交叉开关中启用SPI外设时,MOSI(主输出从机输入)会自动路由到端口引脚,但我们不在此项目中使用它,因为我们不需要向MAX31855发送任何数据。 SCK和NSS配置为输出,MISO是输入。注意,交叉开关跳过P0.0到P0.5,以便SPI信号被路由到EFM8板扩展头上的相应引脚:

TCS_ExpansionHeader.jpg


外围设备和中断

SPI配置如下:

TCS_SPIConfig1.jpg

TCS_SPIConfig2.jpg


如FIFO配置中所示,SPIF(即字节结束)中断被禁用,FIFO读请求中断被使能。这意味着在SPI FIFO缓冲区中有足够的字节之前,不会调用SPI中断服务程序。 “RX FIFO Threshold”字段设置为“大于1”,这意味着一旦我们在FIFO中有两个接收字节,中断就会触发。所有这些配置都旨在确保EFM8的SPI与MAX31855数据表中的接口协议兼容(在本项目中,我们只需要此32位传输的前14位):

TCS_SPIspecs.jpg


重要:由于某种原因(可能是一个bug),Simplicity Studio不会将SPI FIFO设置合并到InitDevice.c源文件中。因此,有必要“手动”配置两个SPI寄存器;这是通过以下代码完成的:

  1. //call hardware initialization routine
  2. enter_DefaultMode_from_RESET();

  3. SFRPAGE = SPI0_PAGE;
  4. //disable the normal (end-of-byte) SPI interrupt
  5. SPI0FCN1 &= ~SPI0FCN1_SPIFEN__BMASK;
  6. //enable the receive FIFO interrupt
  7. SPI0FCN0 |= SPI0FCN0_RFRQE__BMASK;
  8. //set FIFO interrupt to fire when we have more than one byte
  9. SPI0FCN0 |= SPI0FCN0_RXTH__ONE;
  10. //set slave select logic high (it is an active-low signal)
  11. SPI0CN0 |= NSS_BIT;
复制代码

SCILAB

我们将使用以下Scilab图形用户界面来收集和记录温度数据:

TCS_GUI.jpg


此GUI是在GUI Builder工具箱的帮助下设计的,您可以通过Scilab的ATOMS模块管理器下载该工具箱:

TCS_ATOMS.jpg


单击“开始温度数据采集”后,GUI会重复发送温度请求,直到您单击“停止温度数据采集”;请求之间的间隔由相应输入框中的数字确定(在绘图窗口下方)。最近的温度测量显示在摄氏和华氏单选按钮旁边的文本框中,温度历史记录显示在绘图窗口中。


固件

整体功能如下:EFM8闲置等待来自PC的“请求温度数据”命令。收到命令后,EFM8传输两个SPI伪字节,从而产生读取MAX31855温度数据所需的16个时钟周期。当两个字节加载到SPI的接收FIFO中时,会产生一个中断。此时,EFM8将14位温度数据重新打包成Scilab中易于处理的格式。乍一看,来自MAX31855的二进制数据看起来有点神秘,所以让我们仔细看看。

TCS_dataformat.jpg

我们这里有一个14位的二进制补码数。前12位可以解释为正常有符号12位数,直接对应于摄氏温度。 (注意,目前Scilab脚本仅用于处理正数。)2个最低位代表MAX31855的0.25°C分辨率:这两个位的二进制“00”对应于温度小数部分的零; “01”对应0.25; “10”对应于0.50;并且“11”对应于0.75。另外,不要忘记EFM8的SPI总线以字节为单位工作,而不是位。我们从SPI FIFO读取的两个字节将形成一个16位数字;前14位是温度数据,低2位可以忽略。以下代码显示了我们如何将此数据转换为将发送到Scilab的三字节消息:

  1. SI_INTERRUPT (SPI0_ISR, SPI0_IRQn)
  2. {
  3.         unsigned int RawTempData;

  4.         //clear interrupt flag
  5.         SPI0FCN1 &= ~SPI0FCN1_RFRQ__BMASK;

  6.         RawTempData = SPI0DAT;
  7.         RawTempData = (RawTempData << 8) | SPI0DAT;

  8.         //flush Rx FIFO and disable slave select
  9.         SPI0FCN0 |= SPI0FCN0_RFLSH__FLUSH;
  10.         SPI0CN0 |= NSS_BIT;

  11.         /* The following instructions convert the raw
  12.          * binary temperature data into a format that
  13.          * can be easily interpreted by Scilab. Refer to
  14.          * the text of the article for more information.*/
  15.         TempDataTx[0] = LOWBYTE(RawTempData >> 12);
  16.         TempDataTx[1] = LOWBYTE(RawTempData >> 4);

  17.         switch((RawTempData & (BIT3|BIT2)) >> 2)
  18.         {
  19.                 case 0: TempDataTx[2] = 0;
  20.                 break;

  21.                 case 1: TempDataTx[2] = 25;
  22.                 break;

  23.                 case 2: TempDataTx[2] = 50;
  24.                 break;

  25.                 case 3: TempDataTx[2] = 75;
  26.                 break;
  27.         }

  28.         TEMP_DATA_READY = TRUE;
  29. }
复制代码

TCS_dataformatannotated.jpg

我们通过将16位数字12位向右移位来获得高字节,并通过向右移位4位来获得低字节。然后我们将剩余的两位转换为表示小数部分的整数,Scilab简单地将此整数除以100并将结果添加到非小数部分。


实际的系统

第一个图是对室内空气温度的测量。请注意细微变化。

TCS_roomtemp.jpg

该图显示了标准尺寸烤箱的温度曲线设置为350°F:

TCS_oven.jpg


注意最终温度差异很大。据推测,这是由于烤箱温度传感器的不准确性以及我们的热电偶和烤箱传感器之间的位置差异造成的。


即使您还没有为烤箱回流焊做好准备,该系统在使用热风枪焊接时仍可用于监控和微调温度。该系统显示记录的温度变化,同时楔入IC引脚和PCB表面之间的热电偶被设置在其温度范围中间的热风焊枪加热;约130秒后取出热风枪。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 29 | 回复: 32



手机版|

GMT+8, 2024-12-21 21:01 , Processed in 0.049401 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表