在时间范围内忽略中断arduino(低通滤波器)

时间:2016-04-04 09:11:12

标签: arduino interrupt

我正在尝试将中断附加到信号的上升沿(PWM)。但是,当HIGH导致代码注册另一个中断时,信号有点嘈杂。我显然试图在我的电路中解决这个问题,但这并不是很有效,所以我转到了软件部分。

问题是我如何过滤掉给定频率范围内的中断?我需要应用低通滤波器,以便在信号为HIGH时不会触发中断。我的想法是将中断分离一段时间,或者只是在某个时间范围内发生中断时忽略中断。

我只是不确定如何实现这一目标。

这是我的代码:

unsigned long tsend = 0;
unsigned long techo = 0;
const int SEND = 2;
const int ECHO = 3;
unsigned long telapsed = 0;
unsigned long treal = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("Start");

  pinMode(SEND, INPUT);
  pinMode(ECHO, INPUT);

  attachInterrupt(digitalPinToInterrupt(SEND), time_send, RISING);
  attachInterrupt(digitalPinToInterrupt(ECHO), time_echo, RISING);
}

void loop() {
  telapsed = techo - tsend;
  if (telapsed > 100 && telapsed < 10000000) {
    treal = telapsed;
    Serial.println(treal);
  }
}

void time_send() {
  tsend = micros();
}
void time_echo() {
  techo = micros();

}

下面是有很多噪音的信号(黄色)。当信号为HIGH时,我需要忽略中断。这是PWM Signal

的图像

2 个答案:

答案 0 :(得分:0)

我会尝试以下方法:

#define DEBOUNCE_TIME 100

void time_send() {
  static long last = micros() ;
  if (last-tsend > DEBOUNCE_TIME)
     tsend = last;
}
void time_echo() {
  static long last = micros() ;
  if (last-techo > DEBOUNCE_TIME)
     techo = last;

}

调整DEBOUNCE_TIME直到我得到满意的结果。

答案 1 :(得分:0)

const byte intrpt_pin = 18; 
volatile unsigned int count = 0; 

#define DEBOUNCE_TIME 5000

void isr()
{
  cli();
  delayMicroseconds(DEBOUNCE_TIME);
  sei();

  count++;
}

void setup()
{
  pinMode(intrpt_pin, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(intrpt_pin), isr, FALLING);
}

void loop()
{
}

cli() :通过清除全局中断屏蔽来禁用所有中断。

sei() :通过设置全局中断掩码来启用中断。

因此,基本上,该程序将忽略这两行之间发生的所有中断,即DEBOUNCE_TIME。 检查您的中断弹跳时间,并相应地调整DEBOUNCE_TIME以获得最佳结果。