Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Encoder.cpp@2:36572948b0d4, 2021-01-25 (annotated)
- 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?
| User | Revision | Line number | New 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 | }; |