C Arduino在50Hz时未检测到方波信号的上升沿
我想检测方波信号的所有上升沿,并通过串行监视器输出它们。我使用的是Arduino UNO,它应该使用中断引脚检测边缘。信号来自信号发生器(信号可调(50Hz为宜)。我在下面编写了此代码,但它不起作用,因为如果我设置频率并启动代码,例如在f=1Hz时,会触发20次中断 有人能告诉我,我应该如何以及使用何种方法来实现Arduino的这种操作吗 提前谢谢C Arduino在50Hz时未检测到方波信号的上升沿,c,arduino,signals,interrupt,edge-detection,C,Arduino,Signals,Interrupt,Edge Detection,我想检测方波信号的所有上升沿,并通过串行监视器输出它们。我使用的是Arduino UNO,它应该使用中断引脚检测边缘。信号来自信号发生器(信号可调(50Hz为宜)。我在下面编写了此代码,但它不起作用,因为如果我设置频率并启动代码,例如在f=1Hz时,会触发20次中断 有人能告诉我,我应该如何以及使用何种方法来实现Arduino的这种操作吗 提前谢谢 volatile int counter = 0; const int interruptPin = 2; voi
volatile int counter = 0;
const int interruptPin = 2;
void setup() {
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(interruptPin), interrupt_call, CHANGE);
}
void interrupt_call() {
counter++;
}
void loop() {
if(counter){
Serial.println(counter);
counter=0;
}else{
Serial.println(counter);
}
}
感谢您的快速回复。我的意思是,如果我将信号发生器的频率设置为1Hz,然后启动代码,中断的上升沿会在每个周期内检测到几次,但实际上中断可能在每个时间周期内只触发一次,并在Serielen监视器中输出。我已将输出作为图像上传。我将是v我非常感激一个提示或想法
如果要检测上升沿,请更改以下行:
attachInterrupt(digitalPinToInterrupt(interruptPin), interrupt_call, CHANGE);
致:
计数器变量为零时不要打印,因此从循环
函数中删除以下行:
}else{
Serial.println(counter);
您的中断引脚可能是浮动的。您是否将其配置为输入引脚?在设置
函数中,在包含附件中断()的行之前添加以下行:
现在,您应该看到在循环
函数期间发生的上升沿的数量。
将其设置为高值(例如,10秒)看看你的1Hz方波是否能得到10。如果它不起作用,也在这里发布主功能/完整代码。谢谢你的帮助!我已经纠正了我所有的错误。不幸的是,现在同样的错误被输出了。我在这里以图像的形式发布了输出。这是什么原因?中断发生了吗?
易失性整数计数器=0;
常数int中断管脚=3
void setup() {
Serial.begin(9600);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), interrupt_call,
RISING);
}
void interrupt_call() {
counter++;
}
void loop() {
if(counter){
Serial.println(counter);
counter=0;
}
}
我认为调用循环
函数的代码部分丢失了,但我刚刚意识到,对于典型的arduino代码,延迟必须插入循环
函数本身
因此,您可以通过将delay(1000)
添加到loop
函数中来添加它,使其成为:
void loop()
{
if (counter) {
Serial.println(counter);
counter=0;
}
delay(1000);
}
在本例中,循环的周期为1000
ms。因此,您应该看到现在一秒钟内出现的上升沿(如果有)的数量,而不是每次都打印“1”
请注意,您可以通过编辑问题而不是添加另一个答案来提供有关问题的更多信息。您的循环函数以什么频率执行?我假设循环比通过UART发送计数器更快。什么是“它不工作”是什么意思?它输出什么值,什么时候?我不确定你说的“但它不工作,因为如果我设置频率并启动代码,例如在f=1Hz时,会触发20个中断!”是什么意思。我本以为你是在50hz时启动代码的。总之,一个提示就是串行的。println()可能要花很长时间才能完成约200毫秒,所以这是一件令人厌倦的事情。
void setup() {
Serial.begin(9600);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), interrupt_call,
RISING);
}
void interrupt_call() {
counter++;
}
void loop() {
if(counter){
Serial.println(counter);
counter=0;
}
}
void loop()
{
if (counter) {
Serial.println(counter);
counter=0;
}
delay(1000);
}