質問するログイン新規登録
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

2565閲覧

Arduinoにて割り込み機能で連続してパルスを受信し、そのパルス幅を把握する方法

nao0109

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2020/04/27 09:38

0

0

お世話になります。
表題の通りなのですが、
30ms間隔で送信されるパルスのみを受信し,その数をカウントしたいです。
稀に,1ms間隔程度のノイズが発生するので,そのパルスが29~31ms程度に収まっていることを確認してカウントしたいです。

下記のコードを試してみたのですが、millis()が割り込みで正しく動作していないせいか、全く変数(totalPulseAmount)が動きません。

アドバイスを頂戴出来れば幸いです。

宜しくお願い致します。

#define PulsePin 2 unsigned long Time[100] ; unsigned long Timing = 0; unsigned long receivedPulseAmount = 0; void setup() { digitalPinToInterrupt(PulsePin),samplePulse,CHANGE); } void loop(){ while(capturedTiming >=2){ checkSampledPulse(); } } void samplePulse(){ Timing += 1; Time[Timing] = millis(); } void checkSampledPulse(){ if(Timing >= 2){ unsigned long pulseWidth =Time[Timing]-Time[Timing-1]; if(pulseWidth > 29){ if(pulseWidth < 31){ receivedPulseAmount += 1; }} Time[Timing] = 0; Time[Timing-1] = 0; Timing -= 2; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/04/27 12:12

C#は関係ないですね?
thkana

2020/04/27 13:05

質問のコードはコンパイラを通りません。どういうものと考えたらよいのでしょう?
thkana

2020/04/27 13:08

カウントする、ということは30ms毎のパルスが欠損する可能性もある、ということですか? (欠損がないならただ時間を測って30msで割ればいいだけの話ですね)
guest

回答2

0

要点をまとめると、1ms程度のノイズと避けて、30ms程度のパルス数をカウントしたい、という事ですよね?

やり方は色々あるでしょう。
そのスケッチで言えば、ある点は駄目で、ある点はちょっと無駄が多いです。

・CHANGEじゃなくて、片側で充分
・一瞬で終わる処理を割り込みとloop関数で分ける必要も無い
・下記書式
× digitalPinToInterrupt(PulsePin),samplePulse,CHANGE);
○ attachInterrupt(0, samplePulse, CHANGE);//0とはint0ピン=D2ピンの事
もしくは
○ attachInterrupt(digitalPinToInterrupt(PulsePin), samplePulse, CHANGE);
・capturedTimingとは?
・割り込み内で操作する関数にはvolatileを付ける
等々。
つまり、全体的な構成は良いとしても、1つずつ気を付けなければならない点を押さえていないように思います。

ぶっちゃけ、ハードで、ローパスフィルターでも付けて、単にカウント++させた方が良いかも。

あるいは、もっと簡単に、↓程度で良いと思うよ

byte pulse_pin=2;//どこでも

byte pulse_state;//8個分保存
uint32_t count=0;

void setup(){}

void loop(){
pulse_state<<=1;//シフトさせてLSBを空ける
pulse_state+=digitalRead(pulse_pin);//最新を取得
if((pulse_state&7)==5) pulse_state|=7;//ノイス消去
else if((pulse_state&7)==2)pulse_state&=~7;
if((pulse_state==0xF)count++;//0b00001111となった時だけ採用
delay(1);
}

投稿2020/04/28 07:49

nac_tnk

総合スコア512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

30msごとであれば、1ms程度のタイマ割り込みを生成してサンプリングし、十ms程度のチャタリング除去を行ってパルス数、パルス幅計測を行えばいいです

#ちと題意を勘違いしたので書き直し

投稿2020/04/27 09:46

編集2020/04/27 09:51
y_waiwai

総合スコア88180

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問