我正在尝试将中断附加到信号的上升沿(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
答案 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以获得最佳结果。