[電子工作No.2] DCモータ制御その3(エンコーダ波形測定)

January 02, 2023
Author(著者):
beaver
DCモータ
エンコーダ
オープンコレクタ

今回はエンコーダ波形の測定結果について投稿します。

12VDCモータ動作確認

データシートに書かれた配線に従って動作を確認
直流安定化電源を用いて赤に+V、黒に-Vを接続

6Vでも十分回転してる…
ということで、波形の測定は単3電池×4本(1.5V×4=6.0V)で行います。

回路作成

回路作成時の注意(オープンコレクタについて)

配線をして、さあ測定しようとしたところホールセンサーの反応が全くない…(0Vかノイズしか測定できない…)
予備の12VDCモータを使って測定したりしても同じ反応…
データシートを読み返してみたら、気になる記載が!

コレクタ側の抵抗(1kΩ抵抗)が点線で囲まれてる?
この回路、コレクタ側が何も接続されていない状態でオープンコレクタ出力と呼ばれる出力方式の1つだそうです。
実際には点線部分は存在せず、使用者が用意する必要があるみたいです。

1KΩ抵抗を追加した回路写真が下記のものです。(紫の点線で囲まれた部分がオープンコレクタ
に対応するために追加した回路です)

コード作成

エンコーダのセンサーA、センサーBの立ち上がりと立下りの回数(応答回数)を、それぞれ割り込み関数attachInterrupt()でカウントします。

#include <Arduino_BuiltIn.h>

#define PIN_IN1  7
#define PIN_IN2  8
#define PIN_VREF 9 // PWM

long int EncoderA = 0;
long int EncoderB = 0;

float val = 0;
int speed = 0;
 
void setup(){
  pinMode(PIN_IN1,OUTPUT); 
  pinMode(PIN_IN2,OUTPUT); 
  Serial.begin(9600);
  attachInterrupt(0, encoderASense, CHANGE);
  attachInterrupt(1, encoderBSense, CHANGE);
}
 
void loop(){
      
      val=analogRead(A1);
      val=val/1023*255;
      speed=round(val);
      delay(100);
  Serial.print("A:");
  Serial.print(EncoderA);
  Serial.print("\tB:");
  Serial.print(EncoderB);
  Serial.print("\tspeed:");
      Serial.println(speed);
    // speedの値によってモーターの回転速度設定する
    analogWrite(PIN_VREF,speed); 
 
    // 回転
    digitalWrite(PIN_IN1,HIGH);
    digitalWrite(PIN_IN2,LOW);
    delay(10);

                
}

void encoderASense() {
  EncoderA++;
}

void encoderBSense() {
  EncoderB++;
}
speedが上がるにつれて、ホールセンサAの応答回数の傾きが大きくなっていることを確認

測定

測定は「Analog Devices」の「ADALM2000」を使用しました。
https://akizukidenshi.com/catalog/g/gM-17043/

正転波形と設定画面
正転と逆転波形

波形から、立ち上がり後の電圧は5V程度、立ち下がり後の電圧は0Vであること。
(エンコーダの制御電源にはArduinoの5V出力pinを使用しています。)
立ち上がりの順番について、正転の時は紫→オレンジ、逆転の時はオレンジ→紫の順番になっていることが確認できました。

現在できているのがここまでです。以下の課題を解決出来たらまた投稿しようと思います。(1/14(土)を目途に解決予定。)

  • 正転 or 逆転を検出
  • 回転数のカウントを初期0とした際の正転を+、逆転を-として主軸の回転角を出す
    →ヒント:3パルス1回転(センサ1つ)とギア比を考えること

copyright © 2024 beavers-hive.com