1. 项目概述
这个基于STM32单片机的智能电梯控制系统是我最近完成的一个嵌入式项目,它集成了多种安全防护和智能管理功能。作为一名有多年嵌入式开发经验的工程师,我想分享一下这个项目的设计思路和实现细节。
这个系统最核心的特点是实现了多重安全防护机制:包括防夹功能、超重检测、RFID权限管理和烟雾报警。同时通过语音播报和OLED显示屏提供了良好的人机交互体验。整个系统采用STM32F103C8T6作为主控芯片,这是STM32系列中性价比很高的一款单片机,具有丰富的外设接口和足够的处理能力。
提示:在实际电梯控制系统中,安全永远是第一位的。这个项目虽然是一个模拟系统,但所有安全功能的设计都参考了真实电梯的安全标准。
2. 硬件系统设计
2.1 核心硬件组成
整个系统的硬件架构可以分为以下几个主要部分:
-
主控模块:STM32F103C8T6最小系统板
- 72MHz Cortex-M3内核
- 64KB Flash, 20KB SRAM
- 丰富的外设接口:USART、SPI、I2C、ADC等
-
显示模块:0.96寸OLED显示屏
- 128x64分辨率
- I2C接口通信
- 低功耗,高对比度
-
输入模块:4×4矩阵键盘
- 用于楼层选择和功能控制
- 采用行扫描方式检测按键
-
RFID模块:MFRC522芯片
- 13.56MHz工作频率
- 支持ISO14443A协议
- 最大读取距离约5cm
-
称重模块:HX711 ADC芯片+称重传感器
- 24位高精度ADC
- 可编程增益:128或64
- 支持差分输入
-
电机驱动:L298N双H桥驱动模块
- 驱动电压:5-35V
- 峰值电流:2A
- 可控制电机正反转
-
语音模块:JR6001语音芯片
- 支持MP3/WAV格式
- 内置功放
- UART控制接口
-
烟雾检测:MQ-2烟雾传感器
- 检测可燃气体和烟雾
- 模拟量输出
- 快速响应时间
2.2 关键电路设计
电源电路设计:
系统需要多种电压等级:
- 5V:为大多数模块供电
- 3.3V:为STM32单片机供电
- 12V:电机驱动电压
采用LM2596开关稳压芯片将12V转换为5V,再通过AMS1117线性稳压得到3.3V。这种设计既保证了效率,又确保了单片机供电的稳定性。
电机驱动电路:
使用L298N驱动模块控制丝杠电机,模拟电梯轿厢运动。通过PWM信号控制电机速度,实现平稳启停。在硬件设计中特别注意了:
- 电机电源与逻辑电源隔离
- 添加续流二极管保护
- 加入滤波电容减少干扰
HX711称重电路:
称重传感器采用全桥式应变片传感器,输出微小电压信号。HX711芯片将其放大并转换为数字信号。电路设计要点:
- 传感器采用4线制接法(激励+、激励-、信号+、信号-)
- 靠近芯片放置0.1μF去耦电容
- 信号线尽量短,避免干扰
3. 软件系统设计
3.1 系统软件架构
整个软件系统采用模块化设计,主要分为以下几个功能模块:
- 主控制模块:负责系统初始化和任务调度
- 电梯控制模块:处理楼层呼叫和运行逻辑
- RFID处理模块:管理卡片识别和权限验证
- 称重检测模块:实时监测电梯载重
- 安全检测模块:处理防夹和烟雾报警
- 人机交互模块:管理显示和语音播报
- 通信模块:处理各外设的通信协议
系统采用前后台架构,主循环中轮询各功能模块状态,中断处理紧急事件(如防夹触发、烟雾报警等)。
3.2 关键算法实现
电梯调度算法:
c复制// 电梯运行方向决策伪代码
void decide_direction() {
if (current_floor < target_floor) {
direction = UP;
} else if (current_floor > target_floor) {
direction = DOWN;
} else {
direction = STOP;
}
// 检查沿途是否有同方向呼叫
for (int i = current_floor; i != target_floor; i += direction) {
if (call_buttons[i] && ((direction == UP && i > current_floor) ||
(direction == DOWN && i < current_floor))) {
add_intermediate_stop(i);
}
}
}
RFID权限验证流程:
- 卡片接近读卡器,触发中断
- 读取卡片UID和区块数据
- 验证卡片是否在授权列表中
- 根据卡片类型设置权限等级
- 启动权限计时器(约30秒无操作自动取消权限)
称重数据处理:
采用滑动窗口滤波算法处理称重数据:
c复制#define SAMPLE_SIZE 10
uint32_t weight_samples[SAMPLE_SIZE];
uint32_t filtered_weight = 0;
void update_weight() {
static uint8_t index = 0;
// 移出最旧样本
filtered_weight -= weight_samples[index] / SAMPLE_SIZE;
// 读取新样本
weight_samples[index] = HX711_Read();
// 加入新样本
filtered_weight += weight_samples[index] / SAMPLE_SIZE;
index = (index + 1) % SAMPLE_SIZE;
}
4. 功能实现细节
4.1 防夹功能实现
防夹功能通过红外对射传感器实现,安装在电梯门两侧。系统实时监测传感器状态:
- 当检测到门区有物体阻挡时,启动计时器
- 如果阻挡持续超过2秒,判定为防夹事件
- 立即停止关门动作,反转门电机打开门
- 语音播报"请注意安全,不要阻挡电梯门"
- 在OLED显示警告信息
注意:实际产品中,防夹检测应该采用冗余设计,建议至少使用两套独立传感器,并通过"与"逻辑判断,避免单点故障导致安全功能失效。
4.2 超重检测实现
超重检测流程:
-
系统上电后进行称重模块校准
- 空载时读取传感器值作为零点
- 加载已知重量校准斜率
-
实时监测电梯载重
- 每100ms读取一次重量
- 应用数字滤波算法
- 计算当前载重百分比
-
超重判断逻辑:
c复制if (current_weight > weight_threshold) {
set_overload_status(true);
play_voice("电梯超载,请减少载重");
disable_movement();
show_overload_warning();
} else {
set_overload_status(false);
}
4.3 RFID权限管理
系统支持两种权限卡:
- 普通卡(01-06层权限)
- 高级卡(07-12层权限)
权限验证状态机:
- 空闲状态:等待卡片接近
- 检测状态:发现卡片,读取UID
- 验证状态:检查卡片权限
- 授权状态:开启对应楼层按钮
- 超时状态:30秒无操作自动取消权限
卡片信息存储在STM32的Flash中,采用以下数据结构:
c复制typedef struct {
uint8_t uid[4]; // 卡片UID
uint8_t card_type; // 卡片类型:0-普通,1-高级
uint8_t enabled; // 是否启用
} CardInfo;
4.4 烟雾报警实现
烟雾检测流程:
- 每500ms读取一次MQ-2传感器输出
- 使用ADC采集模拟电压值
- 与预设阈值比较判断是否超标
- 如检测到烟雾:
- 启动蜂鸣器报警
- 显示警告信息
- 语音播报"警告,检测到烟雾"
- 自动将电梯运行至最近楼层并开门
5. 系统调试与优化
5.1 调试中遇到的问题
问题1:电机干扰导致称重数据不稳定
现象:电机运行时称重数据跳动大
解决方法:
- 为电机电源添加LC滤波电路
- 称重传感器信号线使用屏蔽线
- 软件上增加数字滤波强度
问题2:RFID读卡距离不稳定
现象:有时需要多次刷卡才能识别
解决方法:
- 调整天线匹配电路
- 优化软件寻卡流程
- 在卡片接近时短暂提高读卡功率
问题3:楼层停靠位置不准
现象:电梯停靠时与目标位置有偏差
解决方法:
- 增加光电编码器反馈
- 采用PID算法控制电机
- 设置软件限位保护
5.2 性能优化措施
-
电源管理优化:
- 动态调整外设供电
- 空闲时降低CPU频率
- 使用停机模式降低功耗
-
实时性优化:
- 关键任务使用中断驱动
- 合理设置任务优先级
- 使用DMA传输减轻CPU负担
-
存储器优化:
- 使用内存池管理动态内存
- 关键数据增加CRC校验
- 优化数据结构减少内存占用
6. 实际应用与扩展
6.1 系统部署建议
-
安装注意事项:
- 称重传感器应均匀分布在电梯底部
- 防夹传感器安装高度应考虑儿童和轮椅使用者
- RFID读卡器位置应方便刷卡操作
-
维护要点:
- 定期校准称重系统
- 清洁传感器表面避免误报
- 检查机械部件润滑情况
6.2 功能扩展方向
-
网络连接功能:
- 添加WiFi模块实现远程监控
- 故障自动上报
- OTA固件升级
-
人脸识别扩展:
- 增加摄像头模块
- 实现人脸识别权限验证
- 活体检测防伪
-
数据分析功能:
- 记录电梯使用数据
- 分析高峰时段
- 预测性维护
-
节能模式优化:
- 智能照明控制
- 待机时关闭非必要外设
- 根据使用习惯调整运行策略
在实际项目中,这个系统已经稳定运行了6个月,期间处理了各种使用场景。通过这个项目,我深刻体会到嵌入式系统开发中硬件可靠性和软件鲁棒性的重要性。特别是在安全关键系统中,每一个设计决策都需要反复验证。