基于FreeRTOS和STM32的微波炉

一、项目简介

使用STM32F103C8T6、舵机、继电器、加热片、蜂鸣器、两个按键、LCD及DHT11传感器等硬件。进一步,结合FreeRTOS和状态机等软件实现了一个微波炉系统;实现的功能包含:人机交互、时间及功率设置、异常情况处理及固件升级等。

二、功能需求

(一)、初始状态

1、当STM32初始化后,LCD显示LCD屏幕显示欢迎界面(例如"Microwave Demo V1.1"),持续2秒后进入待机模式;

2、LED状态:腔体内部LED灯常亮(模拟门未关闭时的照明);

3、舵机状态:SG90舵机处于"开门"位置(角度0°,门锁未闭合)。

(二)、用户操作流程

1、用户手动关闭门,第一次按下按键KEY1关门,舵机旋转90°代表关闭,此时LED灯灭;

2、LCD显示默认时间和加热功率挡位:倒计时为0s;功率挡位为Medium;

3、用户短按KEY2开始设置倒计时,此时LCD打印"time setting",然后通过再次短按

KEY2循环切换倒计时打印在LCD屏幕上,短按一次加20s,最大为60s;设置好时间后长按 KEY2切换功率设置,此时LCD打印"Power setting",然后通过短按KEY2循环切换加热挡位 打印在LCD屏上(low/medium/high可选择),之后继续长按KEY2,又切换到"time setting"。

4、选择好时间及挡位后启动加热:

(1)长按KEY1启动加热,此时PWM开始控制加热片;

(2)转盘(用360°sg90舵机模拟)以恒定速度旋转;

(3)蜂鸣器短鸣两声"滴滴"代表开始运行;

(4)倒计时启动打印在LCD上;

(5)用DHT11实时显示温度在LCD上;

(6)LCD显示状态"Heating"表示正在加热。

5、加热完成

(1)倒计时归零,PTC加热片断电;

(2)转盘停止旋转;

(3)蜂鸣器短鸣三声"滴滴滴"代表结束;

(4)打印时间及温度在LCD上;

(5)打印"completed"状态在LCD上。

6、当第5步加热完成之后,门自动打开,此时LED灯亮;LCD显示默认时间设置及挡位设置。

(三)、异常情况处理流程

1、加热过程中断情况:

(1)当加热过程中,用户按下KEY1开门,此时加热片断电,转盘停止,LED灯亮起;

(2)倒计时暂停在LCD屏上,并且显示"Heating stopped!";

2、恢复加热:

(1)用户按下KEY1关闭门,LED灯熄灭,需再次长按KEY1才能启动加热操作并且继续倒计时。

3、温度过高:

(1)DHT11监测温度超过设定阈值,此时加热片断电,转盘停止,LED灯亮起,门自动打开;

(2)蜂鸣器短鸣四声"滴滴滴滴";

(3)LCD打印"Heating stopped!"。

4、门未关闭时启动:

(1)蜂鸣器短鸣一声,加热片和转盘不工作;

(2)LCD屏打印"Close door first"。

(四)、固件更新功能

(1)通过串口加DMA接收APP升级程序;

(2)编写Bootloader任务,将APP程序从RAM写到Flash上;

(3)设置SP及PC寄存器,重定向中断向量表;

(4)跳转到APP程序执行。

三、软件架构

四、硬件接线图

五、硬件设计

1、180°舵机驱动

舵机的控制通常要求约20ms的参考脉冲,其高电平区间通常为0.5-2.5毫秒,其总间距为2ms。而1.5ms转90度,因此也就是需要百分之五的占空比转90度,其舵机转动角度与脉冲宽度关系如图所示:

2、360°舵机驱动

其他硬件比较简单,不再过多叙述。

六、软件设计

设计亮点如下:

(1)使用面向对象思想编写BSP,方便移植以及维护,使用户仅关心接口而无需在意底层实现细节。

(2)使用状态机来实现两个按键的多功能切换需求。

(3)移植FreeRTOS源码并进行内核裁剪以适应STM32F103C8T6单片机。

(4)使用二值信号量完成多任务之间同步与通信。

(5)使用串口加DMA接收APP程序,减轻CPU负担。

(6)编写Bootloader任务,跳转到APP程序后实现固件升级。

(7)编写按键检测算法来识别长按/短按。

七、源代码

以下仅展示内核裁剪的程序,完整源程序请查看笔者其他帖子进行获取**。**

八、调试记录

1、程序下载进去时发生HardFault,调试一看是进入定时器中断了,说明TIM_Cmd(TIM2,DISABLE)函数不能关闭中断,仅能将定时器的计数器关闭,只能关闭中断自动触发功能,但未完全关闭中断,需要调用TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE)函数才能完全关闭掉。重新启用时也需要再次调用该函数打开中断。

2、当倒计时归零正常结束烹饪时,此时门会自动弹开,但是如果你现在再次短按KEY1,不会发生关门响应,这是因为没有对门状态复位。

3、由于我使用了TIM2的中断以及两路PWM,但是我设置TIM2中断频率与TIM2的PWM频率不一致,这导致PWM无法工作,造成冲突;因此,将TIM2中断换成TIM4中断,问题解决!

九、实物演示

IAP

基于FreeRTOS的微波炉

相关推荐
竹照煜_ysn2 小时前
蓝桥杯51单片机设计
单片机·嵌入式硬件·51单片机
Electron-er3 小时前
汽车LIN总线通讯:从物理层到协议栈的深度解析
单片机·汽车电子·lin总线·lin总线通讯
Do vis8243 小时前
STM32第十六天蓝牙模块
stm32·单片机·嵌入式硬件
学不动CV了3 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
猫猫的小茶馆5 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
jingshaoqi_ccc6 小时前
stm32的USART使用DMA配置成循环模式时发送和接收有着本质区别
stm32·单片机·嵌入式硬件
MingYue_SSS9 小时前
开关电源抄板学习
经验分享·笔记·嵌入式硬件·学习
玉树临风江流儿9 小时前
炸鸡派-定时器基础例程
单片机·嵌入式硬件
小宋同学在不断学习10 小时前
stm32-掌握SPI原理(一)
stm32·单片机·spi
is081510 小时前
STM32的 syscalls.c 和 sysmem.c
c语言·stm32·嵌入式硬件