へっぽこ元ロボコニスト

ロボコンに燃え尽きた自分が日々の出来事を書くだけのブログです twitter:@mozyanari_tech

MENU

2020/12/29(STM32におけるPWM Inputの使い方)


スポンサーリンク

社会人はちゃんと休みがあっていい
けど、平日は何もできない

前回の記事はこちら
mozyanari.hatenablog.com


現在、川ロボに出るための基板とプログラムを作成していますが、プロポと通信するためにサーボ信号を読み取る必要があります
ですが、ネットを検索しても出てくるのはInput Captureを使用した例しかありませんでした
自分はCube MXでCombined Channelsで選択できるPWM Input on CHxでやりたかったので、調べてやってみました

今回参考にしたのは以下のSTの公式サンプルです
www.stmcu.jp

このサンプルは他の機能も動くサンプルが入っているので、割り込みの初期化、タイマーの起動方法などCubeMXでポチポチしただけでは動かないときに見るといいと思います

また、私は前回の記事のようにSTM32F303K8の自作ボードを使用しています
mozyanari.hatenablog.com

なので、STM32F3シリーズのリファレンスマニュアルも参考にしました
www.stmcu.jp

PWM Inputの動きについて

リファレンスマニュアルにどのようにPWM Inputが動いているかが分かる説明があります
f:id:masanari7430:20201229012914p:plain
f:id:masanari7430:20201229013222p:plain

結局、Input Captureと同じなんですね
Input Captureを読んでいくと以下の記述があります
f:id:masanari7430:20201229013114p:plain

つまり、TIMxのCCRxを読みに行けばタイマのカウント値が入っているので、タイマのカウントスピードからPWMのDuty比、周波数が割り出せそうです

CubeMXの設定

今回はTime15を使用してPWM Inputを行います
まずは、「Combined Channels」で「PWM Input on CH2」を有効にします
(CH1でも可)
f:id:masanari7430:20201229010839p:plain

そうすると、PA3がTIM15_CH2になります
(他のピンはPWM出力や、LEDデバックの為に使用しています)
f:id:masanari7430:20201229010957p:plain

次に、Configurationをいじりたいですが動くのを確認するのであればこのままで大丈夫です
f:id:masanari7430:20201229011108p:plain

※詳しく説明すると、PrescalerでClockConfigurationのAPB1を分周します
自分は0なので分周せず、8MHzそのまま使用します
Counter Periodでカウンタの最大値を決めます
この値が大きいほどカウンタがたまる時間を待つことが出来て、低周波数のPWMを測定できます
今回の自分の場合は、8*10^6/65535=122HzまでのPWMを観測できます
詳しくは以下のページに乗っています
controllerstech.blogspot.com

これでCubeMXの準備は完了です

プログラム

初期化を追加

ここが最大の難関でした
先ほどあったようにTIM15のCCR1とCCR2を読みに行けばカウント値が入るはずなのですが動かしてもCubeMXの初期化だけでは何も動きませんでした
そこでサンプルを見てみるとCubeMXの初期化にはない以下の関数を見つけました
f:id:masanari7430:20201229013738p:plain
(これはサンプルの「STM32F3-Discovery」→「Examples」→「TIM」→「TIM_InputCapture」にあります)

なので以下のようにmain分のTIM15の初期化の下のユーザコードに書きます
f:id:masanari7430:20201229013949p:plain

(ここで行われているのは割り込みの初期化です
割り込みの初期化なんか関係あるのかと思っていましたが、InputCaptureの説明の箇所に割り込み発生時のカウントをCCRに格納しているらしいので割り込みが必要になります)

タイマのカウント値を確認

これで初期化が出来たのでPWMのパルスに応じて変化するかを確認します
今回はPWM周波数1kHzで幅を50%→30%→10%と変化させて値が変化するかを確認します
main文に以下のようなプログラムを書きます
f:id:masanari7430:20201229014602p:plain

PWMのパルス幅を変化させてその後、TIM15のCCR1とCCR2の値をデバッカで確認します

f:id:masanari7430:20201229014822p:plain
f:id:masanari7430:20201229014849p:plain
f:id:masanari7430:20201229014918p:plain

CCR2は8000の値で固定されています
これは、タイマのカウント8Mhzなので、8*10^6/8*10^3=1kHzでPWMの周波数と一致しています
また、CCR1は4000→2400→800となっています
これはPWMのduty比を50%→30%→10%と変化させているので一致しています

これでPWM Inputは使えそうです
ただ、これが完成した後に複数のPWMを同期的に取得する必要があることが分かったので、結局Input Captureを使用することになりそうです・・・・

自分用追記
今回はPA3を受信用のピンとしているので、TIM15のCH2がタイマのリセットタイミングとなっている
そのため、自分の直感に沿っている設定方法としては、CH2立ち上がりに設定する

プロポで実際に受信するときの記事を書きました
mozyanari.hatenablog.com