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
- Committer:
- geotec
- Date:
- 2013-01-09
- Revision:
- 4:0eb01612bcb2
- Parent:
- 3:9e7474866e48
File content as of revision 4:0eb01612bcb2:
/* Copyright (c) 2012 Christian Buntebarth, MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef MBED_PULSECOUNTER_H
#define MBED_PULSECOUNTER_H
#include "mbed.h"
const int _pulseCountArrayLength = 20;
/** 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.
* These events can be triggered at a rate up to 9kHz. The counter results are stored in a "circular array" of 20 elements.
* ("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)
* */
class PulseCounter
{
public:
/** Initializer for PulseCounter instance
*/
void init();
/** Start counter
*/
void start();
/** Stop counter
*/
void stop();
/** Read pulse count results into external array. Do not call this method before you called method stop() - otherwise it will return zeros.
* @param counterArray = Pointer to array in which the pulse count results should be read into.
* @param counterArrayLength = Size of counterArray. Should be 20 or less. If more than 20, remaining elements will be filled with zeros.
* @code #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
int pulseCounterResults[20];
pulseCounter.counterArray(&pulseCounterResults[0],sizeof pulseCounterResults / sizeof (int));
for(int i = 0; i < (sizeof pulseCounterResults / sizeof (int)); i++) {
usbPC.printf("counter of trigger event %i = %i\n",i,pulseCounterResults[i]);
}
//
usbPC.printf(" finished.\n");
}
* @endcode */
void counterArray(uint32_t* counterArray, int counterArrayLength);
private:
static void _triggerInterrupt();
static PulseCounter *instance;
bool _hasFinishedCounting;
volatile int _triggerCounter;
volatile uint32_t *_arrayPointer;
volatile uint32_t _pulseCountArray[_pulseCountArrayLength + 1];
};
#endif