Dependents: serial_connected_mcu_nucleo rotary_encoder_mbed serial_connected_mcu_nucleo omuni_speed_pid ... more
Fork of rotary_encoder by
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は同じ周期しか使えず、同じタイマで同じチャンネルなら全く同じ出力しか出せない。
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
TIM1 | TIM2 | TIM3 |
---|---|---|
D7, D8 | A0, A1 | D5, D4 |
例¶
<<code title=例 AB相 100P/R>>
- include "mbed.h"
- 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>>
- include "mbed.h"
- 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を計測する>>
- include "mbed.h"
- include "rotary_encoder_a_phase.hpp"
- 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>>