项目介绍
项目功能介绍
本项目实现了一个基于温度变化的展示系统。
- 温度传感器检测温度变化。
- 彩色LCD显示当前温度和设定阈值。
- LED根据温度高低展示不同颜色。
- 按键用于设置温度阈值。
- 摇杆调节LED显示的模式和控制参数。
设计思路
该项目主要有5部分组成:
- 三色LED控制:通过F280049C平台控制三色LED的亮灭与颜色切换,用于表示系统的不同工作状态或温度范围。实现LED颜色与温度值的直观映射,通过颜色变化表示温度。
- LCD屏幕显示驱动:驱动LCD屏幕显示温度值、系统状态等信息。
- NST112读取温度部分:通过NST112传感器准确读取环境温度。
- 读取按键ADC值并转化为按键状态:通过ADC模块读取按键的模拟信号,并将其转换为按键状态,采用去抖动技术,减少按键误触。
- 读取PWM输入频率与占空比并转化为摇杆状态:读取PWM信号的频率与占空比,并将其转换为摇杆状态。优化PWM信号处理算法,提高摇杆状态识别的准确性,实现摇杆控制温度的精细调节。
硬件框图
软件流程图
硬件介绍
LAUNCHXL-F280049C
LAUNCHXL-F280049C 是一款适用于 TI C2000™ 实时控制器系列 F28004x 器件的低成本开发板。该器件不仅适用于初始评估和原型设计,还提供易于使用的标准化平台,用于开发下一个应用。该扩展版本 LaunchPad 可提供额外引脚用于开发,并支持连接两个 BoosterPack。作为庞大的 TI MCU LaunchPad 生态系统的一部分,该器件还与各种插件交叉兼容,包含 InstaSPIN-FOC 功能。
F28004x LaunchPad 包括一个 F280049CPZS MCU。该 MCU 非常适合用于低成本应用中的高级实时控制系统。用户可通过板载附件和接口获得大量此类外设,可通过板载附件和 BoosterPack 连接器使用这些外设。
硬件特性:
- TMS320F280049C:具有 FPU 和 TMU 的 100MHz C28x CPU、256KB 闪存、支持 InstaSPIN-FOC、3 个 12 位 ADC、CAN、编码器、FSI、UART 等
- 板载 XDS110 调试探针,用于实时调试和闪存编程
- 两个用户控制 LED
- 一个微控制器复位开关
- 可选电源域:
- USB (隔离)
- 升压包
- 外部电源
- 两个独立的 BoosterPack XL 标准连接器,具有可堆叠接头,通过 BoosterPack 生态系统实现最大化扩展通过 BoosterPack 生态系统进行最大化扩展
- 电源域隔离,用于实时调试和闪存编程
- 隔离式 CAN 收发器
- 两个独立的基于增强型正交编码器脉冲 (QEP) 的编码器连接器
- 独立的 FSI 连接器
- 硬件文件位于 C2000Ware 中的 boards\LaunchPads\LAUNCHXL_F280049C
TMS320F28004x (F28004x) 是一个功能强大的 32 位浮点微控制器单元 (MCU),可让设计人员在单个器件上集成关键的控制外设、差分模拟和非易失性存储器。F28004x 支持高达 256KB (128KW) 的闪存,这些闪存分为两个 128KB (64KW) 存储体,支持并行编程和执行。此外,还以 4KB (2KW) 和 16KB (8KW) 块提供高达 100KB (50KW) 的片上 SRAM,以进行高效的系统分区。还支持闪存 ECC、SRAM ECC/奇偶校验和双区安全性。
F28004x MCU 上集成了高性能模拟块,以进一步支持系统整合。三个独立的 12 位 ADC 可准确、高效地管理多个模拟信号,从而最终提高系统吞吐量。模拟前端上的七个 PGA 可以在转换之前实现片上电压调节。七个模拟比较器模块针对跳闸情况下的对输入电压电平进行连续监控。
特性:
- TMS320C28x 32 位 CPU
- 可编程控制律加速器 (CLA)
- 片上存储:
- 在两个独立存储体上提供 256KB (128KW) 的闪存(ECC 保护)
- 100KB (50KW) RAM(ECC 保护或奇偶校验保护)
- 时钟和系统控制
- 两个内部零引脚 10MHz 振荡器
- 片上晶振振荡器和外部时钟输入
- 窗口化看门狗计时器模块
- 丢失时钟检测电路
- 1.2V 内核、3.3V I/O 设计
- 可生成 1.2V 电压的内部 VREG 或直流/直流允许进行单电源设计
- 欠压复位 (BOR) 电路
- 系统外设
- 6 通道直接存储器存取 (DMA) 控制器
- 40 个独立可编程多路复用通用输入/输出 (GPIO) 引脚
- 在模拟引脚上提供 21 路数字输入
- 增强型外设中断扩展 (ePIE) 模块
- 支持多个具有外部唤醒功能的低功耗模式 (LPM)
- 嵌入式实时分析和诊断 (ERAD)
- 通信外设
- 一个电源管理总线 (PMBus) 接口
- 一个内部集成电路 (I2C) 接口 (引脚可引导)
- 两个控制器局域网 (CAN) 总线端口(引脚可引导)
- 两个串行外设接口 (SPI) 端口 (引脚可引导)
- 两个与 UART 兼容的串行通信接口 (SCI)(引脚可引导)
- 一个与 UART 兼容的本地互连网络 (LIN)
- 一个带发送器和接收器的快速串行接口 (FSI)
- 模拟系统
- 三个 3.45MSPS 12 位模数转换器 (ADC)
- 多达 21 个外部通道
- 每个 ADC 具有四个集成后处理块 (PPB)
- 七个带 12 位参考数模 转换器 (DAC) 的窗口比较器 (CMPSS)
- 两个 12 位缓冲 DAC 输出
- 七个可编程增益放大器 (PGA)
输入、输出扩展板
本扩展板包含如下功能:
- 按键、旋转编码器输入 - 以模拟信号的方式
- 双电位计控制输入 - 以数字信号的方式
- RGB三色LED显示
- 1.44寸128*128 LCD,SPI总线访问
- MMA7660三轴姿态传感器
- 电阻加热
- 温度传感器
实现的功能及图片展示
正常工作
报警
报警模式1
报警模式2
调节温度阈值
主要代码片段及说明
初始化部分
Device_init();
Device_initGPIO();
Interrupt_initModule();
Interrupt_initVectorTable();
Board_init();
EINT;
ERTM;
GPIO_writePin(my_LED_R, 1);
GPIO_writePin(my_LED_G, 1);
GPIO_writePin(my_LED_B, 1);
LCD_Init();
LCD_Fill(0, 0, LCD_W, LCD_H, BLACK);
LCD_ShowString(0, 0, (uint8_t*)"temp:", WHITE, BLACK, 16, 0);
I2C_Init();
摇杆状态获取
if(pwmin_mode == 0 && !GPIO_readPin(myPWMin)) //0
{
pwmin_mode = 1;
}
else if(pwmin_mode == 1 && GPIO_readPin(myPWMin)) //1
{
pwmin_mode = 2;
pwm_num = 0;
}
else if(pwmin_mode == 2 && GPIO_readPin(myPWMin)) //1
{
DEVICE_DELAY_US(1);
pwm_num++;
}
if(pwmin_mode == 2 && !GPIO_readPin(myPWMin))
{
pwmin_mode = 3;
}
按键ADC转化
void adc_key_change(uint16_t adc)
{
static uint8_t adc_key = 0;
if(adc >= 4000)
{
if(adc_key == 10) key_flag = 1;
else if(adc_key == 11) key_flag = 2;
adc_key = 0;
}
else if(adc < 4000 && adc >= 2800) adc_key = 10;//2940
else if(adc < 2800 && adc >= 1500) adc_key = 11;//1921
}
NST112温度读取
float Read_NST112_Temp(void)
{
int Origin_Temp = I2C_ReadReg(NST112_ADDRESS,NST112_REG_Temp);
double Temp = (Origin_Temp>>4) * 0.0625;
return (float)Temp;
}
主要控制逻辑
pwmin_mode = 0;
if(pwm_num < 300) led_mode = 1;
else if(pwm_num > 500) led_mode = 2;
else led_mode = 0;
LCD_ShowIntNum(40, 32, led_mode, 1, WHITE, BLACK, 16);
ADC_forceMultipleSOC(myADC0_BASE, (ADC_FORCE_SOC0));
while(ADC_getInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1) == false)
{
}
ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1);
myADC0Result0 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
adc_key_change(myADC0Result0);
// LCD_ShowIntNum(40, 48, myADC0Result0, 5, WHITE, BLACK, 16);
if(key_flag != 0)
{
if(key_flag == 1)
{
alarm_temp += 1;
}
else if(key_flag == 2)
{
alarm_temp -= 1;
}
key_flag = 0;
}
LCD_ShowFloatNum1(0, 16, alarm_temp, 4, WHITE, BLACK, 16);
temp = Read_NST112_Temp();
LCD_ShowFloatNum1(40, 0, temp, 4, WHITE, BLACK, 16);
GPIO_writePin(my_LED_R, 1);
GPIO_writePin(my_LED_G, 1);
GPIO_writePin(my_LED_B, 1);
if(temp > alarm_temp)
{
if(led_mode == 0) GPIO_writePin(my_LED_R, 0);
else if(led_mode == 1) GPIO_writePin(my_LED_G, 0);
else GPIO_writePin(my_LED_B, 0);
}
遇到的主要难题及解决方法
问题:直接插上扩展板,许多IO不兼容。
办法:使用排线连接。
问题:扩展板上有一个按键无法使用。
办法:将短路的0欧电阻换成电容。
问题:摇杆产生频率比较低,Ecap模块很难完美捕捉。
办法:IO输入检测的方式实现摇杆功能。
未来的计划或建议
建议优化扩展板,使其直接插到板子上就能使用,不用很麻烦的去连接线路了。或者可以使用类似TI开发板那种一面是排母一面是排针的座子,直接连线就能用,不用从背面插线,连接不稳定了。
计划:
智能化升级:利用人工智能和机器学习技术,实现系统对环境温度的自动学习、自适应,提高温度调节的精准度和效率。
物联网集成:将系统接入物联网,实现远程监控和控制,方便用户随时随地了解温度状况并进行调节。
节能环保:采用更高效的温度调节算法和设备,降低能耗,减少碳排放,实现绿色可持续发展。
人机交互优化:提升用户界面友好性,简化操作流程,提高用户体验。
拓展应用领域:将系统应用于更多领域,如智能家居、农业温室、医疗设备等,实现更广泛的应用价值。