共计 1300 个字符,预计需要花费 4 分钟才能阅读完成。
技术背景
在工业现场水箱水位监测中,常见的问题包括模拟信号易受干扰、多传感器优先级处理复杂等。传统 ADC 采样方案虽然精度高,但在复杂工业环境中容易受到电磁干扰,导致数据不稳定。此外,当多个水位传感器同时触发时,如何确定优先级也是一个难题。
方案对比
- 传统 ADC 方案
- 优点:精度高,可获取连续水位数据
-
缺点:抗干扰能力差,响应速度慢,成本较高
-
74147 优先编码器方案
- 优点:硬件优先级处理,响应速度快,抗干扰能力强,成本低
- 缺点:只能获取离散水位等级
实现细节
电路设计

- 关键元件参数:
- R1-R9: 10kΩ 上拉电阻
- C1-C9: 100nF 滤波电容
- 74147: 优先编码器 IC
STM32 驱动代码
// GPIO 初始化
void WaterLevel_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置输入引脚
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置中断
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
// 中断处理
void EXTI0_IRQHandler(void) {HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
// 读取水位数据
uint8_t level = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) << 3) |
(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) << 2) |
(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) << 1) |
HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
// 处理水位变化
HandleWaterLevelChange(level);
}
真值表映射
| 输入 | 输出 | 水位等级 |
|---|---|---|
| 0000 | 1111 | 空 |
| 0001 | 1110 | 低 |
| 0011 | 1100 | 中低 |
| 0111 | 1000 | 中 |
| 1111 | 0000 | 高 |
避坑指南
- 信号抖动处理
- 推荐使用 100nF 电容和 10kΩ 电阻组成 RC 滤波电路
-
软件端可增加 50ms 消抖延时
-
多传感器竞争处理
- 74147 本身具有优先级功能,最高位传感器优先
-
在软件端可设置优先级覆盖规则
-
电磁兼容设计
- 信号线使用双绞线
- 在 PCB 布局时保持模拟和数字地分离
- 添加 TVS 二极管保护输入端口
测试验证
- 示波器波形
- 正常信号:稳定高 / 低电平
-
干扰信号:可见高频毛刺被 RC 滤波消除
-
响应时间测试
- 水位变化到系统响应:<10ms
- 从低到高全量程扫描:<50ms
扩展思考
将此方案扩展为多水箱监控系统:
- 每个水箱使用独立的 74147 编码器
- 通过片选信号轮流读取各水箱数据
- 在 STM32 端增加水箱 ID 识别功能
- 使用 RS485 总线实现远距离传输
资源下载
正文完
发表至: 未分类
近一天内
