一、项目简介
使用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的微波炉