CCWO

挫けそうになるブログ

STM32F303K8 PWM

開発環境

評価ボード Nucleo STM32F303K8
IDE System Workbench for STM32 (SW4STM32)
Library Hal Library
OS windows 10 pro

TIMユニットの機能を用いてPWMを出力します。

CubeMXの設定

f:id:CCWO:20170822023131p:plain
左ツリーTIM2の
Clock Source: Internal Clock
Channel1: PWM Generation CH1
Channel2: PWM Generation CH2
を選択します。

TIM2の設定

Configuration→TIM2→Parameter Settings
f:id:CCWO:20170822023530p:plain
Counter Settings
Prescaler: 0(自由に)
Counter Period: 40000
Internal Clock Division: No Division(自由に)
PWM Generation Mode 1
Mode: PWM mode 1
Pulse: 10000(自由に)
PWM Generation Mode 2
Mode: PWM mode 2
Pulse: 20000(自由に)
と設定しました。出力したいPWMの周波数やDuty比(初期値)に応じて設定します。この状態でgenerateします。

SW4STM32の設定

PWM設定用のグローバル変数を用意します。

/* USER CODE BEGIN 0 */
TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
/* USER CODE END 0 */

TIM2の動作を開始させます。

/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
/* USER CODE END 2 */

これでビルドし、書き込めばPWMが出力されます。
f:id:CCWO:20170822024131j:plain
ちょうど半分のDuty比が出力されていることが確認できます。PWM周波数はちょっと適当。
もしDuty比を後から変えたいときは次のようにwhile文の中を変更。

sConfigOC.Pulse = pulse;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
     Error_Handler();
}
if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
{
     Error_Handler();
}
pulse += 100;
if(pulse > 20000) pulse = 0;
HAL_Delay(1000);

これで、Duty比が徐々に上がるPWMを出せます。
こちらを参考にしました。
blog.livedoor.jp