You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32控制二号计量泵时触发流量计ISR误触发问题求助

问题:ESP32控制计量泵时干扰流量计ISR触发

项目概况

  • 开发环境:Arduino IDE + NodeMCU-ESP32
  • 硬件连接:
    • 高精度脉冲流量计 → D4引脚
    • 两台脉冲计量泵 → 分别接D2、D15引脚
  • 依赖库:
/* Libraries */
// Include WiFi Library
#include <WiFi.h>
#include <HTTPClient.h>
// Include Serial Peripheral Interface library
#include <SPI.h>
// Include WiFi UDP Protocol
#include <WiFiUdp.h>
// Include ESP32 Time Library
#include <ESP32Time.h>
// Include Firebase ESP32 library (this library)
#include <FirebaseESP32.h>
// Provide the token generation process info.
#include <addons/TokenHelper.h>
// Provide the RTDB payload printing info and other helper functions.
#include <addons/RTDBHelper.h>

#include <pwmWrite.h>
  • 系统架构:状态机模式,核心1处理Google RTDB云服务并更新全局变量,核心0负责业务逻辑以降低延迟

流量计ISR实现

当前通过带millis()的ISR记录流量计脉冲间隔及累计流量,代码如下:

void IRAM_ATTR inPulse(){
  button_time = millis();
  intervalPulse = button_time - last_button_time;
  if(button_time - last_button_time > 250){
    state = !state;
    prevTrail = HIGH;
    pulseDetect = 1;
    last_button_time = button_time;
    dailyFlow = dailyFlow + fMLPP;
  }
}

问题现象

所有设备共地,单台计量泵工作正常;但控制二号计量泵时(无论PWM信号还是通断控制),都会触发流量计的ISR,导致流量间隔记录异常。已尝试在计量泵GPIO引脚接10kΩ下拉电阻至地,问题仍未解决,怀疑是信号反射或EMI干扰导致。

技术建议

硬件层面优化

  • 增加电源滤波:计量泵属于感性负载,启停或PWM调制时会产生尖峰干扰。在计量泵电源输入端并联100μF电解电容+0.1μF陶瓷电容,同时在ESP32的VCC引脚也加滤波电容,切断电源传导干扰路径。
  • 信号隔离:给流量计的信号引脚加光耦隔离模块(如PC817),彻底切断计量泵侧的干扰耦合到ESP32的GPIO回路。注意光耦的输入输出分别接各自电源(共地可保留,但信号路径完全隔离)。
  • 布线优化:将流量计的信号线与计量泵的动力线/控制线分开布线,避免平行走线;若为PCB设计,两者之间增加地线隔离层;短线缆优先使用屏蔽线,屏蔽层单端接地。
  • 瞬态抑制:在流量计的D4引脚与地之间并联TVS二极管(如SMBJ5.0CA),吸收尖峰干扰脉冲;计量泵的控制引脚也可并联TVS或压敏电阻,抑制驱动时的反向电动势。

软件层面优化

  • 优化ISR防抖逻辑:当前250ms防抖阈值可能无法过滤快速干扰脉冲,可调整为:
    • 增加脉冲计数,连续检测到2次以上电平变化才判定为有效脉冲
    • 改用micros()替代millis()提升时间精度,同时缩小防抖窗口(比如50μS-100μS,根据流量计脉冲频率调整)
  • 中断优先级调整:将流量计的ISR优先级设为最高,降低计量泵控制操作的优先级,避免总线干扰影响中断响应。示例代码:
// 初始化时设置中断优先级(ESP32优先级0-3,0为最高)
attachInterrupt(digitalPinToInterrupt(4), inPulse, RISING);
portSET_INTERRUPT_MASK_FROM_ISR();
gpio_set_intr_type(GPIO_NUM_4, GPIO_INTR_POSEDGE);
gpio_set_intr_priority(GPIO_NUM_4, 0);
portCLEAR_INTERRUPT_MASK_FROM_ISR(0);
  • 全局变量保护:ISR中操作的全局变量(如button_time、dailyFlow)需用volatile修饰,核心0/1访问这些变量时,使用临界区保护(portENTER_CRITICAL()/portEXIT_CRITICAL()),避免多核心访问导致的数据混乱,减少干扰引发的错误累计。

内容的提问来源于stack exchange,提问作者Gamme40

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:39:31