Ryosuke Matsushima / Encoder

Dependents:   TUKUBAMotorDriver

Committer:
ryosukenanoda
Date:
Wed Dec 30 17:29:45 2020 +0000
Revision:
1:c44f4aa7a45d
Parent:
0:82c1b12a0041
Child:
2:36572948b0d4
add stop_checker

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryosukenanoda 0:82c1b12a0041 1 #include "mbed.h"
ryosukenanoda 0:82c1b12a0041 2 #include "Encoder.h"
ryosukenanoda 0:82c1b12a0041 3
ryosukenanoda 0:82c1b12a0041 4 Encoder::Encoder(PinName pin_A, PinName pin_B): _pin_A(pin_A), _pin_B(pin_B) {
ryosukenanoda 0:82c1b12a0041 5 max_time = 2^30; //mbet can count only 30 minits --- https://os.mbed.com/handbook/Timer
ryosukenanoda 0:82c1b12a0041 6 dt_to_raito = 2 * PI / (RESOLUTION_COUNT * GEAR_RAITO); // dt_to_raito / dt = raito
ryosukenanoda 0:82c1b12a0041 7 timer.start();
ryosukenanoda 0:82c1b12a0041 8 _pin_A.rise(callback(this, &Encoder::did_rise));
ryosukenanoda 0:82c1b12a0041 9 };
ryosukenanoda 0:82c1b12a0041 10
ryosukenanoda 0:82c1b12a0041 11 float Encoder::get_raito() {
ryosukenanoda 0:82c1b12a0041 12 return raito;
ryosukenanoda 0:82c1b12a0041 13 };
ryosukenanoda 0:82c1b12a0041 14
ryosukenanoda 0:82c1b12a0041 15 void Encoder::did_rise() {
ryosukenanoda 0:82c1b12a0041 16 int now_time = timer.read_us();
ryosukenanoda 0:82c1b12a0041 17 if( false ) { //TODO: reset timer if time_maxmum
ryosukenanoda 0:82c1b12a0041 18 last_time = 0;
ryosukenanoda 0:82c1b12a0041 19 timer.reset();
ryosukenanoda 0:82c1b12a0041 20 return;
ryosukenanoda 0:82c1b12a0041 21 }
ryosukenanoda 1:c44f4aa7a45d 22 int dt = now_time - last_time;
ryosukenanoda 1:c44f4aa7a45d 23 stop_checker.attach(callback(this, &Encoder::check_stop), 0.01);
ryosukenanoda 1:c44f4aa7a45d 24 update_raito(dt);
ryosukenanoda 0:82c1b12a0041 25 last_time = now_time;
ryosukenanoda 0:82c1b12a0041 26 };
ryosukenanoda 0:82c1b12a0041 27
ryosukenanoda 0:82c1b12a0041 28 void Encoder::update_raito(int dt) {
ryosukenanoda 0:82c1b12a0041 29 float t = dt;
ryosukenanoda 0:82c1b12a0041 30 t /= pow(10.0, 6.0);
ryosukenanoda 0:82c1b12a0041 31 raito = dt_to_raito / t * direction();
ryosukenanoda 0:82c1b12a0041 32 };
ryosukenanoda 0:82c1b12a0041 33
ryosukenanoda 0:82c1b12a0041 34 float Encoder::direction() {
ryosukenanoda 0:82c1b12a0041 35 if (_pin_B) {
ryosukenanoda 1:c44f4aa7a45d 36 return -1;
ryosukenanoda 0:82c1b12a0041 37 } else {
ryosukenanoda 1:c44f4aa7a45d 38 return 1;
ryosukenanoda 0:82c1b12a0041 39 }
ryosukenanoda 1:c44f4aa7a45d 40 };
ryosukenanoda 1:c44f4aa7a45d 41
ryosukenanoda 1:c44f4aa7a45d 42 void Encoder::check_stop() {
ryosukenanoda 1:c44f4aa7a45d 43 int now_time = timer.read_us();
ryosukenanoda 1:c44f4aa7a45d 44 if ( (now_time - last_time) > 10000 ) raito = 0.0;
ryosukenanoda 0:82c1b12a0041 45 };