ロータリエンコーダを、TIM1/TIM2/TIM3/TIM4 でやる方法を比較する

ロータリエンコーダとは、ボリウムのような使われ方をする一種のスイッチです.
秋月電子でこのようなものを売ってます.


ロータリエンコーダには、軸を回すとオン/オフするスイッチが2ヶ入っていて、プルアップ抵抗をとりつけるとパルスが2ヶ出てきます.
この2ヶをA相B相と名付けると、軸の回転に伴って下図のような90度位相のパルスが出てきます.
2相パルスを利用すると、回転方向の識別ができます.



こちらのページでは、TIM1を使ってロータリエンコーダーを受信するプログラムについて解説しました.

では、TIM2,TIM3,TIM4 でもロータリエンコーダを受信することはできるでしょうか?

う~ん、そ、それがっ、すまぬ、出来そうにないんだっちゃ.

なぜか?

下記はTIM1によるロータリエンコーダ受信のキモのところのソースコードです.

TIM1_DeInit();
TIM1_EncoderInterfaceConfig(TIM1_ENCODERMODE_TI1, TIM1_ICPOLARITY_RISING, TIM1_ICPOLARITY_RISING);
TIM1_CounterModeConfig(TIM1_COUNTERMODE_CENTERALIGNED1);
TIM1_SetCounter(70);
TIM1_SetAutoreload(140);
TIM1->CCMR1 = ( (TIM1->CCMR1 & ~TIM1_CCMR_ICxF) | 15<<4 );
TIM1_SelectInputTrigger(TIM1_TS_TI1FP1);
TIM1_ITConfig(TIM1_IT_TRIGGER, ENABLE);
TIM1_Cmd(ENABLE);

同じソースコードをTIM2について書きたいわけですが、赤字の関数がライブラリに存在しません.

これらが、本来はTIM2にも同等のハードウエアが備わっていながら、ライブラリに関数が用意されていないだけなのかと勘ぐりたくなりますが、そうではなさそうです.
TIM1_EncoderInterfaceConfig() の中で、TIM1_SMCRというカウンタのリセット操作に関するレジスタを操作しています.
しかし、TIM2には同等のレジスタがないのです.

ということは、TIM2 ではロータリエンコーダを受信する機能がないということを意味していると強く推察されます.
TIM2よりも機能の劣るTIM3やTIM4でも出来ないのはいわずもがなと思われます.


というわけで、このテーマはあえなく撤退といたしやす.

inserted by FC2 system