Counts pulses on pin p29. Pulse frequency can be up to 48 MHz.
Example, counting 48MHz-pulses on pin p29 generated by pin p22 with PwmOscillator (https://mbed.org/users/geotec/code/PwmOscillator/). Pins p22 & p29 must be connected. Count is triggered when pin p30 = high (I connected oscillator with 9kHz that triggered periodically).
#include "mbed.h" #include "PwmOscillator.h" #include "PulseCounter.h" Serial usbPC(USBTX, USBRX); // sends log messages via USB to PC terminal PwmOscillator pulseGenerator; // generates pulses to be count (48 MHz) on pin p22. Connect this pin to p29 (counter input). PulseCounter pulseCounter; // counts the pulses on pin p29 between trigger events (= rising edges) on pin p30. int main() { usbPC.printf("---> start <---\n"); pulseGenerator.initWithFrequency(48000000); pulseCounter.init(); pulseGenerator.start(); pulseCounter.start(); wait(1); // waiting 1 second for trigger events (pin30: rising edge). Count pulses between trigger events. pulseCounter.stop(); pulseGenerator.stop(); // read & print pulseCounter results uint32_t pulseCounterResults[20]; pulseCounter.counterArray(&pulseCounterResults[0],sizeof pulseCounterResults / sizeof (uint32_t)); for(int i = 0; i < (sizeof pulseCounterResults / sizeof (uint32_t)); i++) { usbPC.printf("counter of trigger event %i = %u\n",i,pulseCounterResults[i]); } // usbPC.printf(" finished.\n"); }
PulseCounter.h@0:157c2fddaa68, 2012-12-15 (annotated)
- Committer:
- geotec
- Date:
- Sat Dec 15 14:26:47 2012 +0000
- Revision:
- 0:157c2fddaa68
- Child:
- 1:83149916f8a9
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
geotec | 0:157c2fddaa68 | 1 | #ifndef MBED_PULSECOUNTER_H |
geotec | 0:157c2fddaa68 | 2 | #define MBED_PULSECOUNTER_H |
geotec | 0:157c2fddaa68 | 3 | |
geotec | 0:157c2fddaa68 | 4 | #include "mbed.h" |
geotec | 0:157c2fddaa68 | 5 | |
geotec | 0:157c2fddaa68 | 6 | const int _pulseCountArrayLength = 20; |
geotec | 0:157c2fddaa68 | 7 | |
geotec | 0:157c2fddaa68 | 8 | /** Counts pulses on pin29 coming in with a frequency up to 48 MHz. The counter is read (and reset to 0) by rising edge (trigger event) on pin30. |
geotec | 0:157c2fddaa68 | 9 | * These events can be triggered at a rate up to 9kHz. The counter results are stored in a "circular array" of 20 elements. |
geotec | 0:157c2fddaa68 | 10 | * ("circular array" = array pointer increments each time a new value is stored into the array; if pointer reaches last element, it is redirected to first element) |
geotec | 0:157c2fddaa68 | 11 | * */ |
geotec | 0:157c2fddaa68 | 12 | class PulseCounter |
geotec | 0:157c2fddaa68 | 13 | { |
geotec | 0:157c2fddaa68 | 14 | public: |
geotec | 0:157c2fddaa68 | 15 | |
geotec | 0:157c2fddaa68 | 16 | /** Initializer for PulseCounter instance |
geotec | 0:157c2fddaa68 | 17 | */ |
geotec | 0:157c2fddaa68 | 18 | void init(); |
geotec | 0:157c2fddaa68 | 19 | |
geotec | 0:157c2fddaa68 | 20 | /** Start counter |
geotec | 0:157c2fddaa68 | 21 | */ |
geotec | 0:157c2fddaa68 | 22 | void start(); |
geotec | 0:157c2fddaa68 | 23 | |
geotec | 0:157c2fddaa68 | 24 | /** Stop counter |
geotec | 0:157c2fddaa68 | 25 | */ |
geotec | 0:157c2fddaa68 | 26 | void stop(); |
geotec | 0:157c2fddaa68 | 27 | |
geotec | 0:157c2fddaa68 | 28 | /** Read pulse count results into external array. Do not call this method before you called method stop() - otherwise it will return zeros. |
geotec | 0:157c2fddaa68 | 29 | * @param counterArray = Pointer to array in which the pulse count results should be read into. |
geotec | 0:157c2fddaa68 | 30 | * @param counterArrayLength = Size of counterArray. Should be 20 or less. If more than 20, remaining elements will be filled with zeros. |
geotec | 0:157c2fddaa68 | 31 | * @code #include "mbed.h" |
geotec | 0:157c2fddaa68 | 32 | #include "PwmOscillator.h" |
geotec | 0:157c2fddaa68 | 33 | #include "PulseCounter.h" |
geotec | 0:157c2fddaa68 | 34 | |
geotec | 0:157c2fddaa68 | 35 | Serial usbPC(USBTX, USBRX); // sends log messages via USB to PC terminal |
geotec | 0:157c2fddaa68 | 36 | PwmOscillator pulseGenerator; // generates pulses to be count (48 MHz) on pin p22. Connect this pin to p29 (counter input). |
geotec | 0:157c2fddaa68 | 37 | PulseCounter pulseCounter; // counts the pulses on pin p29 between trigger events (= rising edges) on pin p30. |
geotec | 0:157c2fddaa68 | 38 | |
geotec | 0:157c2fddaa68 | 39 | int main() |
geotec | 0:157c2fddaa68 | 40 | { |
geotec | 0:157c2fddaa68 | 41 | usbPC.printf("---> start <---\n"); |
geotec | 0:157c2fddaa68 | 42 | pulseGenerator.initWithFrequency(48000000); |
geotec | 0:157c2fddaa68 | 43 | pulseCounter.init(); |
geotec | 0:157c2fddaa68 | 44 | pulseGenerator.start(); |
geotec | 0:157c2fddaa68 | 45 | |
geotec | 0:157c2fddaa68 | 46 | pulseCounter.start(); |
geotec | 0:157c2fddaa68 | 47 | wait(1); // waiting 1 second for trigger events (pin30: rising edge). Count pulses between trigger events. |
geotec | 0:157c2fddaa68 | 48 | pulseCounter.stop(); |
geotec | 0:157c2fddaa68 | 49 | |
geotec | 0:157c2fddaa68 | 50 | pulseGenerator.stop(); |
geotec | 0:157c2fddaa68 | 51 | |
geotec | 0:157c2fddaa68 | 52 | // read & print pulseCounter results |
geotec | 0:157c2fddaa68 | 53 | int pulseCounterResults[20]; |
geotec | 0:157c2fddaa68 | 54 | pulseCounter.counterArray(&pulseCounterResults[0],sizeof pulseCounterResults / sizeof (int)); |
geotec | 0:157c2fddaa68 | 55 | |
geotec | 0:157c2fddaa68 | 56 | for(int i = 0; i < (sizeof pulseCounterResults / sizeof (int)); i++) { |
geotec | 0:157c2fddaa68 | 57 | usbPC.printf("counter of trigger event %i = %i\n",i,pulseCounterResults[i]); |
geotec | 0:157c2fddaa68 | 58 | } |
geotec | 0:157c2fddaa68 | 59 | // |
geotec | 0:157c2fddaa68 | 60 | |
geotec | 0:157c2fddaa68 | 61 | usbPC.printf(" finished.\n"); |
geotec | 0:157c2fddaa68 | 62 | } |
geotec | 0:157c2fddaa68 | 63 | * @endcode */ |
geotec | 0:157c2fddaa68 | 64 | void counterArray(int* counterArray, int counterArrayLength); |
geotec | 0:157c2fddaa68 | 65 | |
geotec | 0:157c2fddaa68 | 66 | private: |
geotec | 0:157c2fddaa68 | 67 | |
geotec | 0:157c2fddaa68 | 68 | static void _triggerInterrupt(); |
geotec | 0:157c2fddaa68 | 69 | static PulseCounter *instance; |
geotec | 0:157c2fddaa68 | 70 | bool _hasFinishedCounting; |
geotec | 0:157c2fddaa68 | 71 | |
geotec | 0:157c2fddaa68 | 72 | volatile int _triggerCounter; |
geotec | 0:157c2fddaa68 | 73 | volatile uint32_t *_arrayPointer; |
geotec | 0:157c2fddaa68 | 74 | volatile uint32_t _pulseCountArray[_pulseCountArrayLength + 1]; |
geotec | 0:157c2fddaa68 | 75 | }; |
geotec | 0:157c2fddaa68 | 76 | |
geotec | 0:157c2fddaa68 | 77 | #endif |