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) 使用部品
(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
・TimersのTIM5_CH2を選択
・Clock SourceのInternal Clockをチェックを入れる。
・Channenl2をPWM Generation CH2に設定
・Parameter Settingsタブの下記項目を設定(周波数1kHzに設定)
・Prescaler :15
・Counter Period:1000 - 1
(c)プログラムの出力
・Project Maagerを選択
・Project Nameにプログラムの名前を入力:PWM1
※スペース、空白文字、日本語を含めるとエラーになる場合があるので、使用しない。
・Project Location:プロジェクトを保存する場所
・Application Structure:Advanced (出力するフォルダの構成を選択)
・Toolchain/IDE:TrueSTUDIO(今回は、AtoricTrueStdioを使用するため)
(d)GENERATE CODEで、コードを出力
(e)Open pROJECTをクリックすると、AtricTrueStdioが自動的に起動される。
(4) AtricTrueStdioでプログラム作成
・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) 周期
(c) パルス幅
(d) デューティー比
(e) 平均電圧
(6) CubeMxの説明
・PWMを出力するのは、TIMを使用する。
・PWMを出力するのは、TIMを使用する。
・Prescaler = 16-1
・Counter Period = 1000
f = 16000000/(1000)/(16-1+1)
= 1000 [Hz]
T[s] = 1/f
= 1/1000 [s]
=1 [ms]
(7) プログラムの説明
・TIMでPWMを開始するための関数。
※UM1725の1042ページより抜粋
(8) 出力確認
簡易オシロスコープキットで確認。
1DIV0.5msのため、
0.5ms:Low
0.5ms:HIGH
になっていることが分かる。
(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.関連記事
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary
その他:
・CubeIDEの使い方(起動~デバック実行) - Project_OKI’s diary
・SPI通信とは - Project_OKI’s diary
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・C++日本語リファレンス(uint8_t)
・STM32でUARTをやってみる1
・STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (5) UARTを使ってみよう
・マイクロマウス研修(kora編)[23] STM32マイコンでシリアル通信
・C言語ゼミ