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提供的,相关的资料都很全面,开发上很方便,开发者只需要在网上查找到相应的使用文档,并据此设计应用程序,就可以开发出易于使用的应用程序。
|