一、项目是什么
- 这是一个用STM32F103C8T6单片机加FreeRTOS操作系统做的智能油烟机项目。
- 它能自动检测厨房烟雾浓度和温湿度,根据环境自动调节风机转速。
- 它支持手动控制挡位,还有防回流检测和待机模式。
- 它带LCD屏幕显示状态,按键切换模式,蜂鸣器提示音。
- 它支持串口固件升级,不用拆机就能更新程序。
二、硬件大体构成
- 主控芯片是STM32F103C8T6,相当于系统的大脑。
- 直流有刷电机加驱动板负责排风,12V电源适配器供电。
- MQ2烟雾传感器和DHT11温湿度传感器负责环境检测。
- LCD屏幕负责显示,按键负责输入,蜂鸣器负责提示。
- 编码器装在电机上测转速,串口和ST-LINK负责调试和烧录。
三、软件架构怎么分层
- 整个软件分成三层,分别是驱动层,中间层和应用层。
- 驱动层直接操作单片机外设,比如控制电机,读传感器,显示屏幕。
- 中间层是FreeRTOS操作系统,负责任务调度和资源管理。
- 应用层按功能划分成多个任务,每个任务只做一件事。
- 分层的好处是底层驱动和应用逻辑解耦,换硬件不用改上层代码。
四、应用层划分了哪些任务
- 编码器测速任务负责算电机实际转速,优先级最高。
- 电机控制任务负责速度闭环,用PID让实际转速跟上目标转速。
- 按键扫描任务负责检测按键,处理短按和长按。
- 传感器采集任务负责读DHT11和MQ2的数据。
- 风速计算任务负责根据传感器数据算出合适的风速。
- 防回流任务负责检测油烟倒灌,防止风机反复启停。
- UI显示任务负责刷新LCD屏幕,优先级最低。
- 每个任务按自己的周期运行,比如传感器每500毫秒采一次,UI每200毫秒刷新一次。
五、任务之间怎么通信
- 任务间用互斥量加全局变量的方式共享数据。
- 全局变量集中放在一个系统状态结构体里,比如当前模式,风速值,转速值。
- 任务要读写共享数据前先获取互斥量,用完立即释放。
- 选互斥量而不是队列,是因为只关心最新状态,不需要历史数据,内存开销也小。
六、优先级怎么设计
- FreeRTOS里数值越大优先级越高,本项目用了7个优先级等级。
- 测速任务放最高,因为转速数据是控制的基础,需要及时更新。
- 电机控制任务其次,按键扫描居中,UI显示放最低。
- 传感器和风速计算同级,靠时间片轮转调度。
- 设计思路是重要且紧急的任务优先,慢任务不阻塞快任务。
七、几个核心机制
- 风速融合算法把温度湿度烟雾浓度归一化后加权计算,烟雾权重最高。
- PID闭环控制让电机转速稳定,误差控制在百分之五以内。
- 防回流用动态阈值,第一次触发就切高阈值,浓度回落后才关风机。
- 自动模式是状态机,有启动,烹饪和延时关机三个状态。
- Bootloader升级流程是Python生成带CRC32校验的固件,串口加DMA接收,校验通过才写Flash并跳转。
八、我的理解
- 这个项目学的是FreeRTOS多任务架构,任务怎么划分,优先级怎么定,数据怎么保护。
- 其次是驱动层的写法,用结构体封装外设,代码复用性高。
- 最后是PID闭环和Bootloader。
- 我的复现计划是先了解整个项目的大体框架,然后变为PC机一步一步跑代码,理解每一段代码的含义,遇到问题查资料补习不懂得点。
- 硬件等材料到齐花一天时间组装起来,上电跑一遍。