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.
FtEncoder.cpp@2:1bf9f7b6bf29, 2013-03-25 (annotated)
- Committer:
- humlet
- Date:
- Mon Mar 25 21:08:56 2013 +0000
- Revision:
- 2:1bf9f7b6bf29
- Parent:
- 1:9e595056c3da
introduction of NeedfulThings lib
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| humlet | 0:8cb1142a88d5 | 1 | #include "FtEncoder.h" |
| humlet | 0:8cb1142a88d5 | 2 | |
| humlet | 0:8cb1142a88d5 | 3 | FtEncoder::FtEncoder(PinName pwm, unsigned int standStillTimeout) |
| humlet | 1:9e595056c3da | 4 | :m_encIRQ(pwm), |
| humlet | 1:9e595056c3da | 5 | m_cnt(0), |
| humlet | 1:9e595056c3da | 6 | m_standStillTimeout(standStillTimeout), |
| humlet | 1:9e595056c3da | 7 | m_cursor(0) |
| humlet | 0:8cb1142a88d5 | 8 | { |
| humlet | 1:9e595056c3da | 9 | // initialize the edge timestamp ringbuffer |
| humlet | 0:8cb1142a88d5 | 10 | unsigned int tmStmp = getCurrentTimeStamp() - c_nTmStmps * m_standStillTimeout; |
| humlet | 1:9e595056c3da | 11 | for(int i=0; i<c_nTmStmps; ++i) |
| humlet | 0:8cb1142a88d5 | 12 | m_timeStamps[i] = tmStmp + i*m_standStillTimeout; |
| humlet | 0:8cb1142a88d5 | 13 | m_cursor = c_nTmStmps-1; |
| humlet | 0:8cb1142a88d5 | 14 | |
| humlet | 1:9e595056c3da | 15 | m_encIRQ.mode(PullUp); // set it to pullup, but an external pullup is needed, the internal isn't sufficient |
| humlet | 0:8cb1142a88d5 | 16 | m_encIRQ.rise(this, &FtEncoder::encoderISR); |
| humlet | 0:8cb1142a88d5 | 17 | m_encIRQ.fall(this, &FtEncoder::encoderISR); |
| humlet | 1:9e595056c3da | 18 | m_tmOut.attach_us(this, &FtEncoder::timeoutISR, m_standStillTimeout); |
| humlet | 0:8cb1142a88d5 | 19 | } |
| humlet | 0:8cb1142a88d5 | 20 | |
| humlet | 0:8cb1142a88d5 | 21 | unsigned int FtEncoder::getLastPeriod() const |
| humlet | 0:8cb1142a88d5 | 22 | { |
| humlet | 0:8cb1142a88d5 | 23 | unsigned int period = 0; |
| humlet | 0:8cb1142a88d5 | 24 | unsigned int cursor, cnt; |
| humlet | 0:8cb1142a88d5 | 25 | do { |
| humlet | 0:8cb1142a88d5 | 26 | cursor = m_cursor; |
| humlet | 0:8cb1142a88d5 | 27 | cnt = m_cnt; |
| humlet | 0:8cb1142a88d5 | 28 | period = m_timeStamps[m_cursor] - m_timeStamps[(m_cursor-2)&(c_nTmStmps-1)]; |
| humlet | 1:9e595056c3da | 29 | } while(cursor!=m_cursor || cnt!=m_cnt); // stay in loop until we have a non intrrupted reading |
| humlet | 0:8cb1142a88d5 | 30 | return period; |
| humlet | 0:8cb1142a88d5 | 31 | } |
| humlet | 0:8cb1142a88d5 | 32 | |
| humlet | 0:8cb1142a88d5 | 33 | float FtEncoder::getSpeed() const |
| humlet | 0:8cb1142a88d5 | 34 | { |
| humlet | 0:8cb1142a88d5 | 35 | unsigned int period = getLastPeriod(); |
| humlet | 0:8cb1142a88d5 | 36 | return (period!=0 && period<m_standStillTimeout) ? |
| humlet | 0:8cb1142a88d5 | 37 | c_speedFactor/period : 0.0; |
| humlet | 0:8cb1142a88d5 | 38 | } |
| humlet | 0:8cb1142a88d5 | 39 | |
| humlet | 0:8cb1142a88d5 | 40 | void FtEncoder::encoderISR() |
| humlet | 0:8cb1142a88d5 | 41 | { |
| humlet | 0:8cb1142a88d5 | 42 | ++m_cursor; |
| humlet | 0:8cb1142a88d5 | 43 | m_cursor &= c_nTmStmps-1; |
| humlet | 0:8cb1142a88d5 | 44 | m_timeStamps[m_cursor] = getCurrentTimeStamp(); |
| humlet | 1:9e595056c3da | 45 | // restart the timeout |
| humlet | 2:1bf9f7b6bf29 | 46 | m_tmOut.remove(); |
| humlet | 2:1bf9f7b6bf29 | 47 | m_tmOut.insert(m_timeStamps[m_cursor]+m_standStillTimeout); |
| humlet | 1:9e595056c3da | 48 | ++m_cnt; |
| humlet | 0:8cb1142a88d5 | 49 | m_callBack.call(); |
| humlet | 1:9e595056c3da | 50 | } |
| humlet | 1:9e595056c3da | 51 | |
| humlet | 1:9e595056c3da | 52 | void FtEncoder::timeoutISR(){ |
| humlet | 1:9e595056c3da | 53 | --m_cnt; |
| humlet | 1:9e595056c3da | 54 | encoderISR(); |
| humlet | 0:8cb1142a88d5 | 55 | } |