1954|2

172

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

TI【LP_MSPM0L1306开发板】测评——热敏电阻控制LED以及RGB灯 [复制链接]

 

热敏电阻采集温度信息并控制LED以及RGB

硬件组成

通过查看LaunchPad MSPM0L1306的原理图可知,热敏电路的原理图如图所示。

热敏电阻RT1和电阻R2构成一个分压电路,采样点2可以通过跳线帽连接到PA15引脚上,通过查看数据手册可知,PA15为ADC的通道9,使用ADC对该点电压进行采样,对采样结果进行换算,即可得到测量点的温度值。

LaunchPad上使用的热敏电阻为TI的TMP6131DECT,在TI的官网上提供了TMP6x系列的设计工具,工具以Excel表格的形式提供了该系列的热敏电阻的使用方法。包括查表法、多项式法等多种转换公式,并提供了相应的示例C代码。

在该设计工具的Main主页上选择对应的热敏电阻的型号,在其余的表格中可以查看不同数据转换方法的介绍和示例代码。使用起来很方便。

这里选用四阶多项式转换测量到的电压为温度值,在相应的数据表格中给出了该转换方式的示例代码和方法的介绍。该方法是针对TI的热敏电阻产品温度测量的精度最高、速度最快的计算方法。

在开发板上有一个红色的LED灯和一个三引脚控制的RGB灯,用于提示用户。

 

程序设计

结合上述硬件,可以实现通过ADC读取当前热敏电阻和普通电阻组成的分压电路的采样点的电压,转换为温度值,当温度值超过28摄氏度时,点亮RGB的红灯,并点亮LED1,提示温度偏高;当温度值低于22摄氏度时,点亮RGB的蓝灯,并点亮LED1,提示温度偏低;当温度值介于22到28摄氏度之间时,点亮RGB的绿灯,并熄灭LED1,提示温度适宜。

程序实现

首先,在SysConfig中对使用到的外设进行配置,本示例使用到的外设包括ADC(用于采集分压电路采样点的电压值)、Timer(用于PWM调节LED1的亮度和产生定时事件驱动ADC采样)、GPIO(用于控制RGB灯)。

ADC模块选择为事件触发采样,事件选择为TimerG1的Zero Event,并开启转换完成中断,SysConfig的配置如下

定时器模块设定为向下计数模式,发布Zero Event用与ADC采样,SysConfig配置如下

GPIO模块设定相应的控制引脚为输出模式,其中LED1的引脚配置如下。

完成配置后,保存SysConfig文件,在生成的代码文件中可以看到相应模块的初始化代码。

在主程序中,初始化使用到的外设,使能ADC中断,启动定时器的产生定时事件触发ADC采样。主循环中获得采样值后,采样用前文中的温度电压转换函数得到当前的采样温度,并根据温度调整LED1和RGB的状态。

#include "ti_msp_dl_config.h"
#include <math.h>

#define HIGH_TEMPTHERS  28*32
#define LOW_TEMPTHERS  22*32

volatile uint16_t gThermistorADCResult = 0;
volatile bool gCheckThermistor         = false;

volatile uint32_t gCelcius_reading = 0;

float thermistor_calc_temperature(int raw_ADC);

float VBias                            = 3.30;  // set the VBIAS voltage
unsigned int ADC_BITS =
    4096;  // set the number of bits based on you ADC (2^# of ADC Bit Value)
float VTEMP     = 0;  // set up the variable for the measured voltage
float THRM_TEMP = 0;  // setup the variable for the calculated temperature

float thermistor_calc_temperature(int raw_ADC)
{
    // THRM calculations via regression
    // Copied from TI Thermistor Design Tool Excel Doc
    VTEMP          = 0.0;
    float THRM_ADC = raw_ADC;

    float THRM_A0 = -4.232811E+02;
    float THRM_A1 = 4.728797E+02;
    float THRM_A2 = -1.988841E+02;
    float THRM_A3 = 4.869521E+01;
    float THRM_A4 = -1.158754E+00;

    VTEMP =
        (VBias / ADC_BITS) *
        THRM_ADC;  // calculate volts per bit then multiply that times the ADV value
    THRM_TEMP = (THRM_A4 * powf(VTEMP, 4)) + (THRM_A3 * powf(VTEMP, 3)) +
                (THRM_A2 * powf(VTEMP, 2)) + (THRM_A1 * VTEMP) +
                THRM_A0;    // 4th order regression to get temperature
    return THRM_TEMP * 32;  // multiply by 32 for GC to divide later
}


int main(void)
{
    SYSCFG_DL_init();

    DL_GPIO_clearPins(RGB_PORT,
        (RGB_RED_PIN | RGB_GREEN_PIN | RGB_BLUE_PIN));

    NVIC_EnableIRQ(ADC_INST_INT_IRQN);
    gCheckThermistor = false;
    /* Start timer that triggers ADC sampling */
    DL_TimerG_startCounter(THERMISTOR_TIMER_ADC_INST);


    bool first_reading       = true;

    while (1) {
        while (gCheckThermistor == false) {
            __WFE();
               }
        //Insert Thermistor Algorithm

               gCelcius_reading =(uint32_t) thermistor_calc_temperature(gThermistorADCResult);

               if (gCelcius_reading>HIGH_TEMPTHERS) {
                   DL_GPIO_clearPins(
                       RGB_PORT, (RGB_GREEN_PIN | RGB_BLUE_PIN));
                   DL_GPIO_setPins(RGB_PORT, RGB_RED_PIN);
                   DL_GPIO_clearPins(RGB_PORT, RGB_LED1_PIN);

               } else if (gCelcius_reading < LOW_TEMPTHERS) {
                   DL_GPIO_clearPins(
                       RGB_PORT, (RGB_RED_PIN | RGB_BLUE_PIN));
                   DL_GPIO_setPins(RGB_PORT, RGB_BLUE_PIN);
                   DL_GPIO_clearPins(RGB_PORT, RGB_LED1_PIN);

               } else {
                   DL_GPIO_clearPins(
                       RGB_PORT, (RGB_RED_PIN | RGB_BLUE_PIN));
                   DL_GPIO_setPins(RGB_PORT, RGB_GREEN_PIN);
                   DL_GPIO_setPins(RGB_PORT, RGB_LED1_PIN);
               }

               gCheckThermistor = false;
       __WFI();

    }
}


/*
 * This IRQ is triggered whenever a new ADC conversion result is ready,
 * and the conversion result is stored in gThermistorADCResult.
 */
void ADC_INST_IRQHandler(void)
{
        switch (DL_ADC12_getPendingInterrupt(ADC_INST)) {
            case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
                gThermistorADCResult =
                    DL_ADC12_getMemResult(ADC_INST, DL_ADC12_MEM_IDX_0);
                gCheckThermistor = true;
                break;
            default:
                break;
        }
}

 

总结

上述示例中使用的热敏电阻和MSPM0开发板都是TI提供的,相关的资料都很全面,开发上很方便,开发者只需要在网上查找到相应的使用文档,并据此设计应用程序,就可以开发出易于使用的应用程序。

temp_sense_thermistor_LP_MSPM0L1306_nortos_ticlang.7z (115.11 KB, 下载次数: 10) TMP6-Thermistor-Design.zip (3.19 MB, 下载次数: 6)
此帖出自MSPM0 MCU论坛

最新回复

感谢大佬提供这么好的示例,学习学习!   详情 回复 发表于 2023-10-15 17:21
点赞 关注
 
 

回复
举报

6973

帖子

11

TA的资源

版主

沙发
 

感谢大佬提供这么好的示例,学习学习!

此帖出自MSPM0 MCU论坛

点评

这些例子在TI官方提供的示例程序中都是存在的,大家只要认真学习即可  详情 回复 发表于 2023-10-15 21:09
 
 
 

回复

172

帖子

3

TA的资源

一粒金砂(高级)

板凳
 
lugl4313820 发表于 2023-10-15 17:21 感谢大佬提供这么好的示例,学习学习!

这些例子在TI官方提供的示例程序中都是存在的,大家只要认真学习即可

此帖出自MSPM0 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
时间触发和状态机思想的嵌入式系统 分析都给大家传上去了!

今天我给大家讲一下: 时间触发的嵌入式系统 : 我先给大家了一个程序:这个程序是在PC机上测试过,大家给点意见! #include ...

【视频分享】电子设计竞赛作品演示

本帖最后由 paulhyde 于 2014-9-15 08:53 编辑 汽车多功能保护系统(2008广东省大学生电子设计竞赛) http://www.tudou.com/v/ ...

NXP ARM Cortex M0/M3 IAP应用

最近的项目都差不多要使用IAP功能,在使用中遇到了不少问题。本人也把遇到的问题分别发了不同的帖子: 1.LPC1100处理器通过SD ...

大西瓜FPGA资料共享开源(持续更新中!!!)

回顾刚开始学习FPGA的时候,感觉作为一个新手从ALTERA的FPGA入门比较好,资料也相对比较多,所以就选择了ALTERA的片子。 ...

【sensorTile 器件详解】LSM6DSM 加速度Acc+陀螺仪Gyro (第一篇)

本帖最后由 uniquey 于 2016-12-12 15:49 编辑 文章开篇,我们先从基本信息上了解一下LSM6DSM。虽然有些参数较深入(如Noise ...

获奖名单|雅特生 PMBus 接口非隔离式 DC-DC 转换器!下载资料赢好礼!

活动详情:雅特生 PMBus 接口非隔离式 DC-DC 转换器!下载资料赢好礼! 请获奖网友在领奖截止日期前确认论坛个人资料中的 ...

使用RTT做录音数据输出,掉数据特别严重。有没有基友知道怎么提高RTT速率的?

各位基友好,如题:使用RTT做录音数据输出,掉数据特别严重。有没有基友知道怎么提高RTT速率的? 如下是经过缓存后输出的正常 ...

RSL1蓝牙特征值读写

本帖最后由 dql2016 于 2021-6-28 20:07 编辑 蓝牙广播只能单向发送数据且数据可以被任何其它设备接收,无法实现设备接收数据 ...

外设接口

计算机常用外设接口集合

《Rust实战》实现循环的三个方式

学习了第二章的流程控制的三个可以实现循环的方式,即for、while、loop,三个循环在使用的方式我体会如下,不知道对不对。 1 ...

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表