编程技术分享

分享编程知识,探讨技术创新

0%

简介:电动送风口罩适用于实验室、医院、电焊、地下采矿、施工、养殖等。使用3M兼容滤网,内置风机通过管道系统向佩戴者面罩提供正压清洁空气;送风;正压式呼吸防护;PAPR;防护服;呼吸面具;面具;N95;空净

电动送风口罩嵌入式系统软件设计详解

关注微信公众号,提前获取相关推文

尊敬的领导和同事们,

作为一名高级嵌入式软件开发工程师,我很高兴能有机会向大家详细阐述电动送风口罩嵌入式系统的软件设计方案。本项目旨在开发一款可靠、高效、可扩展的电动送风口罩,为用户在各种恶劣环境中提供清洁、安全的呼吸保障。从需求分析到系统实现,再到测试验证和维护升级,我们将采用一系列经过实践验证的技术和方法,构建一个卓越的嵌入式系统平台。

1. 需求分析与系统目标

电动送风口罩的核心需求是为佩戴者提供经过滤的清洁空气,并维持面罩内的正压,防止外部污染空气进入。 结合产品简介和应用场景,我们可以细化出以下关键需求:

  • 核心功能:

    • 送风控制: 精确控制风机转速,提供稳定、可调节的送风量,满足不同活动强度下的呼吸需求。
    • 滤网状态监测: 实时监测滤网状态,提醒用户及时更换,确保过滤效果。
    • 电池管理: 高效管理电池电量,提供长时间续航,并具备低电量报警功能。
    • 用户界面: 简洁直观的用户界面,方便用户操作和获取系统信息。
    • 安全保障: 系统需具备过流、过压、过温等保护机制,确保用户和设备安全。
  • 性能指标:

    • 送风量: 可调节范围需覆盖轻度到重度劳动强度,例如:
      • 低速模式:例如 60-80 升/分钟 (LPM) (轻度活动,长时间使用)
      • 中速模式:例如 80-100 LPM (中度活动,平衡使用)
      • 高速模式:例如 100-120 LPM (重度活动,短时间使用)
    • 续航时间: 电池续航时间需满足日常使用需求,例如:
      • 低速模式:至少 8 小时
      • 中速模式:至少 6 小时
      • 高速模式:至少 4 小时
    • 噪音: 工作噪音需控制在用户可接受范围内,例如 < 60dB (取决于具体环境要求)。
    • 响应速度: 风速调节响应迅速,用户操作后能及时反馈。
    • 可靠性: 系统需稳定可靠,长时间运行不易发生故障。
    • 环境适应性: 能在不同温度、湿度环境下正常工作,例如:
      • 工作温度:-10°C ~ +50°C
      • 工作湿度:0% ~ 95% RH (非凝结)
  • 可扩展性:

    • 功能扩展: 预留扩展接口,方便未来增加新功能,例如:
      • 空气质量传感器 (PM2.5, VOCs 等)
      • 蓝牙/WiFi 通信 (数据记录、远程监控)
      • 语音交互
    • 硬件升级: 软件架构应易于移植到不同硬件平台,方便未来硬件升级换代。
  • 维护升级:

    • 固件升级: 支持通过 USB 或 OTA (Over-The-Air) 等方式进行固件升级,方便功能更新和bug修复。
    • 日志记录: 系统具备日志记录功能,方便故障诊断和分析。

系统目标总结: 我们致力于打造一款安全可靠、性能卓越、操作便捷、续航持久、易于维护升级的电动送风口罩嵌入式系统,满足用户在各种工作环境下的呼吸防护需求。

2. 代码设计架构:分层架构与模块化设计

为了实现上述系统目标,并确保代码的可读性、可维护性、可扩展性和可测试性,我们选择分层架构模块化设计相结合的代码架构。这种架构将系统功能划分为若干层次和模块,各层之间职责清晰,模块之间相互独立,降低了系统复杂度,提高了开发效率和代码质量。

2.1 分层架构

我们将系统软件架构划分为以下四个层次:

  • 硬件抽象层 (HAL - Hardware Abstraction Layer): HAL 层位于最底层,直接与硬件交互。它封装了底层硬件的细节,向上层提供统一的硬件接口。HAL 层的主要职责包括:

    • 外设驱动: 提供 MCU 各个外设 (GPIO, ADC, PWM, UART, SPI, I2C, Timer 等) 的驱动函数,例如 GPIO 的初始化、读写,ADC 的采样,PWM 的输出控制,UART 的数据收发等。
    • 硬件初始化: 负责 MCU 启动时的硬件初始化,包括时钟配置、外设初始化、中断配置等。
    • 平台适配: 针对不同的 MCU 平台,HAL 层需要进行相应的适配,确保上层代码无需修改即可在不同硬件平台上运行。
  • 内核层 (Kernel Layer): 内核层构建在 HAL 层之上,是系统的核心层。它负责操作系统的核心功能,例如任务调度、内存管理、中断管理、时间管理、同步与通信等。根据项目需求,我们可以选择以下两种内核方案:

    • 实时操作系统 (RTOS - Real-Time Operating System): 如果系统对实时性要求较高,需要复杂的任务管理和同步机制,则选择 RTOS,例如 FreeRTOS, uC/OS-III, RT-Thread 等。RTOS 提供了多任务调度、优先级管理、信号量、互斥锁、消息队列等机制,方便开发复杂的并发应用。
    • 裸机系统 (Bare-Metal System): 如果系统功能相对简单,对实时性要求不高,且资源有限,则可以选择裸机系统。裸机系统直接运行在硬件之上,代码执行效率高,资源占用少,但需要开发者自行管理任务调度、中断处理等。

    本项目考虑到电动送风口罩的实时性要求 (例如风速调节的及时响应,滤网状态的实时监测),以及未来功能扩展的可能性,我们推荐采用 RTOS (例如 FreeRTOS) 作为内核

  • 系统服务层 (System Service Layer): 系统服务层构建在内核层之上,提供各种系统级服务,供应用层调用。系统服务层的主要模块包括:

    • 电源管理模块: 负责电池电量监测、充电管理、低电量报警、休眠模式控制等。
    • 风机控制模块: 负责风机 PWM 控制、速度调节、故障检测、风速传感器数据处理等。
    • 滤网监测模块: 负责滤网状态监测 (例如压差传感器数据处理、定时器计数等)、滤网寿命计算、更换提醒等。
    • 用户界面模块: 负责按键输入处理、LED 指示灯控制、显示屏驱动 (如果配备)、蜂鸣器控制等。
    • 报警管理模块: 负责系统报警事件管理,例如低电量报警、滤网堵塞报警、风机故障报警等。
    • 日志管理模块: 负责系统运行日志记录、错误日志记录等。
  • 应用层 (Application Layer): 应用层位于最上层,是面向用户的最外层。它基于系统服务层提供的接口,实现具体的应用逻辑。应用层的主要职责包括:

    • 系统初始化: 调用系统服务层接口,完成系统初始化配置。
    • 用户交互: 接收用户输入 (按键操作),调用用户界面模块显示系统状态,并根据用户操作调用相应的系统服务。
    • 工作模式管理: 实现不同的工作模式 (例如低速模式、中速模式、高速模式),并根据用户选择或环境条件切换模式。
    • 系统监控: 实时监控系统状态 (例如电量、风速、滤网状态等),并在异常情况下触发报警。
    • 固件升级管理: 实现固件升级流程 (如果支持)。

2.2 模块化设计

在每个层次内部,我们都采用模块化设计,将功能进一步细分为独立的模块。模块之间通过定义清晰的接口进行通信,降低模块之间的耦合度,提高代码的可重用性和可维护性。例如,在系统服务层中,电源管理模块、风机控制模块、滤网监测模块、用户界面模块等都是独立的模块,每个模块负责特定的功能,并对外提供明确的接口。

3. 关键技术与方法

在本项目开发过程中,我们将采用以下经过实践验证的关键技术和方法:

  • C 语言编程: C 语言是嵌入式系统开发的首选语言,具有高效、灵活、可移植性强等优点。我们将采用规范的 C 语言编程风格,注重代码的可读性和可维护性。
  • FreeRTOS 实时操作系统: FreeRTOS 是一款开源、轻量级的实时操作系统,非常适合资源受限的嵌入式系统。我们将利用 FreeRTOS 的多任务调度、优先级管理、同步与通信机制,构建高效的并发系统。
  • PWM 脉冲宽度调制: PWM 技术用于精确控制风机转速,实现送风量的调节。我们将利用 MCU 的 PWM 外设,生成 PWM 信号控制风机驱动电路。
  • ADC 模数转换: ADC 用于采集模拟传感器信号,例如电压传感器 (电池电量监测)、压差传感器 (滤网状态监测)、风速传感器等。我们将利用 MCU 的 ADC 外设,将模拟信号转换为数字信号进行处理。
  • 定时器 (Timer): 定时器用于实现定时任务,例如周期性采样传感器数据、定时检测滤网状态、定时更新显示屏等。我们将利用 MCU 的定时器外设,配置定时中断,实现精确的定时控制。
  • 中断 (Interrupt): 中断用于快速响应外部事件,例如按键输入、传感器报警等。我们将合理配置中断优先级,确保关键事件得到及时处理。
  • 有限状态机 (FSM - Finite State Machine): FSM 用于管理系统的状态转换,例如工作模式切换、报警状态处理等。我们将使用 FSM 设计系统状态机,提高系统逻辑的清晰度和可维护性。
  • 软件看门狗 (Software Watchdog): 软件看门狗用于监控系统运行状态,防止程序跑飞或死机。我们将启用软件看门狗,提高系统的可靠性。
  • 日志记录 (Logging): 日志记录用于记录系统运行信息、错误信息等,方便故障诊断和分析。我们将实现简单的日志记录功能,方便调试和维护。
  • 单元测试 (Unit Testing): 单元测试用于验证每个模块的功能是否正确。我们将编写单元测试用例,对关键模块进行测试,确保代码质量。
  • 集成测试 (Integration Testing): 集成测试用于验证模块之间的接口是否正确,以及系统整体功能是否正常。我们将进行集成测试,确保系统各个模块协同工作。
  • 系统测试 (System Testing): 系统测试用于验证系统是否满足所有需求,包括功能需求、性能指标、可靠性、安全性等。我们将进行系统测试,确保产品质量符合标准。

4. 具体 C 代码实现 (示例代码,仅供参考,完整代码超过 3000 行)

为了更直观地展示代码架构和关键技术,以下提供部分 C 代码示例,涵盖 HAL 层、内核层 (FreeRTOS)、系统服务层和应用层的重要模块。 请注意,以下代码仅为示例,并非完整代码,完整代码将超过 3000 行,并包含更详细的注释、错误处理和功能实现。

(1) HAL 层 (HAL_gpio.h 和 HAL_gpio.c - 示例 GPIO 驱动)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// HAL_gpio.h
#ifndef HAL_GPIO_H
#define HAL_GPIO_H

#include <stdint.h>

typedef enum {
GPIO_PIN_0,
GPIO_PIN_1,
GPIO_PIN_2,
GPIO_PIN_3,
// ... 定义更多 GPIO 引脚
GPIO_PIN_MAX
} GPIO_PinTypeDef;

typedef enum {
GPIO_MODE_INPUT,
GPIO_MODE_OUTPUT,
GPIO_MODE_AF // Alternate Function
} GPIO_ModeTypeDef;

typedef enum {
GPIO_PULL_NONE,
GPIO_PULL_UP,
GPIO_PULL_DOWN
} GPIO_PullTypeDef;

typedef enum {
GPIO_SPEED_LOW,
GPIO_SPEED_MEDIUM,
GPIO_SPEED_HIGH
} GPIO_SpeedTypeDef;

typedef struct {
GPIO_PinTypeDef Pin;
GPIO_ModeTypeDef Mode;
GPIO_PullTypeDef Pull;
GPIO_SpeedTypeDef Speed;
} GPIO_InitTypeDef;

void HAL_GPIO_Init(GPIO_InitTypeDef *GPIO_InitStruct);
void HAL_GPIO_WritePin(GPIO_PinTypeDef Pin, uint8_t PinState);
uint8_t HAL_GPIO_ReadPin(GPIO_PinTypeDef Pin);

#endif // HAL_GPIO_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// HAL_gpio.c
#include "HAL_gpio.h"
// ... 包含 MCU 相关的头文件,例如寄存器定义

void HAL_GPIO_Init(GPIO_InitTypeDef *GPIO_InitStruct) {
// ... 根据 GPIO_InitStruct 配置 MCU 硬件寄存器,例如
// 使能 GPIO 时钟
// 配置 GPIO 引脚模式 (输入/输出/复用)
// 配置 GPIO 上下拉电阻
// 配置 GPIO 输出速度
}

void HAL_GPIO_WritePin(GPIO_PinTypeDef Pin, uint8_t PinState) {
// ... 根据 Pin 和 PinState 控制 GPIO 输出,例如
// 设置或清除 GPIO 输出寄存器
}

uint8_t HAL_GPIO_ReadPin(GPIO_PinTypeDef Pin) {
// ... 读取 GPIO 输入状态,例如
// 读取 GPIO 输入寄存器,并根据 Pin 获取对应引脚的状态
return 0; // 返回 GPIO 引脚状态 (0 或 1)
}

(2) 内核层 (FreeRTOS 任务创建和调度 - 示例任务定义)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "FreeRTOS.h"
#include "task.h"

// ... 其他 FreeRTOS 头文件

void FanControlTask(void *pvParameters);
void UIUpdateTask(void *pvParameters);
void BatteryMonitorTask(void *pvParameters);

void SystemInitTasks(void) {
xTaskCreate(FanControlTask, "FanCtrl", 128, NULL, 2, NULL); // 创建风机控制任务,优先级 2
xTaskCreate(UIUpdateTask, "UIUpdate", 128, NULL, 1, NULL); // 创建 UI 更新任务,优先级 1
xTaskCreate(BatteryMonitorTask, "BatMon", 128, NULL, 1, NULL); // 创建电池监测任务,优先级 1
// ... 创建更多任务
}

void FanControlTask(void *pvParameters) {
while (1) {
// ... 风机控制逻辑,例如读取目标风速,控制 PWM 输出
vTaskDelay(pdMS_TO_TICKS(10)); // 任务延时 10ms
}
}

void UIUpdateTask(void *pvParameters) {
while (1) {
// ... UI 更新逻辑,例如读取系统状态,更新 LED 指示灯或显示屏
vTaskDelay(pdMS_TO_TICKS(100)); // 任务延时 100ms
}
}

void BatteryMonitorTask(void *pvParameters) {
while (1) {
// ... 电池监测逻辑,例如读取 ADC 采样值,计算电量百分比,判断低电量报警
vTaskDelay(pdMS_TO_TICKS(1000)); // 任务延时 1000ms
}
}

(3) 系统服务层 (FanControlModule.h 和 FanControlModule.c - 示例风机控制模块)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// FanControlModule.h
#ifndef FAN_CONTROL_MODULE_H
#define FAN_CONTROL_MODULE_H

#include <stdint.h>

typedef enum {
FAN_SPEED_LEVEL_LOW,
FAN_SPEED_LEVEL_MEDIUM,
FAN_SPEED_LEVEL_HIGH,
FAN_SPEED_LEVEL_MAX
} FanSpeedLevelTypeDef;

typedef enum {
FAN_STATUS_OK,
FAN_STATUS_FAULT
} FanStatusTypeDef;

void FanControlModule_Init(void);
void FanControlModule_SetSpeedLevel(FanSpeedLevelTypeDef level);
FanSpeedLevelTypeDef FanControlModule_GetSpeedLevel(void);
FanStatusTypeDef FanControlModule_GetStatus(void);

#endif // FAN_CONTROL_MODULE_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// FanControlModule.c
#include "FanControlModule.h"
#include "HAL_pwm.h" // 假设有 HAL_pwm 驱动
#include "HAL_gpio.h" // 假设有 GPIO 用于风机故障检测

#define FAN_PWM_PIN GPIO_PIN_X // 定义风机 PWM 控制引脚
#define FAN_FAULT_PIN GPIO_PIN_Y // 定义风机故障检测引脚

static FanSpeedLevelTypeDef currentSpeedLevel = FAN_SPEED_LEVEL_LOW;
static FanStatusTypeDef currentFanStatus = FAN_STATUS_OK;

void FanControlModule_Init(void) {
// 初始化 PWM 输出引脚
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = FAN_PWM_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT; // 配置为 PWM 输出模式
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(&GPIO_InitStruct);

// 初始化风机故障检测引脚 (输入模式,上拉/下拉电阻根据硬件设计确定)
GPIO_InitStruct.Pin = FAN_FAULT_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULL_UP; // 例如使用上拉电阻
HAL_GPIO_Init(&GPIO_InitStruct);

FanControlModule_SetSpeedLevel(FAN_SPEED_LEVEL_LOW); // 默认设置为低速
}

void FanControlModule_SetSpeedLevel(FanSpeedLevelTypeDef level) {
currentSpeedLevel = level;
uint32_t pwmDutyCycle = 0;

switch (level) {
case FAN_SPEED_LEVEL_LOW:
pwmDutyCycle = 30; // 例如 30% 占空比对应低速
break;
case FAN_SPEED_LEVEL_MEDIUM:
pwmDutyCycle = 60; // 例如 60% 占空比对应中速
break;
case FAN_SPEED_LEVEL_HIGH:
pwmDutyCycle = 90; // 例如 90% 占空比对应高速
break;
default:
pwmDutyCycle = 0;
break;
}

// ... 调用 HAL_pwm 驱动函数设置 PWM 占空比,例如
// HAL_PWM_SetDutyCycle(FAN_PWM_PIN, pwmDutyCycle);
// (需要根据具体的 HAL_pwm 驱动接口进行实现)
// 这里假设 HAL_PWM_SetDutyCycle 函数存在并接受引脚和占空比作为参数

// ... (实际代码中需要根据硬件 PWM 驱动的具体实现进行调整)
}

FanSpeedLevelTypeDef FanControlModule_GetSpeedLevel(void) {
return currentSpeedLevel;
}

FanStatusTypeDef FanControlModule_GetStatus(void) {
// 检测风机故障引脚状态
if (HAL_GPIO_ReadPin(FAN_FAULT_PIN) == 0) { // 假设低电平表示故障 (根据硬件设计确定)
currentFanStatus = FAN_STATUS_FAULT;
} else {
currentFanStatus = FAN_STATUS_OK;
}
return currentFanStatus;
}

(4) 应用层 (main.c - 示例主程序)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "FreeRTOS.h"
#include "task.h"
#include "SystemInit.h" // 假设 SystemInit.h 中包含系统初始化函数
#include "FanControlModule.h"
#include "UIModule.h" // 假设 UIModule.h 中包含 UI 模块接口
#include "BatteryMonitorModule.h" // 假设 BatteryMonitorModule.h 中包含电池监测模块接口
#include "AlarmModule.h" // 假设 AlarmModule.h 中包含报警模块接口

int main(void) {
System_Init(); // 系统硬件和软件初始化 (包括 HAL 初始化、RTOS 初始化等)

FanControlModule_Init();
UIModule_Init();
BatteryMonitorModule_Init();
AlarmModule_Init();

SystemInitTasks(); // 创建 FreeRTOS 任务

vTaskStartScheduler(); // 启动 FreeRTOS 任务调度器

// 理论上程序不会运行到这里,因为任务调度器会一直运行
while (1) {
// ... 错误处理或空闲任务逻辑
}
return 0;
}

void System_Init(void) {
// ... 硬件初始化 (时钟、外设等)
// HAL_Init(); // 初始化 HAL 层
// ... RTOS 初始化 (如果使用 RTOS)
}

5. 测试验证与维护升级

5.1 测试验证

为了确保系统质量,我们将进行全面的测试验证,包括:

  • 单元测试: 针对每个模块编写单元测试用例,验证模块功能的正确性。
  • 集成测试: 测试模块之间的接口和协作,验证模块集成后的功能是否正常。
  • 系统测试: 全面测试系统的功能、性能、可靠性、安全性,验证系统是否满足所有需求。
  • 压力测试: 长时间高负载运行系统,测试系统的稳定性和可靠性。
  • 环境测试: 在不同的温度、湿度环境下测试系统,验证系统的环境适应性。
  • 用户体验测试: 邀请用户试用产品,收集用户反馈,改进用户界面和操作体验。

5.2 维护升级

为了方便后续的维护和升级,我们设计了以下机制:

  • 固件升级: 预留固件升级接口 (例如 USB 或 OTA),方便未来进行功能更新和 bug 修复。固件升级流程需要保证安全可靠,防止升级失败导致设备不可用。
  • 日志记录: 系统具备日志记录功能,方便故障诊断和分析。日志可以记录系统运行信息、错误信息、报警信息等。
  • 模块化设计: 模块化的代码架构使得维护和升级更加方便,修改一个模块的代码不会影响其他模块。
  • 版本控制: 使用版本控制系统 (例如 Git) 管理代码,方便代码的跟踪、回溯和协同开发。
  • 文档编写: 编写详细的设计文档、代码注释和用户手册,方便维护人员理解和维护系统。

6. 总结与展望

本方案详细阐述了电动送风口罩嵌入式系统的软件设计架构、关键技术和方法。通过采用分层架构与模块化设计,结合 FreeRTOS 实时操作系统、PWM 控制、ADC 采样、定时器中断等技术,我们将构建一个可靠、高效、可扩展的嵌入式系统平台。通过全面的测试验证和完善的维护升级机制,我们将确保产品质量,并为用户提供卓越的使用体验。

未来,我们可以进一步扩展系统功能,例如:

  • 集成空气质量传感器: 实时监测空气质量 (PM2.5, VOCs 等),并根据空气质量自动调节送风量。
  • 增加蓝牙/WiFi 通信功能: 实现数据记录、远程监控、云平台接入等功能。
  • 优化用户界面: 采用更先进的显示技术 (例如 OLED 显示屏),提供更丰富的信息显示和更友好的用户交互。
  • 智能化控制: 引入人工智能算法,实现更智能化的送风控制、滤网寿命预测等功能。

我们相信,通过不断的技术创新和精益求精的开发精神,电动送风口罩嵌入式系统将不断完善,为用户提供更安全、更舒适、更智能的呼吸防护解决方案。

请注意: 以上代码示例和文字描述旨在阐述电动送风口罩嵌入式系统的软件设计思路和关键技术,并非完整的可直接编译运行的代码。 实际项目开发中,需要根据具体的硬件平台、功能需求和性能指标进行详细设计和代码实现,并进行充分的测试验证。 完整代码实现将远超过 3000 行,包含更详细的注释、错误处理、功能模块和驱动代码。

感谢您的阅读!

欢迎关注我的其它发布渠道