あのFPGAボードでDCモータをPWM制御する
1. はじめに
あのFPGAボードで今度はDCモータをPWM制御した。FPGAで任意にクロックを生成し、PWM信号として利用してみる実験。
2. 実験結果
使用したモータードライバはこの前と一緒のもの。この前はテストのためずっとHIGHをPWMに入れっぱなしだったが、今回はFPGAで分周したクロック入力を作り、PWMとして入力する。
が、実験したところ、モータ電源3V程度の設定では、PWMを高周波にし過ぎても正味かかる電圧(実効電圧)が低下すぎて?しまい、連続したモータ出力が得られなかった。
(実効電圧を概算したい場合、電力に変換⇒PWM周期より十分大きい領域で電力を時間積分⇒単位時間当たりの仕事量[W]に直して実効電圧を得る、のが調べると定石のよう)
モータ電源3Vの状態で1kHzぐらい(FPGAの発振器が50MHzなのでクロック換算なら50000回)与えてやるとOKだった。この時、モーターに流れる電流値は安定化電源の表示だと150mA程度だった。
(ブレッドボード上のスイッチは前やった実験の残り香です…。今回は使ってない)
3. コード
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity MOTOR is port( CLK : in std_logic; IN1, IN2, PWMA: out std_logic ); end MOTOR; architecture RTL of MOTOR is -- 5000カウントで0.1ms(10kHz), 50000カウントで1ms(1kHz) signal CNT_PWMA: integer range 0 to 4999999; signal PWMA_TR : std_logic; begin process( CLK ) begin if( CLK'event and CLK = '1') then if( CNT_PWMA < 50000 ) then PWMA_TR <= '1'; CNT_PWMA <= CNT_PWMA + 1; elsif ( 50000 <= CNT_PWMA and CNT_PWMA < 50000*2 ) then PWMA_TR <= '0'; CNT_PWMA <= 0; CNT_PWMA <= CNT_PWMA + 1; else CNT_PWMA <= 0; end if; end if; end process; process(PWMA_TR) begin if(PWMA_TR = '1') then IN1 <= '1'; IN2 <= '0'; PWMA <= '1'; else IN1 <= '0'; IN2 <= '0'; PWMA <= '0'; end if; end process; end RTL;
4. 参考資料
http://doc.switch-science.com/datasheets/TB6612FNG_datasheet_ja_20141001.pdf