ArduinoのボードとしてはESP32搭載ボードを使用してみることに。これならPWMの周波数も高くできるし。Arduino UNOでも分周比を変えれば周波数を高められるんだけどちょうどほしいところができなさそう。BTS7960が25kHzまでだったので、20kHzぐらいで使いたいし。
とりあえずシリアルコンソールからコマンドを打ってPWMのDutyを変更できるようにしてみた。ESP32でPWMを使う場合はanalogWriteではなくてledcWriteを使うんだけど、これだとベース周波数も変更できるし、解像度も8ビット以外が使えるので便利。
周波数は20kHz、解像度は10bit(0~1023)にしてみた。
//ピンアサイン
#define EN 19
#define LPWM 22
#define RPWM 23
void setup() {
//PWMタイマ設定
ledcSetup(0, 20000, 10); //ch0,20kHz,10bit
ledcSetup(1, 20000, 10); //ch1,20kHz,10bit
//PWMタイマに出力PIN関連付け
ledcAttachPin(LPWM, 0);
ledcAttachPin(RPWM, 1);
//ENピン初期化
pinMode(EN, OUTPUT);
//Serial初期化
Serial.begin(115200);
}
void loop() {
if (Serial.available() > 0) { // check serial
char in = Serial.read();
if (in == 'k') {
digitalWrite(EN, LOW);
Serial.println("Stop Motor");
}else if(in == 'p'){
int input = Serial.parseInt();
Serial.println(input);
Serial.println("PWM control");
setMotor(input);
}
}
}
void setMotor(int pwm) {
if (pwm == 0) { //ブレーキ
digitalWrite(EN, HIGH);
ledcWrite(0, 1023);
ledcWrite(1, 1023);
} else if (pwm > 0 && pwm <= 1023) {
digitalWrite(EN, HIGH);
ledcWrite(0, pwm);
ledcWrite(1, 0);
} else if (pwm < 0 && pwm >= -1023) {
digitalWrite(EN, HIGH);
ledcWrite(0, 0);
ledcWrite(1, abs(pwm));
}
}
ESP32とは19にL_ENとR_ENをどっちも接続し、22にLPWM、23にRPWM、VCCに3.3V、GNDにGNDを繋ぐ。今回はまだ電流フィードバックを試せる状態にしていないのでISはどっちも繋がなくてオッケー。(ISの抵抗変えないと危ないし、ローパスフィルタとか入れないといけないかも。)
サンプルプログラムを書き込んだらシリアルコンソールからbaudrate 115200で
p512とかp-512って打つとモータが回るはず。kを送信するとスタンバイモードになって、p0とかにすればブレーキが掛かるはず。ブレーキはオン抵抗が小さいハイサイドにしてみた。
ESP32は何も考えなくてもPWMの周波数をいい感じに設定できるから便利だなぁ
ただしちょっとADが使いにくそうな感じがする。バッテリモニタとかにならいいけど、下の方と上の方の精度が悪そう。
まぁ何にせよフィードバックなしでは簡単にモータが回せるのでBlynkとかと併用すればWiFiとかBluetoothのラジコンが簡単に作れちゃうな。
0 件のコメント:
コメントを投稿