Dependents:   serial_connected_mcu_nucleo rotary_encoder_mbed serial_connected_mcu_nucleo omuni_speed_pid ... more

Fork of rotary_encoder by tarou yamada

You are viewing an older revision! See the latest version

rotary_encoder

はじめに

このライブラリはSTM32のハードウェアの機能を使って、インクリメンタル形のロータリーエンコーダからA相およびAB相で回転情報を得ることを可能にする。

Warning

動作確認済 F401

動作未確認 F030 F103 F302 F334 F446 L151 L152 L476


使用方法

rotary_encoder_ab_phase(TIM_TypeDef* timer_type, size_t pulse_per_revol)
rotary_encoder_a_phase(TIM_TypeDef* timer_type, size_t pulse_per_revol)
timer_type : TIM + タイマの番号
例) Timer1 : TIM1
pulse_per_revol : エンコーダのP/R(1回転当たりのパルス数)
 コンストラクタでは使用するタイマとエンコーダのP/Rを指定しなければならない。

Warning

 ここで指定するタイマは他のことに使用できなくなる。特にPWM機能で気づかずに同じタイマを使ってしまうことがあるため注意が必要である。
 PWMでどのタイマがどのピンに対応しているのかは下の画像のPWM1/3という書式で書かれているところの分数の部分を見れば分かる。分子が何番のタイマを使っているのかを表していて、分母がチャンネルを表している。ちなみに同じタイマのPWMは同じ周期しか使えず、同じタイマで同じチャンネルなら全く同じ出力しか出せない。
nucleo f401 pinout


void start()
 エンコーダの回転状態の計測を開始する。

void stop()
 エンコーダの回転状態の計測を停止する。値は失われない。

void reset()
 エンコーダの回転状態の記録を初期化する。計測は停止しない。

int32_t get_counts() const
 エンコーダが回転したことで起きたパルスの変化から回転状態を取得する。
 例えば100P/R のエンコーダをAB相で読むと分解能は4倍の400になる(A相だと2倍の200である)。そのときにこの関数を呼び出して400という値が得られたらそれはプラス方向に一回転したということであり、もし-400だったらマイナス方向に一回転したということである。

float get_revol_num() const
 get_counts() で得られた値を分解能で割った値、つまりエンコーダの回転数を返す。


ピンアサイン

https://developer.mbed.org/users/inst/code/nucleo_rotary_encoder/file/d1e6284a13ab/HAL_TIM_Encoder_MspInit
F4シリーズなら”HAL_TIM_Encoder_MspInit\EncoderMspInitF4.cpp"を参照。

F401

TIM1TIM2TIM3
D7, D8A0, A1D5, D4

<<code title=例 AB相 100P/R>>

  1. include "mbed.h"
  2. include "rotary_encoder_ab_phase.hpp"

int main() { rotary_encoder_ab_phase e(/* timer_type = */TIM3, /* pulse_per_revol = */100); e.start();

while (true) { printf("%d, %f\n", e.get_counts(), e.get_revol_num()); }

return 0; } <</code>>

<<code title=例 A相 100P/R>>

  1. include "mbed.h"
  2. include "rotary_encoder_a_phase.hpp"

int main() { rotary_encoder_a_phase e(/* timer_type = */TIM3, /* pulse_per_revol = */100); e.start();

while (true) { printf("%d, %f\n", e.get_counts(), e.get_revol_num()); }

return 0; } <</code>>

<<code title=A相、AB相 RPMを計測する>>

  1. include "mbed.h"
  2. include "rotary_encoder_a_phase.hpp"
  3. include "rotary_encoder_ab_phase.hpp"

int main() { const size_t encoder_num = 3; rotary_encoder* e[] = { new rotary_encoder_a_phase( /* timer_type = */TIM1, /* pulse_per_revol = */100), new rotary_encoder_ab_phase(/* timer_type = */TIM2, /* pulse_per_revol = */100), new rotary_encoder_ab_phase(/* timer_type = */TIM3, /* pulse_per_revol = */100) };

for (size_t i = 0; i < encoder_num; ++i) { e[i]->start(); }

const float t = 0.08f;

while (true) { for (size_t i = 0; i < encoder_num; ++i) { 回転数/秒 に60を掛けて 回転数/分 にする printf("%f, ", (e[i]->get_revol_num() / t) * 60.0f); e[i]->reset(); } printf("\n"); wait(t); }

return 0; } <</code>>


All wikipages