Zoltan Hudak
/
FrequencyCounter
Frequency counter counting pulses at the input.
main.cpp@0:a18601268a31, 2017-06-30 (annotated)
- Committer:
- hudakz
- Date:
- Fri Jun 30 17:39:00 2017 +0000
- Revision:
- 0:a18601268a31
Initial issue.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 0:a18601268a31 | 1 | #include "mbed.h" |
hudakz | 0:a18601268a31 | 2 | |
hudakz | 0:a18601268a31 | 3 | #define GATE_TIME 0.5 // Gate time (period of time to count pulses within) in seconds |
hudakz | 0:a18601268a31 | 4 | |
hudakz | 0:a18601268a31 | 5 | Serial pc(USBTX, USBRX); |
hudakz | 0:a18601268a31 | 6 | InterruptIn input(p9); // input line |
hudakz | 0:a18601268a31 | 7 | Timeout timeout; |
hudakz | 0:a18601268a31 | 8 | volatile bool measuringEnabled = false; |
hudakz | 0:a18601268a31 | 9 | volatile uint32_t counter; |
hudakz | 0:a18601268a31 | 10 | |
hudakz | 0:a18601268a31 | 11 | //ISR to count pulses |
hudakz | 0:a18601268a31 | 12 | void onPulse(void) { |
hudakz | 0:a18601268a31 | 13 | if (measuringEnabled) |
hudakz | 0:a18601268a31 | 14 | counter++; |
hudakz | 0:a18601268a31 | 15 | } |
hudakz | 0:a18601268a31 | 16 | |
hudakz | 0:a18601268a31 | 17 | // ISR to stop counting |
hudakz | 0:a18601268a31 | 18 | void stopMeasuring(void) { |
hudakz | 0:a18601268a31 | 19 | measuringEnabled = false; |
hudakz | 0:a18601268a31 | 20 | } |
hudakz | 0:a18601268a31 | 21 | |
hudakz | 0:a18601268a31 | 22 | // Initializes counting |
hudakz | 0:a18601268a31 | 23 | void startMeasuring(void) { |
hudakz | 0:a18601268a31 | 24 | counter = 0; |
hudakz | 0:a18601268a31 | 25 | timeout.attach(callback(&stopMeasuring), GATE_TIME); |
hudakz | 0:a18601268a31 | 26 | measuringEnabled = true; |
hudakz | 0:a18601268a31 | 27 | } |
hudakz | 0:a18601268a31 | 28 | |
hudakz | 0:a18601268a31 | 29 | int main(void) { |
hudakz | 0:a18601268a31 | 30 | input.rise(callback(&onPulse)); // assign an ISR to count pulses |
hudakz | 0:a18601268a31 | 31 | while (1) { |
hudakz | 0:a18601268a31 | 32 | startMeasuring(); |
hudakz | 0:a18601268a31 | 33 | while (measuringEnabled); // wait until the measurement has completed |
hudakz | 0:a18601268a31 | 34 | if(GATE_TIME < 1) |
hudakz | 0:a18601268a31 | 35 | wait(1 - GATE_TIME); // wait at least one second before printing |
hudakz | 0:a18601268a31 | 36 | pc.printf("counter = %d\r\n", counter); |
hudakz | 0:a18601268a31 | 37 | pc.printf("frequency = %f\r\n", (double)counter / GATE_TIME); |
hudakz | 0:a18601268a31 | 38 | } |
hudakz | 0:a18601268a31 | 39 | } |