LIFE LOG(ここにはあなたのブログ名)

作業日誌 う靴

気ままにコンピュータ関連の備忘録などを書きます...。

あの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