Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_13(PWM出力)

 

STM32:PWM出力とLEDの光度調整

1.本日の内容

(1) STM32マイコン(nucleo f401RE)を使用して、PWM出力をする。

 (2) PWMの出力を変更することで、LEDの光度を変更する。

 (3) PWMの出力をオシロスコープで確認する。

  オシロスコープは簡易キットを使用

 

・目次

 

2.内容

​​(1) やる内容の詳細​

  ・STM32マイコン(nucleo f401RE)を使用して、PWM出力する。

    ・PWM出力でLEDの光度を500msで変更する。

  ・PWMの出力を簡易オシロスコープで確認し、動きを理解する。

(2) 使用部品​
個数 部品名 型番
1 USBケーブル ​​USBミニBタイプ
1 mbed(マイコンボード) ​​nucleo f401RE
1 ブレッドボード・ジャンパーワイヤ(オス-オス) BBJ-65

オシロスコープは下記オシロスコープキットを使用している。

オシロスコープ

 

(3) STM32CubeMXの設定、プログラムを出力

  (a)使用ピンを設定
   ・PA1:TIM5_CH2 :オシロスコープ確認用

   ・PA5:TIM2_CH1 :LED確認用

   
  (b)使用するピンの名前を変更 
   ・今回は特に何もしない。

 

  (c)PWMの設定
   ・TimersのTIM2_CH1を選択

   ・Clock SourceをInternal Clock (内部クロック)に設定

   ・Channel1をPWM Generation CH1に設定

   ・Parameter Settingsタブの下記項目を設定(周波数1kHzに設定)

    ・Prescaler   :1 - 1

    ・Counter Period:16000

PWM出力(TIM2)

   ・TimersのTIM5_CH2を選択

   ・Clock SourceのInternal Clockをチェックを入れる。

   ・Channenl2をPWM Generation CH2に設定

   ・Parameter Settingsタブの下記項目を設定(周波数1kHzに設定)

    ・Prescaler   :15

    ・Counter Period:1000 - 1

PWM出力(TIM5)

  (c)プログラムの出力
   ・Project Maagerを選択
   ・Project Nameにプログラムの名前を入力:PWM1   
    ※スペース、空白文字、日本語を含めるとエラーになる場合があるので、使用しない。

   ・Project Location:プロジェクトを保存する場所
   ・Application Structure:Advanced (出力するフォルダの構成を選択)
   ・Toolchain/IDE:TrueSTUDIO(今回は、AtoricTrueStdioを使用するため)
  (d)GENERATE CODEで、コードを出力
  (e)Open pROJECTをクリックすると、AtricTrueStdioが自動的に起動される。

 

(4) AtricTrueStdioでプログラム作成
  (a) AtricTrueStdioから開く場合(上記(e)をした場合は不要)
    ・AtricTrueStdioを起動
    ・インポート元のディレクトリをクリック
    ・CubeMXで作成した場所を指定
    ・フォルダーにADC1(作成したプロジェクトの名前)が表示
    ・チェックされているのを確認して、終了をクリック 

 (b) プログラムの書き込み
   ・トンカチマークをクリックして、ビルドする。
   ・エラーが出ないことを確認する。
   ・下記プログラムを記載する。
  /* USER CODE BEGIN 2 */
  	  //TIMの開始
  	  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);	//TIM2のchannel1開始
  	  HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2);	//TIM5のchannel2開始
  /* USER CODE END 2 */
 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  //TIM5のchannnel2の出力を1000に設定
	  __HAL_TIM_SET_COMPARE(&htim5, TIM_CHANNEL_2, 1000);
	  //TIM2のchannel1の出力を500に設定
	  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 500);

	  //500ms待ち
	  HAL_Delay(1000);
	  //TIM2のchannel1の出力を10に設定
	  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 10);
	  //500ms待ち
	  HAL_Delay(500);
  }
  /* USER CODE END 3 */
(5) PWMの説明

 (a) PWMとは、信号のON/OFFの時間を制御するもの。

  ON/OFFを同じ周期で繰り返す(スイッチング)する。

  これを、早い周期でスイッチングを行うことで、

  ONしている時間(パルス幅)に比例した任意の電圧が得られる。

  参考:PWMとは | 東芝デバイス&ストレージ株式会社 | 日本

    

  これは、スイッチングレギュレータなどで使用されている。

  参考:今さら聞けないスイッチング電源の基本Vol.9 | 過去メルマガ一覧 | 加美電子工業株式会社

  

  このPWMを決定するのに、デューティ比、周期、パルス幅がある。

 

 (b) 周期

   ・1秒間にON/OFFしている回数
    →周期T[s] = 1/count[回数] 
    例:10秒間で、100回 ON/OFFした場合の周期
    T = 10 / 100
     = 1/10 [s]
     →1秒間に、10回ON/OFFしている。  
     単位はs(秒)
   ※この周期の逆数を周波数という。 f = 1/T [Hz]
 

 (c) パルス幅

   ・1回 ON/OFFする間に、どれだけの時間ONしているか。
    →パルス幅H[s] 
 

 (d) デューティー

   ・周期に対して、パルス幅の比をデューティー比という。
   →デューティー比[%] = H[s] / T [s] * 100
   

デューティー
  例:1秒間に2回ON/OFFする。
    そのうち、1回ONする時間が0.25秒だった場合。
    周期T = 1 / 2 [s]
       = 0.5 [s]
    パルス幅 = 0.25 [s]
      デューティー比 = 0.25/0.5 * 100
            = 50[%] 
    周波数 = 2 [Hz]
    ※2Hzということから分かるように、周波数は1秒当たりにON/OFFする回数と同じになる。
    通常、周波数は正弦波で使用される。
    イメージ的には、
    ・方形波(上のようなON/OFFする波形)の場合は、1秒間に、ON/OFFする回数。 
    ・正弦波の場合は、1秒間に、波が何個あるか。
    と考えると分かりやすい。
 

 (e) 平均電圧

   ・1秒に2回など遅い場合は、ただON/OFFするだけだが。
    これが1000回など高速にON/OFFすると、
    見かけ上、LEDがON/OFFしているわけではなく、
    LEDがあたかも光度が下がった状態で見える。
    これにより、疑似的に出力する電圧を変えることができる。 
     → 平均電圧 = 出力電圧 * デューティー
  
 ・上記、周期、パルス幅、デューティー比によって、LEDの光度を変更する。
 
(6) CubeMxの説明
 CubeMXでは、
 ・出力するポート
 ・出力するイベントハンドラとチャンネル
 ・出力する周期
 を設定している。
 
 (a) 出力するポート
   ・PWMを出力するのは、TIMを使用する。
   ・TIMは周期割り込み処理であり、それをPWM出力として設定している。
   ・ポート設定で、TIM2_CH1とTIM5_CH2を設定している。
   ・このTIMxx_CH・・のxxが使用するイベントハンドラ、・・がチャンネルを示している。
   
 (b) 出力する周期の設定
   ・PWMを出力するのは、TIMを使用する。
   ・TIMは周期割り込み処理であり、それをPWM出力として設定している。
 
   ・下記に周期の計算結果を示す。
   ・周波数 f = APB1/Counter Period/(Prescaler+1)
   ・周期    s = 1/f [s]
 
   ・今回は、
    ・APB1 = 16000000

    ・Prescaler = 16-1

    ・Counter Period = 1000

        f = 16000000/(1000)/(16-1+1)

       = 1000 [Hz]

   T[s] = 1/f 

    = 1/1000 [s]

    =1 [ms] 

TIM2設定

 

TIM5設定

 

(7) プログラムの説明
 (a) HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
   ・TIMでPWMを開始するための関数。
   ・第一引数:イベントハンドラ
   →今回はTIM2を使用するため、&htim2を指定
   ・第二引数:使用するチャンネル。 
         CubeMxを見ると、選択時に、channnelが1~4ある。 そのチャンネルを指定する。
   参考:

HAL_PWMライブラリ
※UM1725の1002ページより抜粋
 
 (b) __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 500);
  ・Compare レジスタの値を設定している。
  ・今回、CubeMxで1kHzに設定している。
  ・1000msでON/OFFし、そのうち500msの間Highとなる。
 

PWM

※UM1725の1042ページより抜粋

 ・Compareレジスタや、CubeMXのプリスケーラ値については、
  「RM0368」に記載してある。
  ただ、まだ学習中でよくわかっていない部分が多いため、
  ここでは割愛する。
 
(8) 出力確認

簡易オシロスコープキットで確認。

1DIV0.5msのため、

 0.5ms:Low

 0.5ms:HIGH

になっていることが分かる。

PWM接続
(9) 周波数を変更してみる。

 CubeMXで下記値に変更して、再度出力する。

 ・TimersのTIM5_CH2を選択

   ・Clock SourceのInternal Clockをチェックを入れる。

   ・Channenl2をPWM Generation CH2に設定

   ・Parameter Settingsタブの下記項目を設定(周波数2kHzに設定)

    ・Prescaler   :15

    ・Counter Period:2000 - 1

 そうした時の出力

 ・500ms:HIGH

 ・1500ms:LOW

 となり、2KHzで動作していることが分かる。

 

今度は、AtricTrueStdioで、下記に変更して出力する。

 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 1000);

そうすると、下記の出力になる。

 ・1000ms:HIGH

 ・1000ms:LOW

 

以上のような形で、PWMの設定が出来る。

上記プログラムを書き込むと、LEDの光度が変更されるので、

確認してみるとよい。

 

 

3.関連記事

組み込みC言語