(2015.5.31 作成)
(2015.6.11 注意点追加)
(2015.6.21 修正)
STM32の場合PWM出力はTIM機能を用いて作成されますが、この際の動作を下の図を用いて簡単に説明します。
TIMのカウンタは (TIMクロック) x (プリスケーラ)で決められる時間間隔でカウント値が増え続け、カウンタがオートリロード値に一致すると0にリセットされます。この際カウンタ値が0からキャプチャコンペア値までの間はHigh出力、そのほかのときはLow出力になります。
周期等をmsやus単位の整数として扱いたい場合は積極的にms, us版を使用してください。float版のperiod関数は入力周波数次第で決定されます。
上記プリスケーラ、オートリロード値などはPwmOutクラスではperiod関数が呼ばれた際に設定されます。パルス幅/Dutyはperiod関数呼び出し時に設定されたカウンタクロックの単位で設定されます。
関数 | タイマカウンタクロック | 最大周期 | |
float版 | period |
周期次第で1us, 1msまたは1クロック単位 |
TIMクロック依存 |
ms版 | period_ms | 0.5ms |
32767ms =32s |
us版 | period_us | 1us |
65535us =65ms |
適宜最適なものを使用してください。
注意点
本記事執筆時点でのF3用のHALドライバの最新バージョンは "STM32Cube_FW_F3_V1.1.0"ですが、このstm32f3xx_hal_tim.hの
1070行目で
#define __HAL_TIM_PRESCALER (__HANDLE__, __PRESC__)
と書かれています。しかしこの場合PRESCALERと (__HANDLE__の間にスペースが挿入されておりうまく動作しません。F4や他の関数に合わせてこのスペースを削除するようにしてください。
プロトタイプ |
PwmOut(TIM_TypeDef *TIMx, const uint8_t &Channel, const uint8_t &PinMode); |
|
引数
|
TIMx |
使用するTIMを設定します。 何が使えるかはマイコン依存です |
Channel |
使用するTIMのチャネル設定です
TIM_CHANNEL_1 など |
|
PinMode |
出力するピン設定選択です |
使用するマイコンごとに設定できる上記3パラメータは異なり、それに応じて出力されるピンも変化します。TIM1を使用した場合の例を下に示します。
TIMx | Channel | PinMode |
STM32F303xC (F3 Discovery) |
STM32F401xE (NucleoF401RE) |
TIM1 | TIM_CHANNEL_1 | 0 | PA8 | PA8 |
1 | PE9 | PE9 | ||
TIM_CHANNEL_2 | 0 | PA9 | PA9 | |
1 | PE11 | PE11 | ||
TIM_CHANNEL_3 | 0 | PA10 | PA10 | |
1 | PE13 | PE13 | ||
TIM_CHANNEL_4 | 0 | PA11 | PA11 | |
1 | PE14 | PE14 |
TIM1以外の設定は以下のファイルを見てください。フリーのLibreOffice Calcのフォーマットですが、Microsoft EXCELでも開けると思います。
このサンプルコードをF3Discoveryで実行すると200us周期でDuty50%のPWM信号が出力されます。書き込み方法等についてはこちらを参照にしてください。
#include "DKS_Util_DiscoF3.h" #include "DKS_PwmOut_DiscoF3.h" int main(void) { DKS::InitSystem(); DKS::PwmOut pwm(TIM3, TIM_CHANNEL_1, 2); //PC6 pwm.period_us(200); pwm.pulsewidth_us(100); while (true) { } }