PwmOut (STM32)

(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でも開けると思います。

ピン設定のリストです。
PwmOut.zip
zip ( 圧縮 ) ファイル 44.5 KB

サンプルコード

 このサンプルコードを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)    {       }
}