2024年寒假练 - 基于MSPM0L1306综合开发平台的智能温度调节展示系统
该项目使用了MSPM0L1306综合开发平台,实现了智能温度调节展示系统的设计,它的主要功能为:热敏电阻检测温度变化,彩色LCD显示当前温度和设定阈值。LED和RGB LED根据温度高低展示不同颜色。按键用于设置温度阈值,电位计调节LED显示的模式和强度。
标签
2024年寒假练
MSPM0L1306综合开发平台
智能温度调节展示系统
冷月烟
更新2024-03-28
484

项目介绍

项目功能介绍

本项目实现了一个基于温度变化的展示系统,具有以下特点

  • 热敏电阻检测温度变化。
  • 彩色LCD显示当前温度和设定阈值。
  • LED和RGB LED根据温度高低展示不同颜色。
  • 按键用于设置温度阈值,
  • 电位计调节LED显示的模式和强度。


设计思路

该项目主要有四部分组成:

  • ADC读取热敏电阻电平并转换为温度
  • ADC读取扩展板电位器与按键电平并转换为按键状态
  • LCD显示驱动
  • PWM控制红灯亮度


硬件框图


软件流程图


硬件介绍

LP-MSPM0L1306 LaunchPad™ 开发套件

MSPM0L1306 微控制器 (MCU) 的易于使用的评估模块。该套件包含在 MSPM0L1xx 微控制器平台上开始开发所需要的全部资源,包括用于编程、调试和能量测量的板载调试探针。该板还具有用于快速集成简单用户界面、板载热敏电阻、光传感器和 RGB LED 的板载按钮和 LED。 

Fs8QIjf2gTqARXflbY8RXMUK4rfq

MSPM0L1306 是一款 Arm® 32 位 Cortex®-M0+ CPU,频率高达 32MHz。该器件具有 64KB 嵌入式闪存和 4KB片上 RAM。12 位 1Msps SAR ADC、零漂移和零交叉斩波运算放大器 (OPA) 和通用放大器 (GPAMP) 等集成高性能模拟外设可帮助用户设计其系统。


板卡特性:

  •  具有外部编程选项的板载 XDS110 调试探针
  • 可用于超低功耗调试的 EnergyTrace 技术
  • 用于用户交互的 2 个按钮、1 个 LED 和 1 个 RGB LED
  • 热敏电阻电路
  • 光传感器电路
  • ADC 输入的 RC 滤波器(默认未安装)
  • 支持使用 GPIO 和 XDS110 调用 BSL
  • 反向通道 UART,通过 USB 连接到 PC


输入、输出扩展板

FjVSSSDgECTuGI8PX9kD8dKJWkV3

本扩展板包含如下功能:

  • 按键、旋转编码器输入 - 以模拟信号的方式
  • 双电位计控制输入 - 以数字信号的方式
  • RGB三色LED显示
  • 1.44寸128*128 LCD,SPI总线访问
  • MMA7660三轴姿态传感器
  • 电阻加热
  • 温度传感器


实现的功能及图片展示

正常工作模式


报警模式


主要代码片段及说明

热敏电阻电平转温度

float thermistor_calc_temperature(int raw_ADC)
{
// THRM calculations via regression
// Copied from TI Thermistor Design Tool Excel Doc
float 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 = (3.3 / 4096) * THRM_ADC; // calculate volts per bit then multiply that times the ADV value
return (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
}


电位器与按键电平转按键状态

void adc_key_change(uint16_t adc)
{
static uint8_t adc_key = 0;
static uint8_t his_rev_key = 0;

if(adc >= 3900)
{
if(adc_key == 10) key_flag = 1;
else if(adc_key == 11) key_flag = 2;
adc_key = 0;
his_rev_key = 0;
}
else if(adc < 3000 && adc >= 2890) adc_key = 10;//2940
else if(adc < 2000 && adc >= 1800) adc_key = 11;//1921
else if(adc < 3900 && adc >= 3790) adc_key = 1; //3838
//else if(adc < 3620 && adc >= 3530) ; //3581
else if(adc < 3760 && adc >= 3660) adc_key = 2; //3709
if(adc_key != his_rev_key)
{
if(his_rev_key == 1 && adc_key == 2)
revolve_flag = 1;
else if(his_rev_key == 2 && adc_key == 1)
revolve_flag = 2;

his_rev_key = adc_key;
}
}


LCD初始化

void LCD_Init(void)
{
LCD_GPIO_Init();//初始化GPIO

LCD_RES_Clr();//复位
delay_cycles(100*32*1000);
LCD_RES_Set();
delay_cycles(100*32*1000);

LCD_BLK_Set();//打开背光
delay_cycles(100*32*1000);

LCD_WR_REG(0x11); //Sleep out
delay_cycles(120*32*1000); //Delay 120ms
//------------------------------------ST7735S Frame rate-------------------------------------------------//
LCD_WR_REG(0xB1); //Frame rate 80Hz
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x35);
LCD_WR_DATA8(0x36);
LCD_WR_REG(0xB2); //Frame rate 80Hz
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x35);
LCD_WR_DATA8(0x36);
LCD_WR_REG(0xB3); //Frame rate 80Hz
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x35);
LCD_WR_DATA8(0x36);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x35);
LCD_WR_DATA8(0x36);
//------------------------------------End ST7735S Frame rate-------------------------------------------//
LCD_WR_REG(0xB4); //Dot inversion
LCD_WR_DATA8(0x03);
//------------------------------------ST7735S Power Sequence-----------------------------------------//
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0xA2);
LCD_WR_DATA8(0x02);
LCD_WR_DATA8(0x84);
LCD_WR_REG(0xC1);
LCD_WR_DATA8(0xC5);
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x00);
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0x2A);
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x8D);
LCD_WR_DATA8(0xEE);
//---------------------------------End ST7735S Power Sequence---------------------------------------//
LCD_WR_REG(0xC5); //VCOM
LCD_WR_DATA8(0x0a);
LCD_WR_REG(0x36);
if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x08);
else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC8);
else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x78);
else LCD_WR_DATA8(0xA8);
//------------------------------------ST7735S Gamma Sequence-----------------------------------------//
LCD_WR_REG(0XE0);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x1C);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x18);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x25);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x27);
LCD_WR_DATA8(0x2F);
LCD_WR_DATA8(0x3C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x10);
LCD_WR_REG(0XE1);
LCD_WR_DATA8(0x12);
LCD_WR_DATA8(0x1C);
LCD_WR_DATA8(0x10);
LCD_WR_DATA8(0x18);
LCD_WR_DATA8(0x2D);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x23);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x28);
LCD_WR_DATA8(0x26);
LCD_WR_DATA8(0x2F);
LCD_WR_DATA8(0x3B);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x03);
LCD_WR_DATA8(0x10);
//------------------------------------End ST7735S Gamma Sequence-----------------------------------------//
LCD_WR_REG(0x3A); //65k mode
LCD_WR_DATA8(0x05);
LCD_WR_REG(0x29); //Display on
}


主代码

int main(void)
{
float thrm_temp = 0;
float alarm_temp = 20;
uint32_t brightness = 100;
volatile uint32_t counter = 0;
/* Power on GPIO, initialize pins as digital outputs */
SYSCFG_DL_init();

LCD_Init();
LCD_Fill(0, 0, LCD_W, LCD_H, BLACK);
LCD_ShowString(0, 0, (uint8_t*)"temp:", WHITE, BLACK, 16, 0);
LCD_ShowFloatNum1(0, 16, alarm_temp, 4, WHITE, BLACK, 16);
LCD_ShowIntNum(0, 32, brightness, 3, WHITE, BLACK, 16);

NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);

gCheckADC[0] = false;
gCheckADC[1] = false;
DL_ADC12_startConversion(ADC12_0_INST);
DL_TimerG_startCounter(PWM_0_INST);

while (1)
{

if(gCheckADC[1])
{
gCheckADC[1] = false;
gADCResult[1] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_1);
adc_key_change(gADCResult[1]);

if(key_flag != 0)
{
if(key_flag == 1)
{
alarm_temp += 1;
}
else if(key_flag == 2)
{
alarm_temp -= 1;
}
LCD_ShowFloatNum1(0, 16, alarm_temp, 4, WHITE, BLACK, 16);
key_flag = 0;
}
if(revolve_flag != 0)
{
if(revolve_flag == 1)
{
if(brightness <= 95)
{
brightness += 5;
}
}
else if(revolve_flag == 2)
{
if(brightness >= 10)
{
brightness -= 5;
}
}
LCD_ShowIntNum(0, 32, brightness, 5, WHITE, BLACK, 16);
revolve_flag = 0;
}
}

if(counter >= 500 && gCheckADC[0])
{
counter = 0;
gCheckADC[0] = false;
gADCResult[0] = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
thrm_temp = thermistor_calc_temperature(gADCResult[0]);
if(thrm_temp > alarm_temp)
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 1000 - brightness * 10, DL_TIMER_CC_0_INDEX);
DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_G_PIN);
}
else
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 999, DL_TIMER_CC_0_INDEX);
DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_G_PIN);
}
LCD_ShowFloatNum1(40, 0, thrm_temp, 4, WHITE, BLACK, 16);
}
counter ++;
delay_cycles(1*32*1000);
}
}


遇到的主要难题及解决方法

问题:直接插上扩展板,许多IO不兼容。

办法:使用排线连接。


问题:扩展板上有一个按键无法使用。

办法:将短路的0欧电阻换成电容。


未来的计划或建议

建议优化扩展板,使其直接插到板子上就能使用,不用很麻烦的去连接线路了。或者可以使用类似TI开发板那种一面是排母一面是排针的座子,直接连线就能用,不用从背面插线,连接不稳定了。


附件下载
代码.7z
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号