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個
実際に回している様子
いつものごとく先に回している様子の動画を貼っておく。前は色々張り付けてロボットっぽくしていたが、ゴチャゴチャして動きにくいので片方のモータのクランク機構だけ残した。ツイート内でも書いているが、周波数1kHz、Duty比60%で回している。
my new gearで無事に周波数1kHz(周期1msec)、Duty比60%でPWMの信号がZyboから出せている事を確認!今週末はモータについてるエンコーダの信号を色々見てみようかな pic.twitter.com/z20GOgBzmK
— Wakky (@wakky_free) September 20, 2021
今思うとオシロスコープのキャプチャ機能で画像を残しておけばよかったのだが、写真の波形の通り(かなり見えにくいけど…)周波数が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ファイルからプロジェクトを作成する方法は以下を参照。
モーターを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モータで色々と試してみた軌跡を以下でまとめてます。興味があればどうぞ。