エンコーダの回転速度測定【STM32 Nucleo】
STM32のタイマには外部パルスを計測する機能があります。ロボット等のアクチュエータには位置、速度を検知するセンサとしてエンコーダがよく使われるのですが、エンコーダから回転速度に応じて変化するパルスを計測する方法を紹介します。
パルス速度は単位時間当たりのカウント数のことですので外部パルスをカウントできる機能を使えればよいわけです。
今回のアプリケーションで使用するエンコーダはオープンコレクタ出力タイプ仕様のものです。オープンコレクタの出力はトランジスタのコレクタが出力端子のタイプでコレクタ、エミッタも開放状態の無電圧接点です。マイコンに接続するにはコレクタ側をプルアップし、エミッタ側はGNDとします。
エンコーダパルスをSTM32で計測(カウント)するにはペリフェラルのタイマに入力として接続します。下記に接続例を示しますが、速度計測にはエンコーダ出力の2相のうち1つだけを使用します。STM32の外部パルス計測機能を使用するにはタイマのCH1とCH2だけで使用できます。
実際のプログラムでの設定を解説していきます。
目的:TIM3のCH1へプルアップ入力したエンコーダパルスを単位時間毎にカウントする
■ プルアップ入力に設定したタイマTIM3のチャネルCH1(PA6)を使用
■ 外部クロックモードに設定して、アップカウントする
■ 一定期間ごとに(RTOSを使うと便利)カウント値を取得してから、カウントをリセットする
GPIOおよびタイマTIM3の初期設定
GPIO設定ではエンコーダのオープンコレクタ出力をTIM3のCH1にプルアップ接続します。
TIM3設定ではアップカウントに設定しておきます。TIM.Periodにはカウント値がオーバーフローしない程度の値にしておきます。
外部クロックモードに設定するにはTIM_TIxExternalClockConfig()関数を使用します。
この関数の使い方詳細は「タイマ・カウンタ【STM32の高機能・汎用タイマ詳細】」の「タイマの応用」で解説していますので参照してください。
単位時間毎にカウント値取得
カウント値を取得するにはTIM_GetCounter(TIMx)を使います。引数は設定対象タイマTIM3などを指定します。
このアプリケーション例ではRTOSを使用して100ms毎にカウント値を取得してからリセットしています。シリアル通信によりパルス速度値としてモニターさせているのですが、パルス速度は1secあたりに換算しているものです。エンコーダの分解能180p/rの場合は1秒間にちょうど1回転の速度で回転させてみるとパルス速度値は180となっていれば成功です。
エンコーダの速度がわかれば、少し高度になりますが、フィードバックすることで厳密な速度コントロールができるようになります。モーションコントロールの基本ですので挑戦してみてください。
STM32でのエンコーダ高速パルスカウンタに関しましてはタイマ・カウンタ【STM32の高機能・汎用タイマ詳細】の外部高速クロックカウンタ-外部クロックモードで解説しています。