PYNQからAXIバスのレジスタを触って、PWMを弄ってみた

本サイトはアフィリエイト広告を利用しています。
FPGA

PYNQのMMIOを使ってAXIバスのレジスタを変更してみました。

PWMのdutyを変えて、Lチカ・DCモータを制御しています。

プログラムからテスト動画含めて紹介します。

 

スポンサーリンク

PYNQからAXIバスのレジスタを触って、PWMを弄ってみた

PYNQのMMIOを使ってAXIバスのレジスタを変更してみました。

使用したFPGAボードはKV260です。

PWMのdutyを変えて、Lチカ・DCモータを制御しています。

 

プログラムからテスト動画含めて紹介します。

 

テスト環境

テスト環境は以下の通りです。FPGAのファイルは下記環境で作成しています。

  • Vivado, Vitis, PetaLinux…2023.1

使用評価ボードはKV260です。

 

自作のLED基板

LEDをテストした基板に関しては、下記記事で発注した旨を紹介しています。

プリント基板の発注を個人でやってみた(PCBGOGO編)

プリント基板の発注を個人でやってみた(PCBGOGO編)
PCBGOGOでプリント基板を個人発注をしてみました。 PCBGOGOは初めてで、新規のためクーポンが使えて格安で作れました。 発注から入金、基板到着までの流れを紹介します。 プリント基板の発注を個人でやってみた(PCBGOGO編) PCB...

 

回路図の基板データ・実装部品に関しては、下記リポジストリに詳細を残しています。

GitHub - iotengineer22/PCB-KV260-PMOD-TEST: PCB-KV260(KR260)-PMOD-INOUT
PCB-KV260(KR260)-PMOD-INOUT. Contribute to iotengineer22/PCB-KV260-PMOD-TEST development by creating an account on GitHu...

 

自作のモータドライバ基板

テストしたモータドライバ基板に関しては、PCBGOGOで基板作成したものです。

その際のブログ記事は下記です。

モータドライバの回路を自作してみる(DCモータ編)

モータドライバの回路を自作してみる(DCモータ編)
モータドライバの回路を自作して、基板作成しました。 ICはDRV8833です。2chのDCモータを正転・反転制御する基板です。 回路図からアートワークまで作成した旨を紹介します。 モータドライバの回路を自作してみる(DCモータ編) モータド...

 

回路図の基板データ・実装部品に関しては、下記リポジストリに詳細を残しています。

GitHub - iotengineer22/PCB-DRV8833-TEST: DRV8833-PCB-KiCad-DATA
DRV8833-PCB-KiCad-DATA. Contribute to iotengineer22/PCB-DRV8833-TEST development by creating an account on GitHub.

 

ICのDRV8833としては、2つのDCモータ・1つのステッピングモータを制御できます。

今回はDCモータでPWM制御を試してみました。

 

今回はDCモータで突入電流も大きく、USBの5V供給ではテスト動作が出来ませんでした。

そのため、外部バッテリの5Vをモータドライバの電源としています。

 

DCモータ+クランクボックス

DCモータとクランクボックス含めたアーム機構は下記TAMIYAのキットを使っています

 

下記コンテストで改造使用したものです。

AMD(Xilinx)のFPGAコンテストに参加した感想

AMD(Xilinx)のFPGAコンテストに参加した感想
AMD(Xilinx)とHackster(Avnet)が合同主催する、海外のコンテストに参加していました。 AMD Pervasive AI Developer Contest の「Robotics AI」部門です。 KR260というFPG...

 

オシロスコープ

オシロスコープは下記で紹介しているRIGOLの趣味向けの4ch品を使用しています。

オシロスコープの使い方!初めての人向けに多くの測定事例を紹介

オシロスコープの使い方!初めての人向けに多くの測定事例を紹介
オシロスコープの使い方を一から紹介します。 電源の入れ方からトリガーのかけ方までを写真・動画交えて分かりやすく説明します。 初心者の方でも簡単にオシロを使った測定方法を学ぶことができます。

 

PYNQのMMIOモジュールからAXIのレジスタ変更

今回この記事を書いた理由はPYNQのMMIOモジュールをテストしたかったためです。

PYNQのMMIOを使うことで、AXIバスのレジスタを変更できます。

今回FPGAを合成する上でレジスタは把握できています。

 

今回使うIP(Timer)の公式ドキュメントは下記です。

 https://docs.amd.com/v/u/en-US/pg079-axi-timer

 

下記のような形でプログラムしました。PWMのレジスタを変更しています。

 

以前にMMIOではなくオーバレイのdictから情報を読み取る方法でも対応しました。

下記コンテストでKR260で実施した内容です。

 https://www.hackster.io/iotengineer22/control-pwm-dc-motor-from-pynq-and-kr260-bb0296

どちらが楽か確認してみたかったのも理由があります。

 

両方試した感想としては、下記イメージでいます。

  • しっかりレジスタ把握しているならば前者
  • 雑に把握しているIPから、楽にデータ取得したいなら後者

 

実際のテストプログラム

実際にKV260で試したプログラムは下記GitHubに置いています。

kv260-ubuntu-test/jupyter_notebooks/pynq-pwm at main · iotengineer22/kv260-ubuntu-test
This repository present solution for my KV260 Ubuntu test - iotengineer22/kv260-ubuntu-test

 

もしKV260で同様に試したい場合は、下記のようにjupyter_notebooksのフォルダにコピーします。

 

PWMのdutyを変えて、Lチカ+オシロの波形

KV260とオシロスコープを使って、PYNQからPWMのdutyを変える様子を確認します。

テスト動画は下記です。

 

既にjupyter notebookのプログラムは用意しています。

FPGAの.bitファイルをオーバレイしてプログラムを実行していきます。

 

MMIOモジュール経由でレジスタ設定をしています。

最初は10%のPWM駆動をしています。LED光量も小さいです。

波形も殆どがLowで、僅かにしかHighになっていないことが分かります。

 

次にPWMを50%に修正してみます。LED光量も大きくなりました。

波形もLowとHighが50%-50%になっています。

 

最後にPWMを90%にしてみます。LEDも相当光るようになりました。

波形も殆どがHighとなっています。

 

PWMのdutyを変えて、DCモータ+アーム動作

KV260とDCモータを使って、PYNQからPWMのdutyを変える様子を確認します。

テスト動画は下記です。

 

最初に90%のPWMでDCモータ+アーム動作を確認しました。スムーズに動作します。

 

PWMを50%にしても、アーム動作しますが動きが遅くなります。

 

PWM10%だとパワーが足りず、モータとアームは回転できませんでした。

PWM30%だと何とか回ったという形になります。

 

まとめ

PYNQのMMIOを使ってAXIバスのレジスタを変更してみました。

PWMのdutyを変えて、Lチカ・DCモータを制御できています。

 

よろしければ、皆様もLチカやDCモータをPWMで遊んでみてください。

コメント