FPGAボードのKR260でPWMを制御してみました。
Python(PYNQ)経由でPWM出力して、モータドライバの基板を制御しています。
オリジナルの基板を作り、DCモータ制御した内容を紹介します。
PWMのIPからDCモータを制御してみた(KR260+PYNQ)
AMD(Xilinx)のFPGAボードであるKR260には、PMODコネクタがあります。
PWMのピンとしても使用することができます。
専用のモータドライバ基板を作成して、PWMでDCモータ制御をしてみました。
実際のテスト動画は下記です。DCモータをPWM制御できていることが分かります。
※一緒にLEDでPWM制御も試しています。
基板の回路図・AWや、FPGAのプロジェクトの作成まで一から紹介してきます。
回路図とAW(アートワーク)
モータドライバ基板の回路図とAWのデータはGitHubに置いています。
KiCadで作成しています。
https://github.com/iotengineer22/PCB-DRV8833-TEST
直接PMODコネクタに接続するために、2.54mmピッチのピンヘッダーを使っています。
回路図は下記です。
AWは下記です。
宣伝にもなりますが、PCBGOGOで基板作成したものです。
VivadoでKR260のプロジェクトを作る
Vivadoを開いて、プロジェクトを作成していきます。
最終的に2つのモータを制御するために、4本のPWM出力と1本のGPIOを出力します。
Create Project
「Create Project」→適当な名前つけて進めていきます。
Project Typeでは、デフォルトのRTLにしておきます。
Default Partでは、Boardを選択してKR260を選びます。
Create Block Design
Projectファイルが出来上がります。
Create Block Designを選択して、ブロックのデザインを進めます。
Diagramの「+」箇所から、Zynq UltraScale+ MPSoCを選びます。
Diagramの「+」箇所から、PWMのIPを選びます。
IP選択後はMake Externalで出力ピンまで作り、4出力分コピーして対応します。
またGPIOのIPも1個作成しときます。
PWMのIPは編集しませんが、GPIOのIPは編集します。
今回は各IPでOUTPUT1本で使いますので、GPIO Widthを設定しました。
またAll outputsにもチェックを入れています。
Create HDL Wrapper
Sourceのデザインを右クリックして、Create HDL Wrapperします。
何かoptionsのウインドウが出るかもしれませんが、デフォルトで進めます。
IPブロックのデザインから、入出力につながるHDLが作られます。
作られたファイルを確認するとPWMとGPIOのOutputを確認できます。
XDCファイルを作成する
ピンアサインをしていきます。
Constrainsの箇所で右クリックしてAdd Sorucesから設定します。
Create FileでXDCファイルを追加します。
PMOD1の1ピン(H12)、3ピン(E10)、5ピン(D10)、7ピン(C11)、2ピン(B10)を設定しています。
- PWM…1ピン(H12)、3ピン(E10)、5ピン(D10)、7ピン(C11)
- GPIO…2ピン(B10)
1 2 3 4 5 6 7 8 9 10 11 |
set_property PACKAGE_PIN H12 [get_ports pwm_0] set_property PACKAGE_PIN E10 [get_ports pwm_1] set_property PACKAGE_PIN D10 [get_ports pwm_2] set_property PACKAGE_PIN C11 [get_ports pwm_3] set_property PACKAGE_PIN B10 [get_ports gpio_rtl_0_tri_o[0]] set_property IOSTANDARD LVCMOS33 [get_ports pwm_0] set_property IOSTANDARD LVCMOS33 [get_ports pwm_1] set_property IOSTANDARD LVCMOS33 [get_ports pwm_2] set_property IOSTANDARD LVCMOS33 [get_ports pwm_3] set_property IOSTANDARD LVCMOS33 [get_ports gpio_rtl_0_tri_o[0]] |
Bitstreamを作成
Generate Bitstreamのファイルを作成します。エラーなければ作成できます。
プロジェクトの~.runs/impl_1/あたりにbitファイルができます。
またハードウェアの情報が入っている.hwhファイルも必要になります。おそらく下記にあります。
~.gen/sources_1/bd/design_1/hw_handoff
.hwfファイルは必ず、名前をBitstream.bitを合わせて名前変更しておきます。
下記のように合わせておきました。KR260に.bitと.hwhファイルを転送します。
- design_1_wrapper.bit
- design_1.hwh→design_1_wrapper.hwh
Jupyter Notebook
Kria-PYNQをJupyter Notebookから使って、GPIOを制御します。
KR260にはLANケーブルがあるので、LANで繋げてブラウザ経由で編集していきます。
インストール後にifconfigなどでIPアドレスを確認します。
今回筆者の場合IPアドレスは「192.168.11.7」でした。
Webブラウザ(筆者の場合はChrome)で「http://192.168.11.7:9090/」と入力します。
Jupyter Notebookが表示されます。ディレクトリ位置は下記です。
/home/root/jupyter_notebooks/
フォルダを作成して、実行する.ipynbとVivadoで作成した.bitと.hwlを置きました。
ipynbファイル
今回筆者が作成・実行したipynbファイルは下記です。
主に下記サイトを参照させていただきました。
https://www.makarenalabs.com/pwm-on-pynq-how-to-control-a-stepper-motor/
https://docs.amd.com/v/u/en-US/pg079-axi-timer
LEDでPWMのテスト
モータ制御をする前に、LEDでPWMが制御できているかを確認します。
LEDチェック用の基板は下記GitHubで紹介しています。
https://github.com/iotengineer22/PCB-KV260-PMOD-TEST
実際にテストした動画が下記です。
PWMが10%→50%→99%でLEDの輝度が変わっているのが分かります。
(静止画ではわかりづらいため、動画での確認も是非お願いします)
PWMでDCモータドライバを制御する
モータドライバ基板とDCモータを接続して、PWMで制御します。
テスト動画は下記です。
FPGAをロード後に、前回転でPWMを10%→50%→99%にしてモータの出力制御しています。
その後、後回転でもPWMを10%→50%→99%にして、モータ制御できています。
まとめ
FPGAボードのKR260でPWMを制御してみました。
Python(PYNQ)経由でPWM出力して、モータドライバの基板を制御できました。
今回のKR260で実施した内容は、下記記事で紹介したテストの一部です。
コメント