8/01/2011

PWM制御あれこれ







前回の記事では,Cortex-M0ボードの演算速度を調べるためにPWM出力端子の波形をいろいろとみていたわけですが,今回はその出力をモータドライバに通したときに気になる特性をいくつか確認してみました.(従って,主役はマイコンではなくてモータドライバの方です.)

まずはライブラリとしてCQ.zipで配布のpwm.cをベースにしますので,搬送波の生成に32ビットタイマTMR32B1,デューティー比の設定にマッチレジスタMR0, MR1を使うことになります.モータドライバとしては,以前紹介したTB6612FNGを使います.

【TB6612FNGのスイッチング性能】

TB6612FNGのデータシートをみますと,スイッチングの周波数は最大100kHzとあります.すなわち10μsecくらいの間隔のスイッチング性能は保証されていることになりますが,実際のところはどの程度なのでしょうか.

pwm.cでは32ビットタイマTMR32B1が下記のように設定されています.
#define MAX_PWM 999

[...]

    LPC_TMR32B1->PR  = 0; 
    LPC_TMR32B1->MR2 = MAX_PWM;
    LPC_TMR32B1->MCR = (0x3 << 6); // MR2で割込み&リセット
TMR32B1はシステムクロックの48MHz(すなわち20.83nsec/クロック)をプリスケーラで分周してカウントします.ここではプリスケーラの設定が0(すなわち1分周)ですので,TMR32B1のカウント周期もそのまま20.83nsecになります.そして,レジスタMR2との一致で割込みおよびリセットをするように設定されていますので,カウント値が MR2に設定した値MAX_PWMに達するまでの時間がPWMの搬送波周期です.1カウント20.83nsecで0〜999までカウント,すなわち 20.83μsecというわけです.さらに,設定したデューティー比によってこの20.83μsecの時間がON区間とOFF区間に2分されます.

モータドライバの最小スイッチング周期が10μsecということですから,スペック的には限界ぎりぎりでOKということになるでしょう.実際,モータドライバの入力(黄色)出力(水色)を比較してみると次のようになります.
横軸は時間で一目盛りが5μsecで,2本の垂直カーソルで挟まれた区間が搬送波一周期分の20.8μsecです.出力はぴったり入力に追従できていますので,まったく問題なさそうです.

調子に乗ってカタログスペックを超え,PWMの搬送波周期をもっと短くしてみます.
 図の左上から順に約10μsec(時間目盛り2.5μsec/div で表示), 約4μsec (1μsec/div), 約1μsec (250nsec/div) と設定した場合です.時間目盛りを細かくしていくと,スイッチングに250nsec程度の遅れがあることが見えてきます.実用的なのはせいぜい10μsec周期くらいまででしょうか.しかしまあ,思ったよりもずっと応答が俊敏であることがわかりました.

【マイコンとモータの電源系統の話】
基本的なことですが,マイコンとモータドライバおよびモータは下図のように接続します.

Vccはマイコンやモータなどの弱電回路用の電源,Vmはモータ駆動用の電源です(GNDは共通).つまり2系統の電源が必要になります.それで,よく学生などに「VccとVmは一緒じゃダメなんですか?」ということを聞かれるので,なぜダメなのかを少し見てみましょう.

左はVccとVmを別にした場合,右は共通にした場合です.いずれも黄色はVcc,水色はモータ端子の片方(OUT1)をはかったものです.Vccを供給しているバッテリの電圧は4.1Vほどで,モータはマブチの130系という小さなものです.左図ではそのまま一定になっているのに対し,右図ではかなりのノイズが乗っているうえ,モータの動作に合わせて480mVほどの電圧降下を起こしてしまっています.

影響の度合いはバッテリーの駆動能力と負荷の大きさにもよりますが,やはりVccとVmは分けておくのが原則です.