2

私はこれが少しおかしく聞こえることを知っています:)。しかし、私は可能性を排除しようとしています:

Arduino Unoでは、HIGH でトリガーされる割り込みを、揮発性の定義済みlongカウンターのみをインクリメントするルーチンにアタッチしました。このカウンターは LCD 画面に表示されます。TTL レベルで周波数 1 Hz のパルス発生器を接続すると、カウンターは 1 秒あたり約 1 増加すると予想されます。しかし、そうではありません。

周波数が 1 Hz (デューティ サイクル 50%) であるため、カウンターがインクリメントされると IRS が終了する (そして割り込みフラグがクリアされる) 可能性がありますが、INT0レベルがまだ HIGH であるため、ISR が再度呼び出されるのでしょうか? 1 Hz の 50% デューティでは、HIGH は 500 ms の間、16 mHz にとどまります...

4

2 に答える 2

1

2 つの電気的な理由で、割り込みが必要に応じて機能しない理由を説明できます。

1- パルス発生器の出力と MCU の入力にインピーダンスの不一致がある可能性があり、波形のエッジでリンギングが発生する可能性があります。たとえば、関数発生器に高周波数を生成できる 50 オームの出力がある場合、低周波数で Arduino のような高インピーダンス入力を駆動すると問題が発生する可能性があります。

「パルス発生器」という名前は、これが鋭いエッジを持つ非常に短いパルスを作成することを目的とした 50 オーム出力のデバイスであると思わせます。このような場合、送信先 (負荷) に終端抵抗を追加して、送信元 (パルス発生器) のインピーダンスを一致させます。50 Ω の出力の場合、47 Ω で十分です。出力が 100 kΩ の場合、マッチング抵抗を Arduino に配置します。

2- 逆に、発生器の波形エッジが非常に遅いため、電圧が TTL 0 から 1 への遷移を複数回通過する場合があります。信号入力にノイズがある場合、遅いエッジが複数のトリガーを引き起こしている可能性があります。たとえば、電源と接地の問題から 60 Hz のリップルを拾っている場合、方形波のエッジは思ったほど正方形にはなりません。

このような場合、ヒステリシスが解決策になります。コードでデグリッチ (デバウンス) する方法はたくさんあります。すべての問題に正解はありません。簡単な例としては、エッジが受け入れられるために、入力が 2 回連続して High を読み取る必要がある ISR があります。

于 2013-05-09T05:55:15.767 に答える