今回はエンコーダ波形の測定結果について投稿します。
12VDCモータ動作確認
データシートに書かれた配線に従って動作を確認
直流安定化電源を用いて赤に+V、黒に-Vを接続
回路作成
回路作成時の注意(オープンコレクタについて)
配線をして、さあ測定しようとしたところホールセンサーの反応が全くない…(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++;
}
測定
測定は「Analog Devices」の「ADALM2000」を使用しました。
https://akizukidenshi.com/catalog/g/gM-17043/
波形から、立ち上がり後の電圧は5V程度、立ち下がり後の電圧は0Vであること。
(エンコーダの制御電源にはArduinoの5V出力pinを使用しています。)
立ち上がりの順番について、正転の時は紫→オレンジ、逆転の時はオレンジ→紫の順番になっていることが確認できました。
現在できているのがここまでです。以下の課題を解決出来たらまた投稿しようと思います。(1/14(土)を目途に解決予定。)
- 正転 or 逆転を検出
- 回転数のカウントを初期0とした際の正転を+、逆転を-として主軸の回転角を出す
→ヒント:3パルス1回転(センサ1つ)とギア比を考えること