Ryosuke Matsushima / Encoder

Dependents:   TUKUBAMotorDriver

Committer:
ryosukenanoda
Date:
Mon Jan 25 14:26:30 2021 +0000
Revision:
2:36572948b0d4
Parent:
1:c44f4aa7a45d
Child:
3:cf7ae37c6930
noise check in encoder

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 2:36572948b0d4 22 for (int i = 0; i < 3; i++) {
ryosukenanoda 2:36572948b0d4 23 if (!_pin_A) {
ryosukenanoda 2:36572948b0d4 24 wait_us(10);
ryosukenanoda 2:36572948b0d4 25 return;
ryosukenanoda 2:36572948b0d4 26 }
ryosukenanoda 2:36572948b0d4 27 }
ryosukenanoda 1:c44f4aa7a45d 28 int dt = now_time - last_time;
ryosukenanoda 1:c44f4aa7a45d 29 stop_checker.attach(callback(this, &Encoder::check_stop), 0.01);
ryosukenanoda 1:c44f4aa7a45d 30 update_raito(dt);
ryosukenanoda 0:82c1b12a0041 31 last_time = now_time;
ryosukenanoda 0:82c1b12a0041 32 };
ryosukenanoda 0:82c1b12a0041 33
ryosukenanoda 0:82c1b12a0041 34 void Encoder::update_raito(int dt) {
ryosukenanoda 0:82c1b12a0041 35 float t = dt;
ryosukenanoda 0:82c1b12a0041 36 t /= pow(10.0, 6.0);
ryosukenanoda 0:82c1b12a0041 37 raito = dt_to_raito / t * direction();
ryosukenanoda 0:82c1b12a0041 38 };
ryosukenanoda 0:82c1b12a0041 39
ryosukenanoda 0:82c1b12a0041 40 float Encoder::direction() {
ryosukenanoda 0:82c1b12a0041 41 if (_pin_B) {
ryosukenanoda 1:c44f4aa7a45d 42 return -1;
ryosukenanoda 0:82c1b12a0041 43 } else {
ryosukenanoda 1:c44f4aa7a45d 44 return 1;
ryosukenanoda 0:82c1b12a0041 45 }
ryosukenanoda 1:c44f4aa7a45d 46 };
ryosukenanoda 1:c44f4aa7a45d 47
ryosukenanoda 1:c44f4aa7a45d 48 void Encoder::check_stop() {
ryosukenanoda 1:c44f4aa7a45d 49 int now_time = timer.read_us();
ryosukenanoda 1:c44f4aa7a45d 50 if ( (now_time - last_time) > 10000 ) raito = 0.0;
ryosukenanoda 0:82c1b12a0041 51 };