Reciprocal Frequency counter only for STM32F401、F411 and F466. Reciprocal mode(pulse width measurement)

Dependencies:   fc_recipro_STM32F4xx

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?

UserRevisionLine numberNew 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