質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

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

Q&A

解決済

2回答

2368閲覧

Arduino due でのpulseInが正確に計測できない

m-miyake

総合スコア5

Arduino

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

0グッド

0クリップ

投稿2020/02/25 08:07

前提・実現したいこと

パルス幅計測のプログラムを作成しております。
まずArduino Uno にてパルス幅計測 pulseIn命令を使用して
正確に計測できることを確認しました。10Hzから1.5KHz

Arduino Dueにおいて、pulseIn命令を正しく動作させるための
なにか設定などありますか?
もしくは、パルス幅計測のためのなんらかの方法はありますか?

発生している問題・エラーメッセージ

Arduino Unoで作成したプログラムをそのままArduino dueで使用した場合、
計測結果が正しくありません。
計測結果は周波数に換算していますが、
Arduino Unoで50Hzと出た結果が、Arduino dueでは39Hzから43Hzと
なり、High幅でもLow幅でも同じような結果になります。

該当のソースコード

widthHigh = pulseIn(plsHpin, HIGH);
widthLow = pulseIn(plsLpin, LOW);
widthPulse = widthHigh + widthLow;
rpmNow = 1000000/widthTotal;

試したこと

単なるpulseIn命令のみのみのため、入力ポートを変えてみたものの
同じ結果になります。

補足情報(FW/ツールのバージョンなど)

Arduino IDE 1.8.10
ボード Arduino Due(Programming Port)

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

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

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

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

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

coco_bauer

2020/02/26 03:44

Highのパルス幅はplsHpinの信号で測り、LOWのパルス幅はplsLpinの信号で測って、それを足し合わせてパルスの1周期を求めていますが、plsHpinとplsLpinに加えられている信号は何なのですか? 普通は測定したい信号は一つで、その信号のHighのパルス幅とLowのパルス幅を使って周波数を測定します。二つの別々の信号の一方からHighのパルス幅、もう一方からLowのパルス幅を測定して、それを混用する意味が判りません。
m-miyake

2020/02/26 04:10

ご質問の件ですが、同じ信号を2つのピンに入力し、High幅とLow幅を計測しています。ひとつのピン入力で両方を計測してもよいのですが、短時間に計測したいので、2つのピンを使用しています。
coco_bauer

2020/02/26 04:36

そういう事情は質問に書いて頂くと有難いです。 ソースコードからは別のピンが使われているとしか判りませんから。
guest

回答2

0

自己解決

みなさん、アドバイスありがとうございます。
Arduinoサイトで質問すると、DUEボードではpulseIn命令は対応していないとのことで、
以下に書換し動作確認できました。

volatile unsigned long duration=0; // 割込みで処理されたパルス幅
volatile unsigned long prevMicros=0; // 割込みで処理している基準時間
float freq; // 周波数 1/duration

void setup()
{
Serial.begin(9600);
attachInterrupt(2, periodIrq, RISING);
}

void loop()
{
freq = 1000000/duration;
Serial.println(freq);
delay(200);
}

void periodIrq() // interrupt handler
{
unsigned long currentMicros = micros();
duration = currentMicros - prevMicros;
prevMicros = currentMicros;
}

投稿2020/02/27 00:42

m-miyake

総合スコア5

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

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

0

そもそも変数の取り扱いが間違っている可能性が。

c++

1widthPulse = widthHigh + widthLow; 2rpmNow = 1000000/widthTotal;

となっていますが

c++

1widthPulse = widthHigh + widthLow; 2rpmNow = 1000000/widthPulse;

なのでは?

投稿2020/02/26 06:54

MasahikoHirata

総合スコア3747

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

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

m-miyake

2020/02/26 07:22

回答いただきありがとうございます。 先にご指摘いただいた入力信号のピン割り当てを含め、ソースコードから 抜き出しした箇所、説明が不十分でした。 質問の意図は、Arduino UNOで動くプログラムがArduino DUEでは動かないということで ソースコードを単純化すると以下の内容になります。 DUEではpulseInのコマンドが誤動作するのですが、なにかご存じのかたがいらっしゃいましたら ご教示のほどお願いいたします。 int pin = 2; unsigned long duration; void setup() { Serial.begin(9600); pinMode(pin, INPUT); } void loop() { duration = pulseIn(pin, HIGH); Serial.println(duration); delay(1); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問