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.
Fork of ISR_Mini-explorer by
Encoder.cpp@4:560d24c0e5f8, 2018-04-19 (annotated)
- Committer:
- fabiofaria
- Date:
- Thu Apr 19 15:35:29 2018 +0000
- Revision:
- 4:560d24c0e5f8
- Parent:
- 1:8569ac717e68
Initial commit.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ISR | 1:8569ac717e68 | 1 | #include "Encoder.h" |
| ISR | 1:8569ac717e68 | 2 | #include "mbed.h" |
| ISR | 1:8569ac717e68 | 3 | |
| ISR | 1:8569ac717e68 | 4 | /** Create Encoder instance, initializing it. */ |
| ISR | 1:8569ac717e68 | 5 | Encoder::Encoder(I2C* i2c_in, Mutex* mutex_in, char invert_in) : |
| ISR | 1:8569ac717e68 | 6 | _i2c(i2c_in), |
| ISR | 1:8569ac717e68 | 7 | _mutex(mutex_in) |
| ISR | 1:8569ac717e68 | 8 | { |
| ISR | 1:8569ac717e68 | 9 | prev_L = readAbsolute(); |
| ISR | 1:8569ac717e68 | 10 | total_L = 0; |
| ISR | 1:8569ac717e68 | 11 | _invert = invert_in; |
| ISR | 1:8569ac717e68 | 12 | }; |
| ISR | 1:8569ac717e68 | 13 | |
| ISR | 1:8569ac717e68 | 14 | /** Read encoder raw data (absolute value) */ |
| ISR | 1:8569ac717e68 | 15 | long int Encoder::readAbsolute() |
| ISR | 1:8569ac717e68 | 16 | { |
| ISR | 1:8569ac717e68 | 17 | int addr = 0x6C; |
| ISR | 1:8569ac717e68 | 18 | char send[5]; |
| ISR | 1:8569ac717e68 | 19 | char receive[5]; |
| ISR | 1:8569ac717e68 | 20 | |
| ISR | 1:8569ac717e68 | 21 | send[0] = 0x0E; |
| ISR | 1:8569ac717e68 | 22 | |
| ISR | 1:8569ac717e68 | 23 | _mutex->lock(); |
| ISR | 1:8569ac717e68 | 24 | _i2c->write(addr, send, 1); |
| ISR | 1:8569ac717e68 | 25 | _i2c->read(addr, receive, 2); |
| ISR | 1:8569ac717e68 | 26 | _mutex->unlock(); |
| ISR | 1:8569ac717e68 | 27 | |
| ISR | 1:8569ac717e68 | 28 | short int val1 = receive[0]; |
| ISR | 1:8569ac717e68 | 29 | short int val2 = receive[1]; |
| ISR | 1:8569ac717e68 | 30 | val1 = (val1 & 0xf)*256; |
| ISR | 1:8569ac717e68 | 31 | long int result = (val2 + val1); |
| ISR | 1:8569ac717e68 | 32 | return result; |
| ISR | 1:8569ac717e68 | 33 | } |
| ISR | 1:8569ac717e68 | 34 | |
| ISR | 1:8569ac717e68 | 35 | long int Encoder::incremental() |
| ISR | 1:8569ac717e68 | 36 | { |
| ISR | 1:8569ac717e68 | 37 | short int next_L; |
| ISR | 1:8569ac717e68 | 38 | short int dif; |
| ISR | 1:8569ac717e68 | 39 | |
| ISR | 1:8569ac717e68 | 40 | next_L = readAbsolute(); // Reads curent value of the encoder |
| ISR | 1:8569ac717e68 | 41 | |
| ISR | 1:8569ac717e68 | 42 | // !!! verificar: para ser correcto deve-se escrever a inversão ao contrário e trocar tb nos encoders. |
| ISR | 1:8569ac717e68 | 43 | if(_invert == 1) |
| ISR | 1:8569ac717e68 | 44 | dif = next_L-prev_L; |
| ISR | 1:8569ac717e68 | 45 | else |
| ISR | 1:8569ac717e68 | 46 | dif = -next_L + prev_L; // Calculates the diference from last reading |
| ISR | 1:8569ac717e68 | 47 | |
| ISR | 1:8569ac717e68 | 48 | if(dif > 3000) { // Going back and pass zero |
| ISR | 1:8569ac717e68 | 49 | total_L = total_L - 4096 + dif; |
| ISR | 1:8569ac717e68 | 50 | } |
| ISR | 1:8569ac717e68 | 51 | if(dif < 3000 && dif > 0) { // Going front |
| ISR | 1:8569ac717e68 | 52 | total_L = total_L + dif; |
| ISR | 1:8569ac717e68 | 53 | } |
| ISR | 1:8569ac717e68 | 54 | if(dif < -3000) { // Going front and pass zero |
| ISR | 1:8569ac717e68 | 55 | total_L = total_L + 4096 + dif; |
| ISR | 1:8569ac717e68 | 56 | } |
| ISR | 1:8569ac717e68 | 57 | if(dif > -3000 && dif < 0) { // going back |
| ISR | 1:8569ac717e68 | 58 | total_L = total_L + dif; |
| ISR | 1:8569ac717e68 | 59 | } |
| ISR | 1:8569ac717e68 | 60 | prev_L = next_L; // Sets last reading for next iteration |
| ISR | 1:8569ac717e68 | 61 | |
| ISR | 1:8569ac717e68 | 62 | return total_L; |
| ISR | 1:8569ac717e68 | 63 | } |
| ISR | 1:8569ac717e68 | 64 | |
| ISR | 1:8569ac717e68 | 65 | long int Encoder::readIncrementalValue() |
| ISR | 1:8569ac717e68 | 66 | { |
| ISR | 1:8569ac717e68 | 67 | return total_L; |
| ISR | 1:8569ac717e68 | 68 | } |
