前回はタイマが使用中か否かを確認する方法を確認。今回はタイマを使用する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番号につづいて、設定の周波数とデューティ、出力端子名を列挙してます。右側に周波数とデュティの測定値が表示されてます。
前掲の表では、D15端子については以下の組み合わせも使えるハズなのですが、以下のように拒否られました。なお、af: 3 と書かれていることから、af3ということはそこはかとなく伝わっているのか?
Timer10, CH1 (D15)、Error
つづいてA0端子を使い、AF1とAF2の両方のタイマが同じ端子で切り替えて使えるのか確かめてみました。まずはAF1のTimer2です。
以下は、AF2側のタイマ5です。こちらも使用可能。
上記以外もざっくり調べた結果、以下の「感触」を得ました。
-
- AF1、AF2選択のタイマ1,2,3,4,5のPWMチャネルは使用可能。
- AF3選択のタイマ9,10,11のPWMチャネルはMicroPythonでは使用不能?
- 端子D0、D1は、MicroPython(ThonnyIDE)で使用しているようなのでこれまた使用不能。
まあ、上の表と上記の感触をもとに、IO用に使用するタイマとインターバル制御などに使うタイマをすみ分けるってものかい?知らんけど。