記事数だけいたずらに増えていくのがよろしくないが、前回に引き続きプログラムを掲載しておきたい。
これは矩形波駆動させたときのプログラムである。
変数 i についてはA0でAD変換して変数として利用すれば外部入力で速度可変できる。
このプログラムはオープンループになっていて位置検出がないため急激な操作量を入力すると脱調してしまう。
各相(もしくは1相だけ)にシャント抵抗を入れてゼロクロス検出をするなどの工夫が必要である。
const int IN_U = 3;
const int SD_U = 2;
const int IN_V = 5;
const int SD_V = 4;
const int IN_W = 6;
const int SD_W = 8;
volatile int val = LOW; //inputpinの値を格納する代数
int delayTime;
//各ピンの設定
void setup() {
pinMode(IN_U, OUTPUT);
pinMode(IN_V, OUTPUT);
pinMode(IN_W, OUTPUT);
pinMode(SD_U, OUTPUT);
pinMode(SD_V, OUTPUT);
pinMode(SD_W, OUTPUT);
analogWrite(IN_U, 0);
analogWrite(IN_V, 0);
analogWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, HIGH);
}
//初期位置固定
for(int i=1000; i >= 0; i--){
digitalWrite(IN_U, HIGH);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, LOW);
digitalWrite(SD_W, HIGH);
delay(5);
digitalWrite(IN_U, 0);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, LOW);
digitalWrite(SD_W, HIGH);
delay(5);
}
if (millis() < 8000) {
delayTime = 5 - millis() / 2000;
}
void loop() {
//本文
for(int i=4000; i >= 1000; i--){
digitalWrite(IN_U, 255);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, LOW);
digitalWrite(SD_W, HIGH);
delayMicroseconds(i);
digitalWrite(IN_U, 255);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, LOW);
delayMicroseconds(i);
digitalWrite(IN_U, 0);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 255);
digitalWrite(SD_U, LOW);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, HIGH);
delayMicroseconds(i);
digitalWrite(IN_U, 0);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 255);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, LOW);
digitalWrite(SD_W, HIGH);
delayMicroseconds(i);
digitalWrite(IN_U, 0);
digitalWrite(IN_V, 255);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, LOW);
delayMicroseconds(i);
digitalWrite(IN_U, 0);
digitalWrite(IN_V, 255);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, LOW);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, HIGH);
delayMicroseconds(i);
}
for(int i=3000; i >= 0; i--){
digitalWrite(IN_U, 255);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, LOW);
digitalWrite(SD_W, HIGH);
delayMicroseconds(1020);
digitalWrite(IN_U, 255);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, LOW);
delayMicroseconds(1020);
digitalWrite(IN_U, 0);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 255);
digitalWrite(SD_U, LOW);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, HIGH);
delayMicroseconds(1020);
digitalWrite(IN_U, 0);
digitalWrite(IN_V, 0);
digitalWrite(IN_W, 255);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, LOW);
digitalWrite(SD_W, HIGH);
delayMicroseconds(1020);
digitalWrite(IN_U, 0);
digitalWrite(IN_V, 255);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, LOW);
delayMicroseconds(1020);
digitalWrite(IN_U, 0);
digitalWrite(IN_V, 255);
digitalWrite(IN_W, 0);
digitalWrite(SD_U, LOW);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, HIGH);
delayMicroseconds(1020);
}
for(int i=1000; i <= 4000; i++){
analogWrite(IN_U, 250);
analogWrite(IN_V, 0);
analogWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, LOW);
digitalWrite(SD_W, HIGH);
delayMicroseconds(i);
analogWrite(IN_U, 250);
analogWrite(IN_V, 0);
analogWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, LOW);
delayMicroseconds(i);
analogWrite(IN_U, 0);
analogWrite(IN_V, 0);
analogWrite(IN_W, 250);
digitalWrite(SD_U, LOW);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, HIGH);
delayMicroseconds(i);
analogWrite(IN_U, 0);
analogWrite(IN_V, 0);
analogWrite(IN_W, 250);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, LOW);
digitalWrite(SD_W, HIGH);
delayMicroseconds(i);
analogWrite(IN_U, 0);
analogWrite(IN_V, 250);
analogWrite(IN_W, 0);
digitalWrite(SD_U, HIGH);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, LOW);
delayMicroseconds(i);
analogWrite(IN_U, 0);
analogWrite(IN_V, 250);
analogWrite(IN_W, 0);
digitalWrite(SD_U, LOW);
digitalWrite(SD_V, HIGH);
digitalWrite(SD_W, HIGH);
delayMicroseconds(i);
}
}