我正在尝试将中断附加到信号的上升沿(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的图像
发布于 2016-04-04 20:32:27
我会尝试以下几点:
#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,直到得到满意的结果。
发布于 2019-09-18 03:51:42
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以获得最佳结果。
https://stackoverflow.com/questions/36398589
复制相似问题