ZHCACA8 February   2023 MSPM0G1105 , MSPM0G1106 , MSPM0G1107 , MSPM0G1505 , MSPM0G1506 , MSPM0G1507 , MSPM0G3105 , MSPM0G3106 , MSPM0G3107 , MSPM0G3505 , MSPM0G3506 , MSPM0G3507 , MSPM0L1105 , MSPM0L1106 , MSPM0L1303 , MSPM0L1304 , MSPM0L1305 , MSPM0L1306 , MSPM0L1343 , MSPM0L1344 , MSPM0L1345 , MSPM0L1346

 

  1.   1
  2.   修订历史记录

设计说明

该子系统使用与正温度系数 (PTC) 热敏电阻 (TMP61) 串联的电阻器构成分压器,从而产生随温度呈线性变化的输出电压。通过在缓冲器配置中设置 MSPM0 内部运算放大器并使用 ADC 进行采样来读取该外部电路。如果测量到温度升高,RGB LED 将变为红色;如果温度降低,LED 将变为蓝色;如果温度没有显著变化,LED 将保持绿色。本文档不详细介绍如何根据 ADC 读数计算温度值,因为此类计算取决于所选的热敏电阻。在此处下载代码示例。

图 1 显示了该子系统的功能图。

GUID-20230216-SS0I-1KHJ-12NW-V4WKZRS009LM-low.svg图 1 子系统功能方框图

所需外设

该应用需要集成的 OPA、ADC、计时器和 I/O 引脚。

表 1
子块功能 使用的外设 说明

缓冲放大器

(1 个)OPA

在代码中称为 Thermistor_OPA_INST
模拟信号捕获 (1 个)ADC12 在代码中称为 ADC_INST
ADC 采样计时器 (1 个)TIMERx 在代码中称为 Thermistor_TIMER_ADC
RGB LED 控制 (3 个)I/O 引脚 在代码中称为 RGB_RED_PIN、RGB_BLUE_PIN 和 RGB_GREEN_PIN

兼容器件

根据表 1 中的要求,该示例与表 2 中的器件兼容。相应的 EVM 可用于原型设计。

表 2
兼容器件 EVM
MSPM0L13xx LP-MSPM0L1306
MSPM0G35xx、MSPM0G15xx LP-MSPM0G3507

设计步骤

  1. 确定 Rbias。对于本设计中使用的 TMP61 热敏电阻,建议 Rbias 为 10kΩ。可提供其他配置。有关详细信息,请参阅 TMP61 数据表。
    1. 其他热敏电阻可能有不同的 Rbias 建议或公式供您计算 Rbias。有关详细信息,请参阅所选热敏电阻的文档。
  2. 在 SysConfig 中设置 OPA,用于外部输入的缓冲器配置。
  3. 在 SysConfig 中设置 ADC,以使用所选 ADCMEMx 对 OPA 输出进行采样。
  4. 将 SysConfig 中的 ADC 采样时间设置为器件数据表中给出的 tSample_PGA 的最小值。
  5. 确定用于将 ADC 读数转换为温度读数的温度算法。本示例使用原始 ADC 读数来计算温度变化。

设计注意事项

  1. 温度计算:不同的热敏电阻会有不同的公式或查找表,以便根据 ADC 读数和外部电路计算温度。查看热敏电阻配套资料,了解可集成到该设计中的这些资源。
    1. 查找表花费的计算时间更少,但可能并非对所有情况都有效,并且可能会占用很大一部分内存。
    2. 公式需要更多计算时间,但对外部变量更灵活。这些公式的复杂性将取决于精度或温度范围要求。
  2. OPA 电源将是 MSPM0 的 VCC。
  3. OPA GBW 设置:OPA 的较低 GBW 设置消耗的电流较小,但响应速度较慢。相反,较高的 GBW 消耗的电流较大,但压摆率较大,使能和稳定时间较短。模式间的规格差异请见器件特定数据表。
  4. ADC 基准选择:MSPM0 器件可以从内部基准发生器 (VREF)、外部源或 MCU VCC 向 ADC 提供基准电压。请查看 MSPM0 器件数据表,了解可用于所选器件的选项。对于此设计的配置,建议 ADC 基准电压等于外部热敏电阻电路的偏置电压 (VCC)。
  5. ADC 采样:本示例使用计时器触发器定期对外部电路进行采样。要调整电路采样频率,请调整计时器参数。
  6. ADC 结果:该代码示例仅存储全局变量 gThermistorADCResult 中捕获的最新结果。对数据执行操作之前,完整应用可能希望在一个数组中存储多个读数。
  7. gCheckThermistor 上的竞态条件:该应用会尽快清除 gCheckThermistor。如果应用等待清除 gCheckThermistor 的时间过长,则可能会无意中丢失新数据。

软件流程图

图 2 显示了该示例的代码流程图,并说明了 ADC 如何对 OPA 输出进行采样以及 LED 照明的决策树。

GUID-20230216-SS0I-M3DB-5K4Z-2MJ4W2FJCBWK-low.svg图 2 应用软件流程图

器件配置

该应用利用 TI 系统配置工具 (SysConfig) 图形界面来生成器件外设的配置代码。使用图形界面配置器件外设可简化应用原型设计过程。

可以在 Thermistor_Example.c 文件的 main() 的开头找到图 2 中所述内容的代码。

应用代码

该应用不直接计算温度,而是寻找温度变化。以下代码片段包含一个值 CHANGEFACTOR,该值用于在识别温度变化之前确定 ADC 值的最小变化量。

#include"ti_msp_dl_config.h"
#include<math.h>
#define CHANGEFACTOR 10
volatileuint16_tgThermistorADCResult = 0;
volatileboolgCheckThermistor = false;

以下代码片段显示了在何处添加热敏电阻的温度计算方法以计算实际温度值。当前代码采用启动时的初始读数 (gInitial_reading),并将当前读数 (gCelcius_reading) 与 CHANGEFACTOR 调整进行比较,以查看温度是升高、降低还是无明显变化。然后,RGB LED 根据比较结果分别变为红色(升高)、蓝色(降低)或绿色(无变化)。

  while (1) {
        while (gCheckThermistor == false) {
                   __WFE();
               }
        //Insert Thermistor Algorithm
               gCelcius_reading = gThermistorADCResult;
               if (first_reading) {
                   gInitial_reading = gCelcius_reading;
                   first_reading   = false;
               }
               /*
                * Change in LEDs is based on current sample compared to previous sample
                *
                * If the new sample is warmer than CHANGEFACTOR from initial temp, turn LED red
                * If the new sample is colder than CHANGEFACTOR  from initial temp, turn LED blue
                * Else, keep LED green
                * Variable gAlivecheck is utilized for debug window to confirm code is executing.
                * It is not needed in final applications.
                *
                */
               gAlivecheck++;
               if(gAlivecheck >= 0xFFF0){gAlivecheck =0;}
               if (gCelcius_reading - CHANGEFACTOR > gInitial_reading) {
                   DL_GPIO_clearPins(
                       RGB_PORT, (RGB_GREEN_PIN | RGB_BLUE_PIN));
                   DL_GPIO_setPins(RGB_PORT, RGB_RED_PIN);
               } else if (gCelcius_reading < gInitial_reading - CHANGEFACTOR) {
                   DL_GPIO_clearPins(
                       RGB_PORT, (RGB_RED_PIN | RGB_BLUE_PIN));
                   DL_GPIO_setPins(RGB_PORT, RGB_BLUE_PIN);
               } else {
                   DL_GPIO_clearPins(
                       RGB_PORT, (RGB_RED_PIN | RGB_BLUE_PIN));
                   DL_GPIO_setPins(RGB_PORT, RGB_GREEN_PIN);
               }
               gCheckThermistor = false;
        __WFI();
    }