理系的な戯れ

理工学系とくにロボットやドローンに関する計算・プログラミング等の話題を扱って、そのようなことに興味がある人たちのお役に立てればと思っております。

STM32でエンコーダパルスのアップダウンカウント

はじめに

みなさんこんにちは、こうへいです。

昨日は、旧知のご夫婦と新年会をして美味しいお酒を飲みました。理系的な活動はおやすみでした。 (仕事では常に理系的なはずですが、それ以外の仕事も結構あります・・)

今回はエンコーダのパルスでアップダウンカウントができるようになることを目指します。

STM32のタイマ・カウンタ TIM

モータの角速度を計測するには一定の周期でカウント値を読み取り前後のカウント値の 差より求める方法と、パルスとパルスの間の時間を測る方法及びそれらを二つ合わせる方法があります。

これらを実現するためには入力されたパルスを数えるカウンタが必要です。 また、時間を測るにはタイマーが必要です。カウンターの値が決まった一定時間ごとに増えると 、カウンターの値は経過時間を示すことになり、マイコンのカウンタとはタイマーの役割を果たします。

使ってるSTM32F446にどんなタイマがあるのか調べたら、いろいろあるのがわかりました。

f:id:kouhei_ito:20200109204636p:plain
STM32のタイマ(TIM)

16ビットカウンタのTIM3,TIM4、32ビットタイマのTIM2,TIM5を使えば良さそうです。

TIM3を使うことにして、TIM32CubeMXでスケルトンコードを生成します。

f:id:kouhei_ito:20200111161212p:plain
STM32CubeMXの画面

EncoderModeを図の様にすると4逓(てい)倍でカウントします。4逓倍はパルスの立ち上がり、立ち下がりどちらの場合でもカウントします。 エンコーダのAチャンネルとBチャンネルは位相が4分の1周期分ずれているので、1周期の間に4カウントします。エンコーダの仕様に書かれている パルス数の4倍のカウントを1周で得られます。

1724モータピンアサイ

f:id:kouhei_ito:20200109212831p:plain
1724モータのピンアサイ

1724モータのケーブルは上図のようになっているので、 モータのエンコーダ出力とSTM32F446REのPA6とPA7とチャンネルA,Bを接続します。 下図はNUCLEO-F446REボードのピン配置です。

f:id:kouhei_ito:20200111165335p:plain
NUCLEO-F446REボードピン配置

NUCLEO-F446ボード上ではD12ピンとD11ピン又はCN10の13番と15番に接続すれば良いことがわかります。

エンコーダの電源もNUCLEOボードの5VとGNDからとって接続しました。

f:id:kouhei_ito:20200111220003j:plainf:id:kouhei_ito:20200111220009j:plainf:id:kouhei_ito:20200111220015j:plain
モータ(エンコーダ)との接続

HALライブラリを使ったエンコーダー読み取りコード

ハードの準備ができたら、コードを書きます。「STM32 エンコーダ」等でぐぐるとたくさんの情報があります。 STM32CubeMXの生成したコードとHALライブラリを使うと本当に簡単に動くコードを実現できて楽ですね。

さて、カウンタをスタートしてエンコーダのパルスでカウンタがアップダウンするようにしたら、カウンタの値を読み取れれば良いのですが 必要なコードは以下のようになります。

//TIM3をエンコーダ読み取りに使う場合のコード

//カウンタのスタート
HAL_TIM_Encoder_Start( &htim3, TIM_CHANNEL_ALL ); //エンコーダ読み取りをスタートする。

//カウント値の読み取り
enc_counter=TIM3->CNT; //カウント値をenc_counterと言う変数に代入する。

おわりに

以上で、エンコーダの読み取りができるようになりました。 着実に前進できているのと、今のところ、ほとんどつまづかずにこれてよかったです。

ネットの情報が豊富で本当に感謝しています。

次回はタイマ割り込みで周期的にエンコーダの値を取得したいと思います。

モータ速度を取得する実験まであともう少しです。