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@1:c44f4aa7a45d, 2020-12-30 (annotated)
- 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?
| 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 | 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 | }; |