ZyboでDCモータをPWM制御してみる…前に
前回まではZyboでとりあえずDCモータを回してみたが、もう少し詳細な制御をやってみたいのでPWM制御してみたいと思う…のだが、PWM制御するにしても周波数とかDuty比とか実装前に色々と下調べ&考えることがある。
今回はお勉強回ということで、ZyboでDigilentのDCモータを回すにあたってPWM制御の周波数とDuty比をどのように設定するか考えてみた。
開発環境
Windows 10
Vivado 2020.1
Zybo(Zynq-7000、型番410-279)
Digilent 290-008 DC Motor/Gearbox (1:53 Gear Ratio)
モータドライバへの入力
まずはモータドライバ、PmodDHB1のリファレンスマニュアルを眺めてみる。
Table 1を見る限りだと、基本的にはEN1/EN2にPWMの信号を突っ込んでやればよいらしい。
ここでモータ素人の私の頭に「PWMの周波数ってどうやって決めれば良いの?」という疑問が浮かぶ。
PWM周波数を考える
PmodDHB1にのっているTIのIC:DRV8833のデータシートを見てみると「Current control PWM frequency 50kHz」と書いてあるが、TIのMotor Drivers forumの書き込みを読むと、これはICのCurent control機能が有効になっているときにIC内部で動くPWM制御の周波数だった。
DRV8833: fPWM Current control PWM frequency = 50kHz
PmodDHB1の回路図を見ると、DRV8833のCurrent controlを有効にするAISEN/BISENピンがGNDに落ちているため、Current Controlは無効になっている。この状態だとInputをPWM制御してやれば、単純にOutputは追従するようだ。以下のforumの書き込みを読むとDRV8833のInputのPWM推奨MAX周波数は100kHzとのこと。
DRV8833: About PWM frequency to input pin
もっとも、上記の書き込みやDatasheetのDesign Procedureを読む限り、このICは
- モータを回すターゲットRPMから電流Ichopを求める
- 電流VtripとIchopからAISEN/BISENに接続する抵抗Risenseの定数を決める
- Current controlを使ってIC内部でPWM制御して所望のIchopになるように制御する(InutはPWM制御せず常にHIGH)
という使用方法が一般的のようだ。まぁ本来PWM制御は目的ではなく制御手段なので、実製品で使う場合はそうなるかも。ただモータの速度を可変で制御したい場合はAISEN/BISENをGNDに落とす使い方も結構ありそうな気はする。
今回は特にモータをこのRPMで回したい!というわけではないので、周波数はざっくり決めて、PWMのDuty比を変えてみたりしたいので、周波数は問題無い範囲で適当に決めてしまいたい。
色々ググったところ、一般的にはモータの電気的時定数より短い周期にすると電流リップルが押さえられるのでベターらしい。(調べる中で以下のサイトを参考にさせて頂いたm(_ _)m)
が、DCモータのデータシートを見ても電気的時定数がわからず。頑張って電流波形みればわかると思うが、ちょっとこれ以上真面目に考えるのは面倒なので、適当に1kHz~100kHzくらいで実機の動きをみながら動かしてみようと思う。
Duty比の制約
Duty比についてはZybo上のスイッチなどで動的に変えられるようにしたいと思っているが、DCモータのデータシートの7.PWM controllingの項を見ると以下のような記述が。
The graphite brush of motor will be abnormally wore out the commutator interval will be blocked by carbon poder when using in the condition of D/T under 60%
でもこれってDuty比だけじゃなく周波数とかによっても変わってきそうだよな~と思いつつも、あまり詳細なことはわからんので素直に記述通りDuty比は60%以上で切り替えられるようにしたいと思う。
最終的に決めた実装の方針
以上のもろもろをまとめて、ひとまず
- 周波数:1kHz~100kHzあたりで調整
- Duty比:60%以上で、Zybo上のスイッチ操作により可変
ということでRTLを実装してみようと思う。最終的にはZyboのPSブロックからソフトウェア制御出来た方が面白そうだとは思いつつ、まずはPLブロックでRTLのみで実装してみるつもり。
実は恥ずかしながら(?)プライベート用のオシロスコープ持ってないので、この機会に数MHz帯域の安い手ごろなオシロを買ってみて、波形を見ながらちゃんと所望の周波数&Duty比になっているか確認するのが良さそう。
日記まとめ
ZyboとDCモータで色々と試してみた軌跡を以下でまとめてます。興味があればどうぞ。