ZyboでDCモータを回してみる
前回はZyboでDCモータを動かすための部品を買うところまで書いた。今回は、ZyboにDCモータをつないで簡単な制御をするRTLを書いて、実際にモータを回すところまで書いていきたいと思う。今回はZyboのPLブロックのみ使って、モータ制御をRTLで実装する。
なお、このDCモータはPWM制御で動かすことができるのだが、今回はひとまず細かいPWM制御は組み込まずに常にHIGH(Duty比100%)で回してみる。
開発環境
Windows 10
Vivado 2020.1
Zybo(Zynq-7000、型番410-279)
Digilent 290-008 DC Motor/Gearbox (1:53 Gear Ratio) × 2個
実際に回している様子
まず最初に接続関係をのせておいた方が良いかなと思うので、実際に動いている動画を以下にのせておく。ZyboのJBコネクタにPmodDHB1をつなぎ、PmodDHB1のJ2コネクタにDCモータを接続、6Vの電源(1.5Vの電池を4つ直列)をJ4コネクタに接続している。ちなみにオリンピックうんぬんと書いているのは、ちょうどこれをやっているときに東京オリンピックがやってたから。
ZyboでDCモータ回してみるテスト。そのままだと回ってるかよくわからなかったので、国旗つけてオリンピック感を出してみた。スイッチで回転方向切り替えてボタン押して回転。ひとまずPWMのパルス幅は固定にしたけど、切り替えられるようにしてみるか #FPGA pic.twitter.com/acyzWxMVGg
— Wakky (@wakky_free) August 1, 2021
実はこの動画を撮った時点ではPWMのDuty比を落としたRTLを組み込んでいるので、下記でのせているGithubのプロジェクトのDuty比100%のRTLではもう少し早く回る。
PWMのDuty比を落としたRTLも後々公開はするつもりだが、モータ素人のため意図した動きになっているか確信が持てないので、確認してからこの日記で公開したい。
Zyboでモータを回すプロジェクト
今回は特にIPは使わずに、自作のRTLのみでモータをZybo上のスイッチで制御できるようにした。いつものごとくRTL + xdc + Tclの形式でプロジェクト一式を以下に置いてある。
https://github.com/WakkyFree/FpgaDCmotor/tree/master/DCmotorTest
Tclファイルからプロジェクトを作成する方法は以下を参照。
上記の動画のように接続して、githubのファイル一式からtclでプロジェクト生成してbit streamをZyboに書き込めば動くはず。ただしZyboの型番によってピンアサインが違うかもしれないので、使う場合は自分のZyboの回路図見て確認してください。アサインが違っていて壊れても責任はもちませんのであしからず。
モータを制御するRTL
モータやモータドライバの仕様はデータシートに書いてあるのでいちいち説明しないが、RTLの概要だけ説明しておく。まずはトップファイルのzybo_top.v。CLKはPLブロックにつながっている125MHzクロック。SWによりモータの回転方向を切り替えて、BTNを押すことによりモータを回転させている。ピンアサインはxdcファイルを参照。
以下のサブモジュールでデッドタイムの制御などを行っている。デッドタイムについては「モータ デッドタイム」とかでググればたくさん出てくるので割愛。デッドタイムはprameterで上位モジュールから設定できるようにしている。今回はモータ回したいだけなので特にギリギリまでは攻めずに適当に長めの時間を取っている。
motor_controller #(.DEAD_TIME(26'd124999999)) motor_controller1 ( .CLK(CLK), .RST(RST), .SW(SW0), .BTN(BTN0), .MOTOR_DIR(MOTOR_DIR1), .MOTOR_EN(MOTOR_EN1) );
motor_controller.vの方はカウンターでデッドタイムをつくってるのと、入力のSW/BTNをモータとつながる信号線MOTOR_DIR、MOTOR_ENと結線するくらいしかやってないけど、この中を拡張してPWM制御とかをやっていくイメージ。
日記まとめ
ZyboとDCモータで色々と試してみた軌跡を以下でまとめてます。興味があればどうぞ。