【FPGA】ZyboでDCモータをPWM制御してみる (FPGAとDCモータで遊ぼう日記5日目)

投稿日:2021年10月20日
最終更新日:2021年10月20日

ZyboでDCモータをPWM制御してみる

前回はPWM制御をやるにあたって、周波数とDuty比を考えてみた。今回はいよいよRTLを実装してZyboでDCモータをPWM制御して回してみたいと思う。

 

開発環境

Windows 10

Vivado 2020.1

Zybo(Zynq-7000、型番410-279)

Digilent 290-008 DC Motor/Gearbox (1:53 Gear Ratio) × 2個

Digilent 410-259 PmodDHB1

 

実際に回している様子

いつものごとく先に回している様子の動画を貼っておく。前は色々張り付けてロボットっぽくしていたが、ゴチャゴチャして動きにくいので片方のモータのクランク機構だけ残した。ツイート内でも書いているが、周波数1kHz、Duty比60%で回している。

今思うとオシロスコープのキャプチャ機能で画像を残しておけばよかったのだが、写真の波形の通り(かなり見えにくいけど…)周波数が1kHz(周期1msec)で、Duty比は60%(Highの時間が600usec)になっている。

ちなみにDCモータ素人の私は、データシートを読んでもDCモータが何kHzまで追従できるのか読み取れなかったので色々現物で試してみたのだが、PWM制御の周期を10kHz、100kHzにしたときはDCモータが追従できないようでうまく回転しなかったため、1kHzに落ち着いた。

※モータドライバは前回の日記で書いた通り100kHzまでは対応している。

 

ZyboでDCモータをPWM制御するプロジェクト

いつもと同様、特にIPは使わずに自作のRTLのみでモーターをZybo上のスイッチでPwm制御できるようにした。RTL + xdcファイル + Tclの形式でプロジェクト一式を以下に置いてある。

https://github.com/WakkyFree/FpgaDCmotor/tree/master/DCmotorTestPwm

Tclファイルからプロジェクトを作成する方法は以下を参照。

【FPGA】Vivadoのプロジェクトをtclから生成する

 

モーターをPWM制御するRTL

いつものごとく、ポイントだけメモっておく。トップモジュールのzybo_top.vに以下のinputを追加してZybo上のスイッチSW2に接続されるようにピンアサインし、スイッチをONにするとmotor_controller_pwmのPWM制御を有効にするようにした。

input         SW2,

motor_controller_pwmの中では、r_pwm_counterでカウンタをつくって、カウンタの数値がPWM_TIMEまでいったらリセットするようにしている。そして以下の信号でカウンタが動き出したらw_pwm_enableをHIGHに、カウンタがDUTY_LOW_TIMEまで行ったらw_pwm_enableをLOWにすることで、PWM制御をおこなっている。

assign w_pwm_enable = (r_pwm_counter > 11'd0) && (r_pwm_counter <= DUTY_LOW_TIME);

あとはポイントとしてはr_pwm_counterがデッドタイムの時は動かないようにしてるのと、PWM_EN(トップモジュールのSW2と接続している信号)の入力でPWM制御のON/OFF(言い方を変えると、DUTY比100%/60%)の切り替えをやっているくらい。

assign MOTOR_EN = PWM_EN ? w_pwm_enable: BTN & ~|r_dead_time_counter;

次回は、基板上のスイッチやボタンでDuty比を切り替えられるようにしてみようと思う。

 

日記まとめ

ZyboとDCモータで色々と試してみた軌跡を以下でまとめてます。興味があればどうぞ。


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください