つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション21 ~ パルスカウンタ

1. 外部割込みを用いたパルスカウンタ

 今回は以前紹介した外部割込み機能を利用したパルスカウンタについて紹介したい。以前紹介した外部割込みについてはこちら。

atatat.hatenablog.com

2. 簡易なパルスカウンタ

 Tinkercad上ではArduinoとファンクションジェネレータ(関数ジェネレータ)を選択し、割り込み番号は0を利用するため、ファンクションジェネレータの出力をArduinoの2ピンに接続する。

パルスカウンタ
パルスカウンタ

スケッチについては、 Arduinoで簡易パルスカウンタ - how to code somethingのものを使用した。

int pin = 2;
volatile unsigned int pulse;

void setup()
{
  Serial.begin(9600);
  pinMode(pin, INPUT);
  attachInterrupt(0, count_pulse, RISING);
}

void loop()
{
  pulse = 0;
  interrupts();
  delay(1000);
  noInterrupts();

  Serial.print("Pulses per second: ");
  Serial.println(pulse);
}

void count_pulse()
{
  pulse++;
}

矩形波を発生させるファンクションジェネレータの出力を外部割込みとする。矩形波の立ち上がりを検出するたびに割り込みを発生させて、1秒あたりの割り込みの発生回数をカウントする。 外部割込みの設定はattachInterrupt(0,count_pulse,RISING),呼び出す関数count_pulse()では変数pulseをインクリメントメすることで、立ち上がりを検出するたびにpulseがカウントされていく。 loop関数内ではinterrupts();とすることで割り込みが有効になり、delay(1000);で1秒経過してからnoInterrupts();として割り込みを無効にする。その後、pulseをシリアルモニタに表示する。

 ファンクションジェネレータの出力設定を矩形波, 周波数1000Hz(1kHz),振幅5V, DCオフセット2.5V としてシミュレーションを実行すると1秒当たりのパルス数は1001と表示される。タイマーの精度(delay(1000))や立ち上がり検出のタイミングなどが誤差の原因と思われるが、そこそこ使えると思う。ちなみに10kHzのときはpulse数は10002, 100kHzは検出できなかった。

3. モーターのエンコーダー出力パルスカウント

 以前紹介したモータードライバによる制御の中のエンコーダー付きDCモータと今回のパルスカウンタを応用して、エンコーダーから出力されるパルスをカウントする方法を紹介する。

atatat.hatenablog.com

接続については、上記の記事と同じでスケッチを少し変更する。

エンコーダー付きDCモーターへの接続
エンコーダ付きDCモーターへの接続

volatile unsigned int pulse;

void setup()
{
  Serial.begin(9600);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(2, INPUT_PULLUP);
  motor( HIGH,  LOW, 2000);
  attachInterrupt(0, count_pulse, RISING);
}

void loop()
{
  pulse=0;  
  interrupts();
  delay(1000);
  noInterrupts();
  
  Serial.print("Pulses per second: ");
  Serial.println(pulse);
}

void motor(int a1, int a2, int d){
  digitalWrite(5, a1);
  digitalWrite(6, a2);
  delay(d);
}

void count_pulse()
{
  pulse++;
}

今回はモーターを定常駆動するため、loop関数内ではなく最初のsetup関数内でmotor( HIGH, LOW, 2000);と記述する。あとは簡易なパルスカウンタと同様のスケッチでよい。 電源の設定を10Vとしてシミュレーションを開始すると1秒当たりのパルス数は1116-1118となり、モーターの回転数は294rpmと表示される。これは1秒当たり約5回転するので、1回転当たりのパルス数は228となる。 電源7Vでシミュレーションを実行するとパルス数は782が得られた。よって782/228·60=206rpmとなるが、シミュレーション時にモーターに表示されている回転数と一致する。 以前の記事で回転速度に応じてパルス幅が変化することを示したが、今回はパルス数をカウントすることでモーターの回転数や回転速度を割り出すことができる。

4. まとめ

 今回はArduinoの外部割込みを利用したパルスカウンタと、それを応用してエンコーダーの出力パルスをカウントすることで、モーターの回転数や回転速度を割り出せることを紹介した。