APDahlen Applications Engineer
Hブリッジとは何でしょうか?
Hブリッジは、4つの半導体スイッチを備えた回路です。最も単純な形では、Hブリッジは4つのスイッチで構成されます。この技術記事では、モータコントローラモジュールとして知られるHブリッジシリーズのモジュールのサブセットに焦点を当てます。これは、図1に示すように、小型ブラシ付きDCモータを駆動するための一般的な方式です。比較的簡単なマイクロコントローラのコードで、モータの回転方向と回転速度を制御できます。
この技術記事では、MOSFETベースのHブリッジを特長とするMDD3Aデュアルチャネルモータドライバを紹介します。これには、FreeRTOS環境で動作するArduino PORTENTA Pro C33用のサンプルコードが含まれています。
図1: Seeed MDD3Aモータドライブ、Polilu 4754モータ、ブレイクアウト基板上のArduino C33、およびDigilent Analog Discoveryの写真
技術的なヒント: MDD3Aは5V DC電圧レギュレータを搭載し、200mAの容量でマイクロコントローラ回路に有用な電源を提供します。これはオプションの接続であり、特に3.3V DCデバイスとの接続では注意して使用する必要があります。MDD3Aのグランドは必ず接続する必要があります。この共有接続は、マイクロコントローラのロジック出力とモータドライバの入力間の共通電位基準を提供するために使用されます。
パルス幅変調とは何でしょうか?
一般的なモータドライブモジュールは、パルス幅変調(PWM:Pulse Width Modulation)入力に対応しています。ほとんどのアプリケーションでは、モータの回転速度はPWMのデューティサイクルにほぼ比例します。PWMの使用方法については、多くの記事が書かれています。例えば、Arduino analogWrite( )関数についてはすでにご存知かもしれません。おそらくそれは、ハードウェアとコードを使ってLEDを調光するPWMの入門書として読まれたのではないでしょうか。
この記事では、C33の強化されたPWM機能を使用します。まだこのPWM機能を十分にご理解されていない場合は、Arduino Nano Every PWMの記事とArduino C33 PWMの記事をご覧ください。どちらの記事も、それぞれのマイクロコントローラのPWMの性能を向上させる方法を示しています。この記事の後半では、Arduino PWMのAPI(Application Programming Interface)に精通していることを前提にしていますので、C33の記事をじっくりお読みください。
Hブリッジモータコントローラとマイクロコントローラは物理的にどのように接続されるのでしょうか?
- direction plus PWM
- dual PWM
モータの回転方向と回転速度の両方がマイクロコントローラの直接制御下にあるため、結果はどちらのインターフェースタイプでも同じです。これらの技術は、ハードウェアのトレードオフにおいて異なります。direction plus PWMは、マイクロコントローラのリソースを1つのデジタルI/O(入力/出力)ピンとPWMピンに最小化しますが、モータコントローラに追加の制約が必要です。一方、dual PWMでは、マイクロコントローラで2つのPWMピンを必要としますが、モータコントローラは簡素化されます。dual PWMの出力ドライブは、常に1つだけがアクティブであることに注意してください。「未使用」のPWMは通常デューティサイクルがゼロに設定されます。具体的なデバイス構成については、メーカーのデータシートを参照してください。
一例として、 Cytron (Seeed) MD13S は、direction plus PWMを搭載しています。この記事で紹介している小型のMDD3Aは、dual PWMインターフェースを備えています。
PWMベースのHブリッジモータコントローラには、どのようなマイクロコントローラ用ソフトウェアが使用されているでしょうか?
最初に述べたように、私たちはArduinoを使用していますが、伝統的なソフトウェアの道からは外れています。analogWrite()関数を使うのではなく、Arduino IDEの奥深くにあるクラスベースのAPIを使うことで、PORTENTA Pro C33のパワーを活用しています。
FreeRTOSタスクを以下に示します。コードの最後では、pulse_percメソッドに渡される浮動小数点パラメータを使用して、個々のPWMを設定できることを示しています。コードの中間部では、浮動小数点変数DutyCycleによって決定されることにより、モータを時計方向のフル速度から反時計方向のフル速度まで滑らかに変化させることができます。
このコードは、この記事で紹介されている手法に忠実に従っています。具体的には、以下のAPIを活用しています。C:\Users\your_name\AppData\Local\Arduino15\packages\arduino\hardware\renesas_portenta\1.1.0
少しの変更で、direction plus PWMコントローラが使えるようになることに注目してください。
#include "TaskHeartbeat.h"
static uint32_t state = 1;
static float DutyCycle = 0;
void heartbeat_thread_func(void *pvParameters) {
/* setup() */
pinMode(HEARTBEAT_PIN, OUTPUT); // Defined in "TaskHeartbeat.h"
pinMode(PWM_PIN_1A, OUTPUT);
pinMode(PWM_PIN_1B, OUTPUT);
PwmOut pwm_1A(PWM_PIN_1A), pwm_1B(PWM_PIN_1B); // Instantiate two PWM objects
pwm_1A.begin();
pwm_1B.begin();
pwm_1A.period_us(PWM_PERIOD_us); // Set for a PWM frequency of 10 kHz
pwm_1B.period_us(PWM_PERIOD_us);
pwm_1A.pulse_perc(0);
pwm_1B.pulse_perc(0);
/* loop() */
for (;;) {
digitalWrite(HEARTBEAT_PIN, HIGH);
vTaskDelay(1);
digitalWrite(HEARTBEAT_PIN, LOW);
vTaskDelay(9);
if (state) { // Smooth transition from zero, to full CW, to zero, to full CW, to zero, repeat forever
DutyCycle += 0.025;
if (DutyCycle > 100.0) {
DutyCycle = 100.0;
state = 0;
}
} else {
DutyCycle -= 0.025;
if (DutyCycle < -100) {
DutyCycle = -100;
state = 1;
}
}
if (DutyCycle > 0) { // Bidirectional motor control with Duty cycle bounded at +/- 100.0 %
pwm_1A.pulse_perc(fabs(DutyCycle));
pwm_1B.pulse_perc(0);
} else {
pwm_1A.pulse_perc(0);
pwm_1B.pulse_perc(fabs(DutyCycle));
}
}
}
技術的なヒント: コードはArduino C33を10kHzで動作するように設定します。スイッチング周波数は、モータが低速で動作しているときに聞こえる程度です。PWM周波数をMDD3Aの最大の20kHzにシフトするのが望ましいかもしれません。そうすればモータのうなりがなくなります。しかし、高周波のPWMは望ましくない電磁干渉(EMI)を引き起こす可能性があります。PWMの信号は PWM周波数の高調波で発生するため、AMラジオを使用すると容易に観測できます。例えば、20kHzのPWMの75次高調波は、1.5MHzに存在します。通常、このような高次高調波については心配しません。しかし、大電流モータのリード線は長く、シールドされていません。近くに置かれたラジオによって、望ましくない干渉が明らかになるかもしれません。フーリエ理論を見直してください。
おわりに
Hブリッジベースのモータコントロールモジュールの制御は比較的簡単です。課題は、所望のPWM周波数に対してPWMのデューティサイクルを設定することです。個人的には、PWMをパーセンテージ(±100)で設定できるArduino APIソリューションが気に入っています。この単純化により、コーディングが簡単になります。しかし、これはCPUのオーバーヘッドを犠牲にしています。あまり軽率に考えるべきではありませんが、強力なC33はこれを学術的な議論にする傾向があります。
ご健闘をお祈りします。
APDahlen
関連するArduino教育コンテンツについては、こちらのリンクを参照してください。
著者について
Aaron Dahlen 氏、LCDR USCG(退役)は、DigiKeyでアプリケーションエンジニアを務めています。彼は、技術者およびエンジニアとしての27年間の軍役を通じて構築されたユニークなエレクトロニクスおよびオートメーションのベースを持っており、これは12年間教壇に立ったことよってさらに強化されました(経験と知識の融合)。ミネソタ州立大学Mankato校でMSEEの学位を取得したDahlen氏は、ABET認定EEプログラムで教鞭をとり、EETプログラムのプログラムコーディネーターを務め、軍の電子技術者にコンポーネントレベルの修理を教えてきました。彼はミネソタ州北部の自宅に戻り、このような記事のリサーチや執筆を楽しんでいます。LinkedIn | Aaron Dahlen - Application Engineer - DigiKey