Reciprocal Frequency counter only for STM32F401、F411 and F466. Reciprocal Mode -> Pulse width measurement

Dependents:   Frequency_Counter_Recipro_for_STM32F4xx

Committer:
kenjiArai
Date:
Sun Jan 19 06:54:38 2020 +0000
Revision:
8:c9ed197ce270
Parent:
7:7fdff925855e
modified uint to int and others

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 7:7fdff925855e 1 /*
kenjiArai 7:7fdff925855e 2 * mbed Library / Frequency Counter / Recipro type
kenjiArai 7:7fdff925855e 3 * Frequency Counter program
kenjiArai 7:7fdff925855e 4 * Only for Nucleo-F401RE,-F411RE,-F446RE
kenjiArai 7:7fdff925855e 5 *
kenjiArai 7:7fdff925855e 6 * Copyright (c) 2014,'15,'16,'20 Kenji Arai / JH1PJL
kenjiArai 7:7fdff925855e 7 * http://www7b.biglobe.ne.jp/~kenjia/
kenjiArai 7:7fdff925855e 8 * https://os.mbed.com/users/kenjiArai/
kenjiArai 7:7fdff925855e 9 * Started: October 18th, 2014
kenjiArai 7:7fdff925855e 10 * Revised: January 19th, 2020
kenjiArai 7:7fdff925855e 11 *
kenjiArai 7:7fdff925855e 12 */
kenjiArai 7:7fdff925855e 13
kenjiArai 7:7fdff925855e 14 #ifndef MBED_FRQ_CUNTR
kenjiArai 7:7fdff925855e 15 #define MBED_FRQ_CUNTR
kenjiArai 7:7fdff925855e 16
kenjiArai 7:7fdff925855e 17 #include "mbed.h"
kenjiArai 7:7fdff925855e 18
kenjiArai 7:7fdff925855e 19 #define DEBUG 0 // use Communication with PC(UART) & port output
kenjiArai 7:7fdff925855e 20
kenjiArai 7:7fdff925855e 21 typedef struct {
kenjiArai 7:7fdff925855e 22 float freq_rise2rise;
kenjiArai 7:7fdff925855e 23 float freq_fall2fall;
kenjiArai 7:7fdff925855e 24 float time_us_rise2fall;
kenjiArai 7:7fdff925855e 25 float time_us_fall2rise;
kenjiArai 7:7fdff925855e 26 } Recipro_result_TypeDef;
kenjiArai 7:7fdff925855e 27
kenjiArai 7:7fdff925855e 28 typedef struct {
kenjiArai 7:7fdff925855e 29 uint8_t rise_cnt;
kenjiArai 7:7fdff925855e 30 uint8_t fall_cnt;
kenjiArai 7:7fdff925855e 31 uint8_t input_level;
kenjiArai 7:7fdff925855e 32 float passed_time;
kenjiArai 7:7fdff925855e 33 } Recipro_status_TypeDef;
kenjiArai 7:7fdff925855e 34
kenjiArai 7:7fdff925855e 35 namespace Frequency_counter
kenjiArai 7:7fdff925855e 36 {
kenjiArai 7:7fdff925855e 37 /** Frequency Counter program
kenjiArai 7:7fdff925855e 38 * Only for Nucleo-F411RE & F446RE
kenjiArai 7:7fdff925855e 39 *
kenjiArai 7:7fdff925855e 40 * @code
kenjiArai 7:7fdff925855e 41 * #include "mbed.h"
kenjiArai 7:7fdff925855e 42 * #include "fc_recipro.h"
kenjiArai 7:7fdff925855e 43 *
kenjiArai 7:7fdff925855e 44 * using namespace Frequency_counter;
kenjiArai 7:7fdff925855e 45 *
kenjiArai 7:7fdff925855e 46 * // frequency input -> PA_0 & PA_1
kenjiArai 7:7fdff925855e 47 * // PA_0(for reciprocal) Timer2 Input Capture #1
kenjiArai 7:7fdff925855e 48 * // PA_1(for reciprocal) Timer2 Input Capture #2
kenjiArai 7:7fdff925855e 49 *
kenjiArai 7:7fdff925855e 50 * FRQ_CUNTR fc;
kenjiArai 7:7fdff925855e 51 *
kenjiArai 7:7fdff925855e 52 * Recipro_result_TypeDef freq;
kenjiArai 7:7fdff925855e 53 *
kenjiArai 7:7fdff925855e 54 * int main()
kenjiArai 7:7fdff925855e 55 * {
kenjiArai 7:7fdff925855e 56 * //pc.printf("\r\nStart Frequency Counter\r\n");
kenjiArai 7:7fdff925855e 57 * fc.recipro_start_measurement();
kenjiArai 7:7fdff925855e 58 * while(true) {
kenjiArai 7:7fdff925855e 59 * t.reset();
kenjiArai 7:7fdff925855e 60 * t.start();
kenjiArai 7:7fdff925855e 61 * if (fc.recipro_check_status(&status) == true) {
kenjiArai 7:7fdff925855e 62 * fc.recipro_get_result(&freq);
kenjiArai 7:7fdff925855e 63 * pc.printf("freq = %.3f [Hz], time(rise_fall) = %.6f [mS]\r\n",
kenjiArai 7:7fdff925855e 64 * freq.freq_rise2rise, freq.time_us_rise2fall);
kenjiArai 7:7fdff925855e 65 * } else {
kenjiArai 7:7fdff925855e 66 * pc.printf("------ data is NOT ready -------\r\n");
kenjiArai 7:7fdff925855e 67 * }
kenjiArai 7:7fdff925855e 68 * uint32_t pass = t.read_ms();
kenjiArai 7:7fdff925855e 69 * if (pass < 990) {
kenjiArai 7:7fdff925855e 70 * WAIT(1000 - pass);
kenjiArai 7:7fdff925855e 71 * }
kenjiArai 7:7fdff925855e 72 * }
kenjiArai 7:7fdff925855e 73 * }
kenjiArai 7:7fdff925855e 74 * @endcode
kenjiArai 7:7fdff925855e 75 */
kenjiArai 7:7fdff925855e 76
kenjiArai 7:7fdff925855e 77 class FRQ_CUNTR
kenjiArai 7:7fdff925855e 78 {
kenjiArai 7:7fdff925855e 79
kenjiArai 7:7fdff925855e 80 public:
kenjiArai 7:7fdff925855e 81
kenjiArai 7:7fdff925855e 82 /** Configure counter
kenjiArai 7:7fdff925855e 83 * @param pin (Fixed A0 & A1) No other choice!!
kenjiArai 7:7fdff925855e 84 */
kenjiArai 7:7fdff925855e 85 FRQ_CUNTR(PinName pin = A0);
kenjiArai 7:7fdff925855e 86
kenjiArai 7:7fdff925855e 87 //----------- Reciprocal measurement -------------------------------------------
kenjiArai 7:7fdff925855e 88 /** start Reciprocal measurement
kenjiArai 7:7fdff925855e 89 * @param none
kenjiArai 7:7fdff925855e 90 * @return none
kenjiArai 7:7fdff925855e 91 */
kenjiArai 7:7fdff925855e 92 void recipro_start_measurement(void);
kenjiArai 7:7fdff925855e 93
kenjiArai 7:7fdff925855e 94 /** stop Reciprocal measurement
kenjiArai 7:7fdff925855e 95 * @param none
kenjiArai 7:7fdff925855e 96 * @return none
kenjiArai 7:7fdff925855e 97 */
kenjiArai 7:7fdff925855e 98 void recipro_stop_measurement(void);
kenjiArai 7:7fdff925855e 99
kenjiArai 7:7fdff925855e 100 /** check status
kenjiArai 7:7fdff925855e 101 * @param pointer for saving status
kenjiArai 7:7fdff925855e 102 * @return ready = true, not ready = false
kenjiArai 7:7fdff925855e 103 */
kenjiArai 7:7fdff925855e 104 bool recipro_check_status(Recipro_status_TypeDef *status);
kenjiArai 7:7fdff925855e 105
kenjiArai 7:7fdff925855e 106 /** read data
kenjiArai 7:7fdff925855e 107 * @param pointer for saving data
kenjiArai 7:7fdff925855e 108 * @return none
kenjiArai 7:7fdff925855e 109 */
kenjiArai 7:7fdff925855e 110 void recipro_get_result(Recipro_result_TypeDef *fq);
kenjiArai 7:7fdff925855e 111
kenjiArai 7:7fdff925855e 112 /** read raw data
kenjiArai 7:7fdff925855e 113 * @param pointer for saving raw data
kenjiArai 7:7fdff925855e 114 * @return none
kenjiArai 7:7fdff925855e 115 */
kenjiArai 7:7fdff925855e 116 void recipro_get_raw_data(int64_t *buf);
kenjiArai 7:7fdff925855e 117
kenjiArai 7:7fdff925855e 118 /** Check input frequency on TIM2
kenjiArai 7:7fdff925855e 119 * @param none
kenjiArai 7:7fdff925855e 120 * @return frequency data
kenjiArai 7:7fdff925855e 121 */
kenjiArai 7:7fdff925855e 122 uint32_t read_base_clock_frequency(void);
kenjiArai 7:7fdff925855e 123
kenjiArai 7:7fdff925855e 124 /** Check overflow counter data on TIM2
kenjiArai 7:7fdff925855e 125 * @param none
kenjiArai 7:7fdff925855e 126 * @return overflow data
kenjiArai 7:7fdff925855e 127 */
kenjiArai 7:7fdff925855e 128 uint32_t read_tm2_overflow(void);
kenjiArai 7:7fdff925855e 129
kenjiArai 7:7fdff925855e 130 protected:
kenjiArai 7:7fdff925855e 131 Timer _t;
kenjiArai 7:7fdff925855e 132 DigitalIn _input_pin;
kenjiArai 7:7fdff925855e 133
kenjiArai 7:7fdff925855e 134 void start_action(void); // Start trigger for reciprocal
kenjiArai 7:7fdff925855e 135 void stop_action(void); // Stop reciprocal
kenjiArai 7:7fdff925855e 136 void initialize_TIM2(void); // Initialize Timer_2 (32bit)
kenjiArai 7:7fdff925855e 137 uint64_t get_diff(uint64_t new_dt, uint64_t old_dt);
kenjiArai 7:7fdff925855e 138
kenjiArai 7:7fdff925855e 139 private:
kenjiArai 8:c9ed197ce270 140 int64_t _data_buf[4];
kenjiArai 8:c9ed197ce270 141 int64_t _tp0;
kenjiArai 8:c9ed197ce270 142 int64_t _tp1;
kenjiArai 8:c9ed197ce270 143 int64_t _tp2;
kenjiArai 8:c9ed197ce270 144 int64_t _tp3;
kenjiArai 7:7fdff925855e 145
kenjiArai 7:7fdff925855e 146 float _base_clock;
kenjiArai 7:7fdff925855e 147
kenjiArai 7:7fdff925855e 148 float _freq_rise2rise;
kenjiArai 7:7fdff925855e 149 float _freq_fall2fall;
kenjiArai 7:7fdff925855e 150 float _time_us_rise2fall;
kenjiArai 7:7fdff925855e 151 float _time_us_fall2rise;
kenjiArai 7:7fdff925855e 152 float _passed_time;
kenjiArai 7:7fdff925855e 153 uint8_t _sample_num;
kenjiArai 7:7fdff925855e 154 bool _data_ready;
kenjiArai 7:7fdff925855e 155
kenjiArai 7:7fdff925855e 156 };
kenjiArai 7:7fdff925855e 157
kenjiArai 7:7fdff925855e 158 /*
kenjiArai 7:7fdff925855e 159 Interrupt handler does NOT work following code
kenjiArai 7:7fdff925855e 160 NVIC_SetVector(TIM2_IRQn, (uint32_t)FRQ_CUNTR::irq_ic_TIM2);
kenjiArai 7:7fdff925855e 161 From this reason, I wrote below code and set interrupt handler
kenjiArai 7:7fdff925855e 162 out side "FRQ_CUNTR" class
kenjiArai 7:7fdff925855e 163 NVIC_SetVector(TIM2_IRQn, (uint32_t)irq_ic_TIM2);
kenjiArai 7:7fdff925855e 164 */
kenjiArai 7:7fdff925855e 165 void irq_ic_TIM2(void); // TIM2(F4xx) IC1 & IC2 Interrupt
kenjiArai 7:7fdff925855e 166
kenjiArai 7:7fdff925855e 167 } // Frequency_counter
kenjiArai 7:7fdff925855e 168
kenjiArai 7:7fdff925855e 169 #endif // MBED_FRQ_CUNTR