ArduinoUnoを使用して波形発生器からのパルスをカウントしようとしています。波形ジェネレータは次の設定に設定されています。
- 波形タイプ:パルス
- 周波数:20 Hz(50ms)
- 振幅:3.0 Vpp
- オフセット:0V
- 幅= 5ms
これまでのところ、シリアルモニターに表示されるのは0のみです。
ここにこれは私がこれまでに試したことです:
1)pulseIn()とpulseInLong()の使用->成功しません
2)配線接続の確認->マルチメータを使用して確認し正しく接続されています。
3)オシロスコープを接続して、波形が生成されているかどうかを確認します->下の図に示すように波形が生成されています。
注:波形ジェネレータはオシロスコープの一部です:
私のコードを以下に示します:
volatile int IRQcount; int pin = 2; int pin_irq = 0; //IRQ that matches to pin 2 int result = 0; void setup() { // put your setup code here, to run once: Serial.begin (115200); pinMode(2, INPUT); attachInterrupt(pin_irq, IRQcounter, FALLING); } void IRQcounter() { IRQcount++; } void loop() { // put your main code here, to run repeatedly: cli();//disable interrupts IRQcount = 0; sei();//enable interrupts delay(500); cli();//disable interrupts result = IRQcount; sei();//enable interrupts Serial.print(F("Counted = ")); Serial.println(result); }
コメント
回答
- Peter Bennettや他の人が指摘したように、最初は3Vpp、つまり+ 1.5Vから-1.5vを交互に繰り返すパルスを設定していました。 。 Arduinoのコントローラーの電気的特性によると、1.5Vは「1」として読み取られるとは限りません。少なくとも0.6Vccである必要があります。
irq
ピンはエッジ遷移を認識できず、代わりに常に「0」を読み取ります。また、損傷を避けるために、I / Oピンにも-ve電圧を駆動することは想定されていません。 !! - パルス周波数は20Hzまたは20パルス/秒です。500msの遅延では、0.5秒あたりに発生するパルス数をカウントしているため、
result
値は10である必要があります。これがシリアルモニターに表示される内容です。
回答
From 「スコープ写真、信号の低レベルは-1.5ボルト、高レベルは1.5ボルトです。1.5ボルトはおそらく低すぎる電圧であり、ArduinoによってロジックHighとして認識されません。
また、Arduinoデジタル入力は負電圧によって損傷する可能性があります。ほとんどのデジタルICの入力は受け入れるように設計されていますグラウンドと正の電源電圧の間の入力。
Arduinoが+5ボルトで動作している場合は、信号発生器を5 Vppに設定し、信号をArduino内に保つために+2.5ボルトのオフセットを設定する必要があります。 ” ■入力電圧制限。
ロジックHighとして認識されるには、入力電圧が0.7 Vccまたは3.5ボルトを超えている必要があります。低い電圧はHighとして認識されない場合があるため、割り込みはトリガーされません。
コメント
- 5Vppに設定しましたが、+ 2.5Vのオフセットによりカウント数が変動し、オフセットがないと、一貫したパルスカウントの読み取り、それは期待されていますか?そう思います
- Arduinoで入力レベルを確認してください。低レベルは地面にある(または非常に近い)必要があり、高レベルはArduino 'の正電源に近い必要があります。これは5ボルトだと思います。
回答
ループを通過するたびにIRQcountをリセットします。
コメント
- 'は大丈夫だと思います。カウンタをゼロにし、割り込みを有効にして、遅延してから、遅延の最後に割り込みの数を出力します。
- それは'問題ではありません。
- delay()の単位は何ですか? ' Audrinoをプログラムしていませんが、それはティックですか、それともnsですか?
- @ mjh2007ミリ秒なので、' sは間違いなく十分な長さです。
- Arduino
delay()
の単位はミリ秒です。
pinMode(pin, mode)
を使用する必要がありますか?