MicroPython的午睡(82) STM32F401RE版、タイマとPWM出力端子の関係

Joseph Halfmoon

前回はタイマが使用中か否かを確認する方法を確認。今回はタイマを使用するMicroPython機能としてPWM出力を使ってみたいと思います。ほとんどのタイマはPWM出力が可能なチャネルを4つずつ持っています。しかしどのタイマのどのチャネルをどこのピンに出せるかはハードで決まっています。まずそこから表にしてみました。

※「MicroPython的午睡」投稿順 Indexはこちら

STM32F401REのタイマとチャネル、端子の関係

前回列挙したSTM32F401REのタイマのうち、TIM1からTIM11(ただしTIM6,7,8はF401REでは欠番)については、主となるカウンタやリロード機能以外にPWM出力や入力キャプチャなどに使用可能なチャネルを搭載しています。TIM1からTIM5については各4本づつ、TIM9は2本、TIM10/11は1本です。

チャネルといっても「アドバンスド・コントロール・タイマ」と称しているTIM1は1本のチャネルから入出力している制御線の本数が多く、後ろの方のタイマなどは限定機能でシンプル入出力です。

タイマの入出力機能はGPIO端子を「オルタネート・ファンクション(AF)」というもので切り替えることで入出力可能となります(MicroPython使っているならば、AFを制御するレジスタはよきに計らってくれますが。)マイコンとして設定可能な各タイマのCH機能とGPIOのAFの組み合わせを列挙すると以下のようです(タイマ機能と無関係の端子は飛ばしています。また、NUCLEO-F401REではPEx端子は使用できないです。)

なお、後で見ますがMicroPythonとしては以下の表のすべての組み合わせが使えるわけではないようです。

PIN Arduino AF1 AF2 AF3
PA0 A0 TIM2_CH1/ETR TIM5_CH1
PA1 A1 TIM2_CH2 TIM5_CH2
PA2 (D1) TIM2_CH3 TIM5_CH3 TIM9_CH1
PA3 (D0) TIM2_CH4 TIM5_CH4 TIM9_CH2
PA5 D13 TIM2_CH1/ETR
PA6 D12 TIM1_BKIN TIM3_CH1
PA7 D11 TIM1_CH1N TIM3_CH2
PA8 D7 TIM1_CH1
PA9 D8 TIM1_CH2
PA10 D2 TIM1_CH3
PA11 TIM1_CH4
PA12 TIM1_ETR
PA16 TIM2_CH1/ETR
PB0 A3 TIM1_CH2N TIM3_CH3
PB1 TIM1_CH3N TIM3_CH4
PB3 D3 TIM2_CH2
PB4 D5 TIM3_CH1
PB5 D4 TIM3_CH2
PB6 D10 TIM4_CH1
PB7 TIM4_CH2
PB8 D15 TIM4_CH3 TIM10_CH1
PB9 D14 TIM4_CH4 TIM11_CH1
PB10 D6 TIM2_CH3
PB12 TIM1_BKIN
PB13 TIM1_CH1N
PB14 TIM1_CH2N
PB16 TIM1_CH3N
PC6 TIM3_CH1
PC7 D8 TIM3_CH2
PC8 TIM3_CH3
PC9 TIM3_CH4
PD2 TIM3_ETR
PD12 TIM4_CH1
PD13 TIM4_CH2
PD14 TIM4_CH3
PD15 TIM4_CH4
PE0 TIM4_ETR
PE5 TIM9_CH1
PE6 TIM9_CH2
PE7 TIM1_ETR
PE8 TIM1_CH1N
PE9 TIM1_CH1
PE10 TIM1_CH2N
PE11 TIM1_CH2
PE12 TIM1_CH3N
PE13 TIM1_CH3
PE14 TIM1_CH4
PE15 TIM1_BKIN
今回実験に使用したMicroPythonコード

上記のごく一部の端子のみですが、実際にPWM出力させてその動作を確認してみました。使用したスクリプトが以下に。以下でタイマの番号4、チャネル番号3,端子名D15 の部分を書き換えることで所望のタイマのCHを試してみることができます。

#STM32: PWM output Test
import pyb
import machine

def main():
    print("STM32F401RE PWM Test. Timer4 CH3")      
    tim = pyb.Timer(4, freq=20000)
    pwmCH = tim.channel(3, pyb.Timer.PWM, pin=machine.Pin.board.D15)
    pwmCH.pulse_width_percent(50) 
    print("End of test.")

if __name__ == "__main__":
    main()
実機確認結果

以下、タイマ番号、CH番号につづいて、設定の周波数とデューティ、出力端子名を列挙してます。右側に周波数とデュティの測定値が表示されてます。

Timer4 CH3, 10kHz, 50% (D15)PWM_T4C3_10K50

 

Timer4 CH3, 10kHz 25% (D15)PWM_T4C3_10K25

 

Timer4 CH3, 20kHz 50% (D15)PWM_T4C3_20K50

前掲の表では、D15端子については以下の組み合わせも使えるハズなのですが、以下のように拒否られました。なお、af: 3 と書かれていることから、af3ということはそこはかとなく伝わっているのか?

Timer10, CH1 (D15)、Error

Timer10CH1Error

つづいてA0端子を使い、AF1とAF2の両方のタイマが同じ端子で切り替えて使えるのか確かめてみました。まずはAF1のTimer2です。

Timer2 CH1、1kHz, 50% (A0)PWM_T2C1_1K50

 

以下は、AF2側のタイマ5です。こちらも使用可能。

Timer5 CH1、2kHz, 50% (A0)PWM_T5C1_2K50

上記以外もざっくり調べた結果、以下の「感触」を得ました。

    1. AF1、AF2選択のタイマ1,2,3,4,5のPWMチャネルは使用可能。
    2. AF3選択のタイマ9,10,11のPWMチャネルはMicroPythonでは使用不能?
    3. 端子D0、D1は、MicroPython(ThonnyIDE)で使用しているようなのでこれまた使用不能。

まあ、上の表と上記の感触をもとに、IO用に使用するタイマとインターバル制御などに使うタイマをすみ分けるってものかい?知らんけど。

MicroPython的午睡(81) STM32F401RE版、使われているタイマを調べる へ戻る

MicroPython的午睡(83) STM32F401RE版、Timer1、クロック周波数 へ進む