モータードライバICの中には、入力にPWM信号を与えることで出力電圧を制御できるものがあります。
モータードライバにパルス波形を与えると、それに合わせてモータードライバの出力もオン・オフします。早い周期でスイッチングを繰り返すことで、出力はオンのパルス幅に比例した電圧になります。これより、入力信号のパルスの幅を変えることで出力電圧を制御できるという仕組みです。
さて、モータードライバをPWM制御する場合、ふたつの端子のうち一方にPWM信号を与え、もう一方は論理固定することになると思いますが、いくつかのモータードライバのデータシートを見ても、論理固定する側の信号についての記載がありませんでした。
普通に考えると、一方(IN1)にPWM信号を与え、もう一方(IN2)をLow固定することで、
- [オン] IN1=H, IN2=L → OUT1=H, OUT2=L(回転)
- [オフ] IN1=L, IN2=L → OUT1=Z, OUT2=Z(空転)
の繰り返しになるような気がしますが、例えば東芝の「TB6643KQ」のデータシートには、
PWM制御時は、通常動作とショートブレーキの繰り返しとなります。
と記載されています(オフ時はOUT1=L, OUT2=L)。PWM入力しない側の端子の処理方法についての記載はありません。
今回、モータードライバをモーターの駆動以外の用途で利用したい機会があったため、念のため、上記について調査してみることにしました。
調査したモータードライバは、いずれも秋月電子で販売されている「TB6643KQ(東芝)」「DRV8835(TI)使用ステッピング&DCモータードライバーモジュール」の2種類です。
以下のスケッチをM5Stack Basicに書き込みます。
#include <M5Unified.h>
int val1 = 128;
int val2 = 0;
void pwmOut(int ch1val, int ch2val) {
// PWM出力
ledcWrite(1, ch1val);
ledcWrite(2, ch2val);
// 画面表示
M5.Display.fillScreen(TFT_BLACK);
M5.Display.drawNumber(ch1val, 80, 120, 4);
M5.Display.drawNumber(ch2val, 240, 120, 4);
}
void setup() {
auto cfg = M5.config();
M5.begin(cfg);
//PWM用設定
pinMode(2, OUTPUT);
ledcSetup(1, 100000, 8); // 1ch, 100kHz, 8bit
ledcAttachPin(2, 1); // 1chを2番ピンへ
pinMode(5, OUTPUT);
ledcSetup(2, 100000, 8); // 2ch, 100kHz, 8bit
ledcAttachPin(5, 2); // 2chを5番ピンへ
// 画面表示用設定
M5.Display.setTextColor(TFT_WHITE);
M5.Display.setTextDatum(MC_DATUM);
M5.Display.setTextSize(2);
pwmOut(val1, val2);
}
void loop() {
M5.update();
if(M5.BtnA.wasPressed()) {
val1 = val1 - 128;
if(val1 < 0) val1 = 0;
pwmOut(val1, val2);
}
if(M5.BtnC.wasPressed()) {
val1 = val1 + 128;
if(val1 > 256) val1 = 256;
pwmOut(val1, val2);
}
if(M5.BtnB.wasPressed()) {
if(val2 == 0) val2 = 256;
else val2 = 0;
pwmOut(val1, val2);
}
}
2番ピンと5番ピンからPWM信号を出力します。
Aボタン、Cボタンを押すと2番ピンのPWM出力を「0(L固定)」「128(Duty 50%)」「256(H固定)」に切り替えることができます。
Bボタンを押すと5番ピンの出力が「0(L固定)」「256(H固定)」に切り替わります。
このふたつの信号を、モータードライバの「IN1」「IN2」に接続します。
モータードライバの電源には、安定化電源から10Vを供給します。出力「OUT1」「OUT2」はオープンにし、テスターで両端の電位差を測定します。
「TB6643KQ」に接続した状態はこちらです。
「DRV8835」に接続した状態はこちらです。
テスターで電位差を測定した結果はこちらです。
IN1 | IN2 | 出力の電位差(TB6643KQ) | 出力の電位差(DRV8835) |
---|---|---|---|
0 | 0 | -0.06 | 0.06 |
128 | 0 | 10.24 | 8.50 |
256 | 0 | 9.96 | 9.92 |
0 | 256 | -9.96 | -9.92 |
128 | 256 | -4.83 | -5.06 |
256 | 256 | 0.00 | 0.00 |
どちらのデバイスでも同様の結果になりました。
「IN2」が「256(H固定)」のとき、「IN1」を「128(Duty 50%)」にすると、出力は5V(VDD×1/2)程度の安定した値になりました。
一方、「IN2」を「0(L固定)」にすると、「IN1」が「128(Duty 50%)」のときの出力は、10V近辺の不安定な値になりました。
次に、モータードライバの出力「OUT1」「OUT2」間に1kΩの抵抗をつなぎ、同様に調査しました。
IN1 | IN2 | 出力の電位差(TB6643KQ) | 出力の電位差(DRV8835) |
---|---|---|---|
0 | 0 | 0.00 | 0.00 |
128 | 0 | 4.66 | 4.80 |
256 | 0 | 9.86 | 9.48 |
0 | 256 | -9.86 | -9.48 |
128 | 256 | -4.68 | -4.88 |
256 | 256 | 0.00 | 0.00 |
「IN2」が「0(L固定)」、「IN1」が「128(Duty 50%)」のときの出力は、5V(VDD×1/2)程度で安定しました。
これよりやはり、PWM制御時のモータードライバの動作は、
- 一方の入力にPWM信号を供給、他方をLow固定:回転と空転の繰り返し
- 一方の入力にPWM信号を供給、他方をHigh固定:回転とブレーキの繰り返し
となっているようです。