私は再び学習ノートを書きに戻ってきました。
以前、私は STM32 の新しい用語のまとめを書きました。その時はタイマーを学び始めたばかりでしたが、今はタイマーを学び終えたので、タイマーの使い方をまとめたいと思い、このブログが誕生しました。
記事に出てくる資料は江協動画のものです:
https://www.bilibili.com/video/BV1th411z7sn/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=e836ee461d07a48f2161731d0ca031f0
(一)タイマー割り込み#
タイマー割り込みとは、タイマーのカウントによって割り込みがトリガーされることを指します。
まず、クロックを有効にし、RCC_APB1PeriphClockCmd関数を使用します(何をするにもまずクロックを有効にする必要があります)。外部ピンを使用する場合は、RCC_APB2PeriphClockCmd関数でクロックを有効にし、GPIO_Initでピンを初期化する必要があります。
タイマーには 4 つのモードがあります:内部クロックモード、外部クロックモード 1 と 2、エンコーダモードです。タイマー割り込みを設定するには、この 4 つのモードの中から 1 つを選ぶ必要があります。外部割り込みモード 1 と 2 の違いは、モード 2 がイベント割り込みであり、プログラムの通常の実行を中断しないことです。
内部クロックを設定する関数はTIM_InternalClockConfigで、パラメータは設定するタイマーの名前だけです。
外部クロックモード 2 を設定する関数はTIM_ETRClockMode2Configで、パラメータにはタイマー名、タイマーのプリスケーラー、カウント方式(高レベルカウントまたは低レベルカウント)、フィルタが必要です。
外部クロックモード 1 を設定する関数はTIM_ETRClockMode1Configで、これは使用したことがなく、ネットで調べてもあいまいなので説明しません。
キャプチャチャネルを設定する関数はTIM_ICInitで、パラメータにはタイマー名と入力キャプチャ構造体のアドレスが必要です。構造体については後で説明します。
江科大の動画では、内部クロックモードと外部クロックモード 2 の 2 つのモードの使用方法が教えられています。
次に、タイムベースユニットを設定します。使用する関数はTIM_TimeBaseInitで、タイマー名とタイムベースユニット構造体のアドレスをパラメータとして指定します。
タイムベースユニット構造体には、主にプリスケーラー、カウント方式(通常は上向きカウント)、ARR および PSC レジスタの値(これらはそれぞれカウント周期とプリスケーラー)、および繰り返しカウンターが含まれています。私たちが学んでいるのは汎用タイマーであり、この機能はありません。
次に、TIM_ITConfigを使用して割り込みを有効にします。その前に、**TIM_ClearFlag (TIMx, TIM_FLAG_Update)** を使用して更新フラグをクリアする必要があります。なぜなら、TIM_TimeBaseInit関数の末尾で手動で更新イベントが発生したため、このフラグをクリアしないと、割り込みを有効にした後、すぐに 1 回の割り込みが発生してしまいます。
最後に、NVIC を設定します。NVIC_PriorityGroupConfigとNVIC_Initを使用して割り込みの順序を設定し、次にTIM_Cmdを使用してタイマーを有効にします。
(二)出力比較#
出力比較とは、PWM 波を出力することです(暴論ですが)、多くのモード選択がありますが、一般的には PWM モード 1 または 2 を直接使用します。
まず、同様にクロックを有効にし、RCC_APB1PeriphClockCmd関数を使用します。外部ピンを使用する場合は、RCC_APB2PeriphClockCmd関数でクロックを有効にし、GPIO_Initでピンを初期化する必要があります。
次に、TIM_InternalClockConfigを使用して内部クロックを設定します(実際には必要ありません、デフォルトで内部クロックです)。
次に、タイムベースユニットを設定します。前と同様です。
次に、TIM_OC1Initを使用してチャネル 1 の出力比較関数を設定します。ここでは、合計 4 つの出力比較チャネルがあり、それぞれ特定のピンに接続されています。ピン定義図を確認して選択する必要があります。この関数に必要なパラメータは、タイマー名と出力比較構造体で、構造体には設定するモード(PWM1 を選択すればよい)、出力極性、CCR の値が含まれています。CCR は出力比較レジスタで、カウンタ CNT と比較して高低レベルを出力します。
最後に、TIM_Cmdを使用してタイマーを有効にします。
もう一つ言及すべきは、TIM_SetCompare1関数です。これは CCR の値を変更するために使用されます。
(三)入力キャプチャ#
入力キャプチャとは、タイマーを使用して電流中の高低レベルをキャプチャし、入力周波数を計算することです。
前の 2 ステップは同様で、クロックを有効にし、タイムベースユニットを設定しますが、ここでは ARR を最大に引き上げてカウンタのオーバーフローを防ぐ必要がありますので、65535 に設定します。
次に、TIM_ICInitを呼び出して入力キャプチャモードを設定します(PWMI モードの場合はTIM_PWMIConfigを使用します)。必要なパラメータはチャネル(ここでは出力比較と同様に 4 つのチャネルがあり、それぞれ異なるピンに対応していますので、ピン定義図を確認して選択する必要があります)、フィルタ、入力極性、プリスケーラー、信号交差(これは PWMI モードで使用されますが、通常は直結を選択すればよいです)。
次に、TIM_SelectInputTriggerとTIM_SelectSlaveModeを使用してトリガソースとスレーブモードを選択します。
トリガソースの TI1FP1 と TI1FP2 はそれぞれチャネル 1 と 2 を示します(チャネル 3 と 4 は見当たらないのですが)。スレーブモードはリセット(Reset)を選択します。つまり、TI1 が上昇エッジを生成すると、CNT がゼロにリセットされます。
最後に、TIM_Cmdを使用してタイマーを有効にします。
言及すべき関数にはTIM_GetCapture1とTIM_GetCapture2があります。これらは CRR1 と CRR2 の読み取りを行い、通常モードでは両者がキャプチャされた周波数を示し、PWMI モードでは CRR1 がキャプチャ周波数、CRR2 が低レベルの周波数を示し、CRR2/CRR1 がデューティ比となります。
(四)エンコーダモード#
エンコーダモードは、エンコーダの出力周波数を測定するための専用モードで、チャネル 1 と 2 のみ使用できます。
エンコーダモードの設定は、入力キャプチャの設定方法と大体同じですが、エンコーダモードでは 2 つのピンが必要で、キャプチャチャネルもTIM_ICInitで 2 つ設定する必要があります。
次に、TIM_EncoderInterfaceConfigを使用してエンコーダモードを設定します。必要なパラメータはタイマー名、TI1 と TI2 のどちらでカウントするか(TI12 を選択すればよいです。他の 2 つの設定が何のためかはわかりません)、2 つの極性(ここでの極性は反転するかどうかを意味します。エンコーダの回転カウント方向を変更したい場合は、1 つの極性を変更すればよいです)。
最後に、TIM_Cmdを使用してタイマーを有効にします。
私たちはTIM_GetCounter関数を使用してエンコーダの値を読み取ることができます。
これで学んだタイマーの使い方はこれだけです。ブログを書く前は自分がほとんど理解していると思っていましたが、実際に書いてみると理解が浅すぎたことに気づきました。また、急いで書いたので、間違っているところがないか心配です。