Reciprocal Frequency counter only for STM32F401、F411 and F466. Reciprocal Mode -> Pulse width measurement
Dependents: Frequency_Counter_Recipro_for_STM32F4xx
fc_recipro.h@8:c9ed197ce270, 2020-01-19 (annotated)
- 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?
User | Revision | Line number | New 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 |