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.
Dependencies: mbed FastIO FastPWM USBDevice
potSensor.h@53:9b2611964afc, 2016-04-22 (annotated)
- Committer:
- mjr
- Date:
- Fri Apr 22 17:58:35 2016 +0000
- Revision:
- 53:9b2611964afc
- Parent:
- 52:8298b2a73eb2
Save some debugging instrumentation to be removed for release
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mjr | 17:ab3cec0c8bf4 | 1 | // Potentiometer plunger sensor |
| mjr | 17:ab3cec0c8bf4 | 2 | // |
| mjr | 17:ab3cec0c8bf4 | 3 | // This file implements our generic plunger sensor interface for a |
| mjr | 43:7a6364d82a41 | 4 | // potentiometer. The potentiometer resistance must be linear in |
| mjr | 43:7a6364d82a41 | 5 | // position. To connect physically, wire the fixed ends of the |
| mjr | 43:7a6364d82a41 | 6 | // potentiometer to +3.3V and GND (respectively), and connect the |
| mjr | 43:7a6364d82a41 | 7 | // wiper to an ADC-capable GPIO pin on the KL25Z. The wiper voltage |
| mjr | 43:7a6364d82a41 | 8 | // that we read on the ADC will vary linearly with the wiper position. |
| mjr | 43:7a6364d82a41 | 9 | // Mechanically attach the wiper to the plunger so that the wiper moves |
| mjr | 43:7a6364d82a41 | 10 | // in lock step with the plunger. |
| mjr | 43:7a6364d82a41 | 11 | // |
| mjr | 43:7a6364d82a41 | 12 | // Although this class is nominally for potentiometers, it will also |
| mjr | 43:7a6364d82a41 | 13 | // work with any other type of sensor that provides a single analog |
| mjr | 43:7a6364d82a41 | 14 | // voltage level that maps linearly to the position, such as an LVDT. |
| mjr | 17:ab3cec0c8bf4 | 15 | |
| mjr | 17:ab3cec0c8bf4 | 16 | |
| mjr | 35:e959ffba78fd | 17 | class PlungerSensorPot: public PlungerSensor |
| mjr | 17:ab3cec0c8bf4 | 18 | { |
| mjr | 17:ab3cec0c8bf4 | 19 | public: |
| mjr | 35:e959ffba78fd | 20 | PlungerSensorPot(PinName ao) : pot(ao) |
| mjr | 17:ab3cec0c8bf4 | 21 | { |
| mjr | 48:058ace2aed1d | 22 | // start our sample timer with an arbitrary zero point of now |
| mjr | 48:058ace2aed1d | 23 | timer.start(); |
| mjr | 53:9b2611964afc | 24 | totScanTime = 0; |
| mjr | 53:9b2611964afc | 25 | nScans = 0; |
| mjr | 17:ab3cec0c8bf4 | 26 | } |
| mjr | 17:ab3cec0c8bf4 | 27 | |
| mjr | 35:e959ffba78fd | 28 | virtual void init() |
| mjr | 17:ab3cec0c8bf4 | 29 | { |
| mjr | 17:ab3cec0c8bf4 | 30 | } |
| mjr | 17:ab3cec0c8bf4 | 31 | |
| mjr | 48:058ace2aed1d | 32 | // read the sensor |
| mjr | 48:058ace2aed1d | 33 | virtual bool read(PlungerReading &r) |
| mjr | 17:ab3cec0c8bf4 | 34 | { |
| mjr | 48:058ace2aed1d | 35 | // get the starting time of the sampling |
| mjr | 48:058ace2aed1d | 36 | uint32_t t0 = timer.read_us(); |
| mjr | 48:058ace2aed1d | 37 | |
| mjr | 23:14f8c5004cd0 | 38 | // Take a few readings and use the average, to reduce the effect |
| mjr | 23:14f8c5004cd0 | 39 | // of analog voltage fluctuations. The voltage range on the ADC |
| mjr | 23:14f8c5004cd0 | 40 | // is 0-3.3V, and empirically it looks like we can expect random |
| mjr | 23:14f8c5004cd0 | 41 | // voltage fluctuations of up to 50 mV, which is about 1.5% of |
| mjr | 23:14f8c5004cd0 | 42 | // the overall range. We try to quantize at about the mm level |
| mjr | 23:14f8c5004cd0 | 43 | // (in terms of the plunger motion range), which is about 1%. |
| mjr | 23:14f8c5004cd0 | 44 | // So 1.5% noise is big enough to be visible in the joystick |
| mjr | 23:14f8c5004cd0 | 45 | // reports. Averaging several readings should help smooth out |
| mjr | 23:14f8c5004cd0 | 46 | // random noise in the readings. |
| mjr | 44:b5ac89b9cd5d | 47 | // |
| mjr | 44:b5ac89b9cd5d | 48 | // Readings through the standard AnalogIn class take about 30us |
| mjr | 47:df7a88cd249c | 49 | // each, so taking 5 readings takes about 150us. This is fast |
| mjr | 47:df7a88cd249c | 50 | // enough to resolve even the fastest plunger motiono with no |
| mjr | 47:df7a88cd249c | 51 | // aliasing. |
| mjr | 48:058ace2aed1d | 52 | r.pos = uint16_t(( |
| mjr | 47:df7a88cd249c | 53 | uint32_t(pot.read_u16()) |
| mjr | 47:df7a88cd249c | 54 | + uint32_t(pot.read_u16()) |
| mjr | 47:df7a88cd249c | 55 | + uint32_t(pot.read_u16()) |
| mjr | 47:df7a88cd249c | 56 | + uint32_t(pot.read_u16()) |
| mjr | 47:df7a88cd249c | 57 | + uint32_t(pot.read_u16()) |
| mjr | 47:df7a88cd249c | 58 | ) / 5U); |
| mjr | 48:058ace2aed1d | 59 | |
| mjr | 52:8298b2a73eb2 | 60 | // Get the elapsed time of the sample, and figure the indicated |
| mjr | 48:058ace2aed1d | 61 | // sample time as the midpoint between the start and end times. |
| mjr | 48:058ace2aed1d | 62 | // (Note that the timer might overflow the uint32_t between t0 |
| mjr | 48:058ace2aed1d | 63 | // and now, in which case it will appear that now < t0. The |
| mjr | 48:058ace2aed1d | 64 | // calculation will always work out right anyway, because it's |
| mjr | 48:058ace2aed1d | 65 | // effectively performed mod 2^32-1.) |
| mjr | 52:8298b2a73eb2 | 66 | uint32_t dt = timer.read_us() - t0; |
| mjr | 52:8298b2a73eb2 | 67 | r.t = t0 + dt/2; |
| mjr | 52:8298b2a73eb2 | 68 | |
| mjr | 52:8298b2a73eb2 | 69 | // add the current sample to our timing statistics |
| mjr | 52:8298b2a73eb2 | 70 | totScanTime += dt; |
| mjr | 52:8298b2a73eb2 | 71 | nScans += 1; |
| mjr | 48:058ace2aed1d | 72 | |
| mjr | 48:058ace2aed1d | 73 | // success |
| mjr | 17:ab3cec0c8bf4 | 74 | return true; |
| mjr | 17:ab3cec0c8bf4 | 75 | } |
| mjr | 52:8298b2a73eb2 | 76 | |
| mjr | 52:8298b2a73eb2 | 77 | // figure the average scan time in microseconds |
| mjr | 53:9b2611964afc | 78 | virtual uint32_t getAvgScanTime() |
| mjr | 53:9b2611964afc | 79 | { |
| mjr | 53:9b2611964afc | 80 | return nScans != 0 ? uint32_t(totScanTime/nScans) : 0; |
| mjr | 53:9b2611964afc | 81 | } |
| mjr | 23:14f8c5004cd0 | 82 | |
| mjr | 17:ab3cec0c8bf4 | 83 | private: |
| mjr | 48:058ace2aed1d | 84 | // analog input for the pot wiper |
| mjr | 23:14f8c5004cd0 | 85 | AnalogIn pot; |
| mjr | 48:058ace2aed1d | 86 | |
| mjr | 48:058ace2aed1d | 87 | // timer for input timestamps |
| mjr | 48:058ace2aed1d | 88 | Timer timer; |
| mjr | 52:8298b2a73eb2 | 89 | |
| mjr | 52:8298b2a73eb2 | 90 | // total sensor scan time in microseconds, and number of scans completed |
| mjr | 53:9b2611964afc | 91 | uint64_t totScanTime; |
| mjr | 52:8298b2a73eb2 | 92 | int nScans; |
| mjr | 17:ab3cec0c8bf4 | 93 | }; |