Reciprocal Frequency counter only for STM32F401、F411 and F466. Reciprocal mode(pulse width measurement)
Dependencies: fc_recipro_STM32F4xx
main.cpp@1:46cbfefcaa48, 2020-01-19 (annotated)
- Committer:
- kenjiArai
- Date:
- Sun Jan 19 06:57:21 2020 +0000
- Revision:
- 1:46cbfefcaa48
- Parent:
- 0:da29cdc50643
Example for only for Reciprocal mode(pulse width measurement)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:da29cdc50643 | 1 | /* |
kenjiArai | 1:46cbfefcaa48 | 2 | * mbed Library / Frequency Counter / Reciprocal type only |
kenjiArai | 1:46cbfefcaa48 | 3 | * Frequency Counter program |
kenjiArai | 1:46cbfefcaa48 | 4 | * Only for Nucleo-F401RE,-F411RE,-F446RE |
kenjiArai | 0:da29cdc50643 | 5 | * |
kenjiArai | 1:46cbfefcaa48 | 6 | * Copyright (c) 2014,'15,'16,'20 Kenji Arai / JH1PJL |
kenjiArai | 1:46cbfefcaa48 | 7 | * http://www7b.biglobe.ne.jp/~kenjia/ |
kenjiArai | 1:46cbfefcaa48 | 8 | * https://os.mbed.com/users/kenjiArai/ |
kenjiArai | 1:46cbfefcaa48 | 9 | * Started: October 18th, 2014 |
kenjiArai | 1:46cbfefcaa48 | 10 | * Revised: January 19th, 2020 |
kenjiArai | 0:da29cdc50643 | 11 | * |
kenjiArai | 0:da29cdc50643 | 12 | */ |
kenjiArai | 0:da29cdc50643 | 13 | |
kenjiArai | 0:da29cdc50643 | 14 | // Include -------------------------------------------------------------------- |
kenjiArai | 0:da29cdc50643 | 15 | #include "mbed.h" |
kenjiArai | 1:46cbfefcaa48 | 16 | #include "fc_recipro.h" |
kenjiArai | 0:da29cdc50643 | 17 | |
kenjiArai | 0:da29cdc50643 | 18 | // Definition ----------------------------------------------------------------- |
kenjiArai | 1:46cbfefcaa48 | 19 | #if (MBED_MAJOR_VERSION == 2) |
kenjiArai | 1:46cbfefcaa48 | 20 | # define WAIT(x) wait_ms(x) |
kenjiArai | 1:46cbfefcaa48 | 21 | #elif (MBED_MAJOR_VERSION == 5) |
kenjiArai | 1:46cbfefcaa48 | 22 | # define WAIT(x) ThisThread::sleep_for(x) |
kenjiArai | 0:da29cdc50643 | 23 | #endif |
kenjiArai | 0:da29cdc50643 | 24 | |
kenjiArai | 1:46cbfefcaa48 | 25 | #define EXAMPLE_NUMBER 1 // select 0 to 2 |
kenjiArai | 1:46cbfefcaa48 | 26 | |
kenjiArai | 1:46cbfefcaa48 | 27 | #if EXAMPLE_NUMBER == 0 |
kenjiArai | 1:46cbfefcaa48 | 28 | # define EXAMPLE0 |
kenjiArai | 1:46cbfefcaa48 | 29 | #elif EXAMPLE_NUMBER == 1 |
kenjiArai | 1:46cbfefcaa48 | 30 | # define EXAMPLE1 |
kenjiArai | 1:46cbfefcaa48 | 31 | #elif EXAMPLE_NUMBER == 2 |
kenjiArai | 1:46cbfefcaa48 | 32 | # define EXAMPLE2 |
kenjiArai | 0:da29cdc50643 | 33 | #else |
kenjiArai | 1:46cbfefcaa48 | 34 | # error " Please set 0 to 2 number for EXAMPLE_NUMBER!!" |
kenjiArai | 0:da29cdc50643 | 35 | #endif |
kenjiArai | 0:da29cdc50643 | 36 | |
kenjiArai | 0:da29cdc50643 | 37 | |
kenjiArai | 0:da29cdc50643 | 38 | using namespace Frequency_counter; |
kenjiArai | 0:da29cdc50643 | 39 | |
kenjiArai | 0:da29cdc50643 | 40 | // Object --------------------------------------------------------------------- |
kenjiArai | 0:da29cdc50643 | 41 | DigitalOut led1(LED1); |
kenjiArai | 0:da29cdc50643 | 42 | Serial pc(USBTX, USBRX); |
kenjiArai | 1:46cbfefcaa48 | 43 | Timer t; |
kenjiArai | 1:46cbfefcaa48 | 44 | FRQ_CUNTR fc; //Frequency Counter |
kenjiArai | 0:da29cdc50643 | 45 | |
kenjiArai | 0:da29cdc50643 | 46 | // RAM ------------------------------------------------------------------------ |
kenjiArai | 1:46cbfefcaa48 | 47 | Recipro_result_TypeDef freq; |
kenjiArai | 1:46cbfefcaa48 | 48 | Recipro_status_TypeDef status; |
kenjiArai | 1:46cbfefcaa48 | 49 | int64_t raw_buf[4]; |
kenjiArai | 0:da29cdc50643 | 50 | |
kenjiArai | 0:da29cdc50643 | 51 | // ROM / Constant data -------------------------------------------------------- |
kenjiArai | 0:da29cdc50643 | 52 | |
kenjiArai | 0:da29cdc50643 | 53 | // Function prototypes -------------------------------------------------------- |
kenjiArai | 0:da29cdc50643 | 54 | |
kenjiArai | 0:da29cdc50643 | 55 | //------------------------------------------------------------------------------ |
kenjiArai | 0:da29cdc50643 | 56 | // Control Program |
kenjiArai | 0:da29cdc50643 | 57 | //------------------------------------------------------------------------------ |
kenjiArai | 1:46cbfefcaa48 | 58 | #ifdef EXAMPLE0 |
kenjiArai | 1:46cbfefcaa48 | 59 | int main() |
kenjiArai | 0:da29cdc50643 | 60 | { |
kenjiArai | 1:46cbfefcaa48 | 61 | //pc.printf("\r\nStart Frequency Counter\r\n"); |
kenjiArai | 1:46cbfefcaa48 | 62 | fc.recipro_start_measurement(); |
kenjiArai | 1:46cbfefcaa48 | 63 | while(true) { |
kenjiArai | 1:46cbfefcaa48 | 64 | t.reset(); |
kenjiArai | 1:46cbfefcaa48 | 65 | t.start(); |
kenjiArai | 1:46cbfefcaa48 | 66 | if (fc.recipro_check_status(&status) == true) { |
kenjiArai | 1:46cbfefcaa48 | 67 | fc.recipro_get_result(&freq); |
kenjiArai | 1:46cbfefcaa48 | 68 | pc.printf("freq = %.3f [Hz], time(rise_fall) = %.6f [mS]\r\n", |
kenjiArai | 1:46cbfefcaa48 | 69 | freq.freq_rise2rise, freq.time_us_rise2fall); |
kenjiArai | 0:da29cdc50643 | 70 | } else { |
kenjiArai | 1:46cbfefcaa48 | 71 | pc.printf("------ data is NOT ready -------\r\n"); |
kenjiArai | 0:da29cdc50643 | 72 | } |
kenjiArai | 1:46cbfefcaa48 | 73 | uint32_t pass = t.read_ms(); |
kenjiArai | 1:46cbfefcaa48 | 74 | if (pass < 990) { |
kenjiArai | 1:46cbfefcaa48 | 75 | WAIT(1000 - pass); |
kenjiArai | 0:da29cdc50643 | 76 | } |
kenjiArai | 0:da29cdc50643 | 77 | } |
kenjiArai | 0:da29cdc50643 | 78 | } |
kenjiArai | 1:46cbfefcaa48 | 79 | #endif |
kenjiArai | 0:da29cdc50643 | 80 | |
kenjiArai | 1:46cbfefcaa48 | 81 | #ifdef EXAMPLE1 |
kenjiArai | 1:46cbfefcaa48 | 82 | int main() |
kenjiArai | 1:46cbfefcaa48 | 83 | { |
kenjiArai | 1:46cbfefcaa48 | 84 | pc.printf("\r\nStart Frequency Counter\r\n"); |
kenjiArai | 1:46cbfefcaa48 | 85 | fc.recipro_start_measurement(); |
kenjiArai | 1:46cbfefcaa48 | 86 | while(true) { |
kenjiArai | 1:46cbfefcaa48 | 87 | t.reset(); |
kenjiArai | 1:46cbfefcaa48 | 88 | t.start(); |
kenjiArai | 1:46cbfefcaa48 | 89 | if (fc.recipro_check_status(&status) == true) { |
kenjiArai | 1:46cbfefcaa48 | 90 | fc.recipro_get_result(&freq); |
kenjiArai | 1:46cbfefcaa48 | 91 | pc.printf("freq/rise_rise[Hz]= %f, ", |
kenjiArai | 1:46cbfefcaa48 | 92 | freq.freq_rise2rise); |
kenjiArai | 1:46cbfefcaa48 | 93 | pc.printf("/fall_fall= %f, ", |
kenjiArai | 1:46cbfefcaa48 | 94 | freq.freq_fall2fall); |
kenjiArai | 1:46cbfefcaa48 | 95 | pc.printf("time/rise_fall[mS]= %f, ", |
kenjiArai | 1:46cbfefcaa48 | 96 | freq.time_us_rise2fall); |
kenjiArai | 1:46cbfefcaa48 | 97 | pc.printf("/fall_rise= %f, ", |
kenjiArai | 1:46cbfefcaa48 | 98 | freq.time_us_fall2rise); |
kenjiArai | 1:46cbfefcaa48 | 99 | } else { |
kenjiArai | 1:46cbfefcaa48 | 100 | pc.printf("------ data is NOT ready -------,,,,"); |
kenjiArai | 1:46cbfefcaa48 | 101 | } |
kenjiArai | 1:46cbfefcaa48 | 102 | pc.printf("Rise= %d, Fall= %d, ", |
kenjiArai | 1:46cbfefcaa48 | 103 | status.rise_cnt, status.fall_cnt); |
kenjiArai | 1:46cbfefcaa48 | 104 | pc.printf("Input= %d, Passed-time[sec]= %.0f\r\n", |
kenjiArai | 1:46cbfefcaa48 | 105 | status.input_level, status.passed_time); |
kenjiArai | 1:46cbfefcaa48 | 106 | uint32_t pass = t.read_ms(); |
kenjiArai | 1:46cbfefcaa48 | 107 | if (pass < 990) { |
kenjiArai | 1:46cbfefcaa48 | 108 | WAIT(1000 - pass); |
kenjiArai | 1:46cbfefcaa48 | 109 | } |
kenjiArai | 1:46cbfefcaa48 | 110 | } |
kenjiArai | 1:46cbfefcaa48 | 111 | } |
kenjiArai | 1:46cbfefcaa48 | 112 | #endif |
kenjiArai | 1:46cbfefcaa48 | 113 | |
kenjiArai | 1:46cbfefcaa48 | 114 | #ifdef EXAMPLE2 |
kenjiArai | 0:da29cdc50643 | 115 | int main() |
kenjiArai | 0:da29cdc50643 | 116 | { |
kenjiArai | 1:46cbfefcaa48 | 117 | pc.printf("\r\nStart Frequency Counter\r\n"); |
kenjiArai | 1:46cbfefcaa48 | 118 | fc.recipro_start_measurement(); |
kenjiArai | 1:46cbfefcaa48 | 119 | while(true) { |
kenjiArai | 1:46cbfefcaa48 | 120 | t.reset(); |
kenjiArai | 1:46cbfefcaa48 | 121 | t.start(); |
kenjiArai | 1:46cbfefcaa48 | 122 | if (fc.recipro_check_status(&status) == true) { |
kenjiArai | 1:46cbfefcaa48 | 123 | fc.recipro_get_result(&freq); |
kenjiArai | 1:46cbfefcaa48 | 124 | pc.printf("freq/rise_rise[Hz]= %f, ", |
kenjiArai | 1:46cbfefcaa48 | 125 | freq.freq_rise2rise); |
kenjiArai | 1:46cbfefcaa48 | 126 | pc.printf("/fall_fall= %f, ", |
kenjiArai | 1:46cbfefcaa48 | 127 | freq.freq_fall2fall); |
kenjiArai | 1:46cbfefcaa48 | 128 | pc.printf("time/rise_fall[mS]= %f, ", |
kenjiArai | 1:46cbfefcaa48 | 129 | freq.time_us_rise2fall); |
kenjiArai | 1:46cbfefcaa48 | 130 | pc.printf("/fall_rise= %f, ", |
kenjiArai | 1:46cbfefcaa48 | 131 | freq.time_us_fall2rise); |
kenjiArai | 1:46cbfefcaa48 | 132 | } else { |
kenjiArai | 1:46cbfefcaa48 | 133 | pc.printf("------ data is NOT ready -------,,,,"); |
kenjiArai | 1:46cbfefcaa48 | 134 | } |
kenjiArai | 1:46cbfefcaa48 | 135 | pc.printf("Rise= %d, Fall= %d, ", |
kenjiArai | 1:46cbfefcaa48 | 136 | status.rise_cnt, status.fall_cnt); |
kenjiArai | 1:46cbfefcaa48 | 137 | pc.printf("Input= %d, Passed-time[sec]= %.0f\r\n", |
kenjiArai | 1:46cbfefcaa48 | 138 | status.input_level, status.passed_time); |
kenjiArai | 1:46cbfefcaa48 | 139 | fc.recipro_get_raw_data(raw_buf); |
kenjiArai | 1:46cbfefcaa48 | 140 | pc.printf("Rise raw data0= %.0f, Rise raw data1= %.0f, ", |
kenjiArai | 1:46cbfefcaa48 | 141 | (float)raw_buf[0], (float)raw_buf[1]); |
kenjiArai | 1:46cbfefcaa48 | 142 | pc.printf("Fall raw data0= %.0f, Fall raw data1= %.0f\r\n", |
kenjiArai | 1:46cbfefcaa48 | 143 | (float)raw_buf[2], (float)raw_buf[3]); |
kenjiArai | 1:46cbfefcaa48 | 144 | float base_clock = (float)(SystemCoreClock / 2); |
kenjiArai | 1:46cbfefcaa48 | 145 | float resolution = 1.0f / (float)base_clock * 1.0e9; // nano seconds(nS) |
kenjiArai | 1:46cbfefcaa48 | 146 | pc.printf("TIMER2 base clock = %.0f [Hz], resolution= %.3f [nS]\r\n", |
kenjiArai | 1:46cbfefcaa48 | 147 | base_clock, resolution); |
kenjiArai | 1:46cbfefcaa48 | 148 | uint32_t pass = t.read_ms(); |
kenjiArai | 1:46cbfefcaa48 | 149 | if (pass < 990) { |
kenjiArai | 1:46cbfefcaa48 | 150 | WAIT(1000 - pass); |
kenjiArai | 1:46cbfefcaa48 | 151 | } |
kenjiArai | 0:da29cdc50643 | 152 | } |
kenjiArai | 0:da29cdc50643 | 153 | } |
kenjiArai | 1:46cbfefcaa48 | 154 | #endif |