Frequency counter library only for DISCO-F746NG & NucleoF411RE +F446RE
Dependents: FreqCntr_GPS1PPS_F746F4xx_w_recipro Freq_Cntr_GPS1PPS_F746NG_GUI
Fork of Frq_cuntr_full by
fc_GPS1PPS.h@6:be7123d400ae, 2016-11-16 (annotated)
- Committer:
- kenjiArai
- Date:
- Wed Nov 16 13:15:35 2016 +0000
- Revision:
- 6:be7123d400ae
- Parent:
- 5:783b039f9119
Frequency counter library using GPS 1PPS signal
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 5:783b039f9119 | 1 | /* |
kenjiArai | 5:783b039f9119 | 2 | * mbed Library / Frequency Counter using GPS 1PPS gate pulse |
kenjiArai | 5:783b039f9119 | 3 | * Frequency Counter program |
kenjiArai | 5:783b039f9119 | 4 | * Only for ST DISCO-F746NG and Nucleo-F411RE+F446RE |
kenjiArai | 5:783b039f9119 | 5 | * |
kenjiArai | 5:783b039f9119 | 6 | * Copyright (c) 2014,'15,'16 Kenji Arai / JH1PJL |
kenjiArai | 5:783b039f9119 | 7 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 5:783b039f9119 | 8 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 5:783b039f9119 | 9 | * Started: October 18th, 2014 |
kenjiArai | 5:783b039f9119 | 10 | * Revised: January 1st, 2015 |
kenjiArai | 5:783b039f9119 | 11 | * Re-started: June 25th, 2016 ported from F411 board |
kenjiArai | 5:783b039f9119 | 12 | * Re-started: October 5th, 2016 Change board -> DISCO-F746NG |
kenjiArai | 5:783b039f9119 | 13 | * Re-started: October 17th, 2016 Continue F746 and back to F411 |
kenjiArai | 5:783b039f9119 | 14 | * Revised: November 13th, 2016 |
kenjiArai | 5:783b039f9119 | 15 | * |
kenjiArai | 5:783b039f9119 | 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
kenjiArai | 5:783b039f9119 | 17 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
kenjiArai | 5:783b039f9119 | 18 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
kenjiArai | 5:783b039f9119 | 19 | * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
kenjiArai | 5:783b039f9119 | 20 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
kenjiArai | 5:783b039f9119 | 21 | * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR |
kenjiArai | 5:783b039f9119 | 22 | * THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
kenjiArai | 5:783b039f9119 | 23 | */ |
kenjiArai | 5:783b039f9119 | 24 | |
kenjiArai | 5:783b039f9119 | 25 | /* |
kenjiArai | 5:783b039f9119 | 26 | -------------------------------------------------------------------------------- |
kenjiArai | 5:783b039f9119 | 27 | ********* Frequency Counter Functions ********* |
kenjiArai | 5:783b039f9119 | 28 | Mesurement frequency: 1Hz to 100MHz |
kenjiArai | 5:783b039f9119 | 29 | Extended range: Up to 1GHz (1/10 prescaler) or more over (1/20) |
kenjiArai | 5:783b039f9119 | 30 | Gate time: 1 sec to 4095sec (extend to more if RAM is avairable) |
kenjiArai | 5:783b039f9119 | 31 | 1 PPS: GPS receiver(u-blux7/NEO-7) with an external antenna |
kenjiArai | 5:783b039f9119 | 32 | Additional function: Reciprocal measurement (less tha 10KHz) |
kenjiArai | 5:783b039f9119 | 33 | |
kenjiArai | 5:783b039f9119 | 34 | ********* Hardware Configration (Board is only ST DISCO-F746NG) ********* |
kenjiArai | 5:783b039f9119 | 35 | frequency input: PC_6(D1) & PB10(No assign to connector!) |
kenjiArai | 5:783b039f9119 | 36 | GPS 1PPS: PA_15(D9), PB_8(D15) & PC_7(D0) |
kenjiArai | 5:783b039f9119 | 37 | |
kenjiArai | 5:783b039f9119 | 38 | ********* Hardware Configration (Board is only ST Nucleo-F411RE) ********* |
kenjiArai | 5:783b039f9119 | 39 | RESTRICTION -> Max input freqency is 48MHz due to system clock limitation |
kenjiArai | 5:783b039f9119 | 40 | frequency input: PA_8(D7) & PA_0(A0) |
kenjiArai | 5:783b039f9119 | 41 | GPS 1PPS: PA_9(D8), PB_0(A3) & PA_1(A1) |
kenjiArai | 5:783b039f9119 | 42 | -------------------------------------------------------------------------------- |
kenjiArai | 5:783b039f9119 | 43 | */ |
kenjiArai | 5:783b039f9119 | 44 | |
kenjiArai | 5:783b039f9119 | 45 | #ifndef MBED_FRQ_CUNTR |
kenjiArai | 5:783b039f9119 | 46 | #define MBED_FRQ_CUNTR |
kenjiArai | 5:783b039f9119 | 47 | |
kenjiArai | 5:783b039f9119 | 48 | #include "mbed.h" |
kenjiArai | 5:783b039f9119 | 49 | |
kenjiArai | 5:783b039f9119 | 50 | #define DEBUG 0 // use Communication with PC(UART) |
kenjiArai | 5:783b039f9119 | 51 | |
kenjiArai | 5:783b039f9119 | 52 | typedef union |
kenjiArai | 5:783b039f9119 | 53 | { |
kenjiArai | 5:783b039f9119 | 54 | struct { |
kenjiArai | 5:783b039f9119 | 55 | uint64_t f_1sec_dt; |
kenjiArai | 5:783b039f9119 | 56 | }; |
kenjiArai | 5:783b039f9119 | 57 | struct { |
kenjiArai | 5:783b039f9119 | 58 | uint32_t freq_dt; |
kenjiArai | 5:783b039f9119 | 59 | uint16_t f_sw_dt; |
kenjiArai | 5:783b039f9119 | 60 | uint16_t t_cnt; |
kenjiArai | 5:783b039f9119 | 61 | }; |
kenjiArai | 5:783b039f9119 | 62 | } freq_one; |
kenjiArai | 5:783b039f9119 | 63 | |
kenjiArai | 5:783b039f9119 | 64 | namespace Frequency_counter |
kenjiArai | 5:783b039f9119 | 65 | { |
kenjiArai | 5:783b039f9119 | 66 | |
kenjiArai | 5:783b039f9119 | 67 | /** Frequency Counter program |
kenjiArai | 5:783b039f9119 | 68 | * Only for ST DISCO-F746NG Board(Nucleo-F411RE & F446RE also) |
kenjiArai | 5:783b039f9119 | 69 | * |
kenjiArai | 5:783b039f9119 | 70 | * @code |
kenjiArai | 5:783b039f9119 | 71 | * #include "mbed.h" |
kenjiArai | 5:783b039f9119 | 72 | * #include "fc_GPS1PPS.h" |
kenjiArai | 5:783b039f9119 | 73 | * |
kenjiArai | 5:783b039f9119 | 74 | * using namespace Frequency_counter; |
kenjiArai | 5:783b039f9119 | 75 | * |
kenjiArai | 5:783b039f9119 | 76 | * //----F746---- max input f=100MHz |
kenjiArai | 5:783b039f9119 | 77 | * // frequency input -> PC_6 & PA15(for reciprocal) |
kenjiArai | 5:783b039f9119 | 78 | * // GPS 1PPS -> PB_8,PC_7 & PB_10(for reciprocal) |
kenjiArai | 5:783b039f9119 | 79 | * //----F411---- max input f=48MHz |
kenjiArai | 5:783b039f9119 | 80 | * //----F446---- max input f=90MHz |
kenjiArai | 5:783b039f9119 | 81 | * // frequency input -> PA_8 & PA_0(for reciprocal) |
kenjiArai | 5:783b039f9119 | 82 | * // GPS 1PPS -> PA_9, PB_0 & PA_1(for reciprocal) |
kenjiArai | 5:783b039f9119 | 83 | * |
kenjiArai | 5:783b039f9119 | 84 | * FRQ_CUNTR fc; |
kenjiArai | 5:783b039f9119 | 85 | * |
kenjiArai | 5:783b039f9119 | 86 | * int main() { |
kenjiArai | 5:783b039f9119 | 87 | * double frequency = 0; |
kenjiArai | 5:783b039f9119 | 88 | * while(true) { |
kenjiArai | 5:783b039f9119 | 89 | * while (fc.status_freq_update() == 0) {;} |
kenjiArai | 5:783b039f9119 | 90 | * frequency = fc.read_freq_data(); // 1sec gate |
kenjiArai | 5:783b039f9119 | 91 | * printf("FREQ. = %11.1f\r\n", frequency); |
kenjiArai | 5:783b039f9119 | 92 | * } |
kenjiArai | 5:783b039f9119 | 93 | * } |
kenjiArai | 5:783b039f9119 | 94 | * @endcode |
kenjiArai | 5:783b039f9119 | 95 | */ |
kenjiArai | 5:783b039f9119 | 96 | |
kenjiArai | 5:783b039f9119 | 97 | class FRQ_CUNTR |
kenjiArai | 5:783b039f9119 | 98 | { |
kenjiArai | 5:783b039f9119 | 99 | |
kenjiArai | 5:783b039f9119 | 100 | public: |
kenjiArai | 5:783b039f9119 | 101 | |
kenjiArai | 5:783b039f9119 | 102 | /** Configure counter |
kenjiArai | 5:783b039f9119 | 103 | * @param none |
kenjiArai | 5:783b039f9119 | 104 | */ |
kenjiArai | 5:783b039f9119 | 105 | FRQ_CUNTR(void); |
kenjiArai | 5:783b039f9119 | 106 | |
kenjiArai | 5:783b039f9119 | 107 | /** Read new frequency data (gate time = 1sec) |
kenjiArai | 5:783b039f9119 | 108 | * @param none |
kenjiArai | 5:783b039f9119 | 109 | * @return frequency data |
kenjiArai | 5:783b039f9119 | 110 | */ |
kenjiArai | 5:783b039f9119 | 111 | double read_freq_data(void); |
kenjiArai | 5:783b039f9119 | 112 | |
kenjiArai | 5:783b039f9119 | 113 | /** Read new frequency data with specific gate time |
kenjiArai | 5:783b039f9119 | 114 | * @param gate time [sec] (1 sec to over 1 hour(F746) or 17 minutes) |
kenjiArai | 5:783b039f9119 | 115 | * @return frequency data |
kenjiArai | 5:783b039f9119 | 116 | */ |
kenjiArai | 5:783b039f9119 | 117 | double read_freq_w_gate_time(uint16_t gt); |
kenjiArai | 5:783b039f9119 | 118 | |
kenjiArai | 5:783b039f9119 | 119 | /** Read status (new frequency data is available or not) |
kenjiArai | 5:783b039f9119 | 120 | * @param none |
kenjiArai | 5:783b039f9119 | 121 | * @return !=0: new data is avairable, 0: not yet |
kenjiArai | 5:783b039f9119 | 122 | */ |
kenjiArai | 5:783b039f9119 | 123 | uint32_t status_freq_update(void); |
kenjiArai | 5:783b039f9119 | 124 | |
kenjiArai | 5:783b039f9119 | 125 | /** Reset buffered data |
kenjiArai | 5:783b039f9119 | 126 | * @param none |
kenjiArai | 5:783b039f9119 | 127 | * @return none |
kenjiArai | 5:783b039f9119 | 128 | */ |
kenjiArai | 5:783b039f9119 | 129 | void reset_buffered_data(void); |
kenjiArai | 5:783b039f9119 | 130 | |
kenjiArai | 5:783b039f9119 | 131 | /** Reciprocal measurement (Step1) |
kenjiArai | 5:783b039f9119 | 132 | * preparation for Reciprocal measurement |
kenjiArai | 5:783b039f9119 | 133 | * @param none |
kenjiArai | 5:783b039f9119 | 134 | * @return none |
kenjiArai | 5:783b039f9119 | 135 | */ |
kenjiArai | 5:783b039f9119 | 136 | void recipro_start_measure(void); |
kenjiArai | 5:783b039f9119 | 137 | |
kenjiArai | 5:783b039f9119 | 138 | /** Reciprocal measurement (Step2) |
kenjiArai | 5:783b039f9119 | 139 | * check frequency input as IC trigger |
kenjiArai | 5:783b039f9119 | 140 | * @param none |
kenjiArai | 5:783b039f9119 | 141 | * @return 1: done, 0: not yet |
kenjiArai | 5:783b039f9119 | 142 | */ |
kenjiArai | 5:783b039f9119 | 143 | uint32_t recipro_check_trigger(void); |
kenjiArai | 5:783b039f9119 | 144 | |
kenjiArai | 5:783b039f9119 | 145 | /** Reciprocal measurement (Step3) |
kenjiArai | 5:783b039f9119 | 146 | * read period data |
kenjiArai | 5:783b039f9119 | 147 | * @param none |
kenjiArai | 5:783b039f9119 | 148 | * @return frequency data |
kenjiArai | 5:783b039f9119 | 149 | */ |
kenjiArai | 5:783b039f9119 | 150 | uint32_t recipro_read_data(void); |
kenjiArai | 5:783b039f9119 | 151 | |
kenjiArai | 5:783b039f9119 | 152 | /** Reciprocal measurement (Step4) |
kenjiArai | 5:783b039f9119 | 153 | * read period data |
kenjiArai | 5:783b039f9119 | 154 | * @param gate time [sec] (1 sec to over 1 hour) |
kenjiArai | 5:783b039f9119 | 155 | * @return time base clock frequency data |
kenjiArai | 5:783b039f9119 | 156 | */ |
kenjiArai | 5:783b039f9119 | 157 | uint32_t recipro_base_clk_data(uint16_t gt); |
kenjiArai | 5:783b039f9119 | 158 | |
kenjiArai | 5:783b039f9119 | 159 | /** "DEBUG PURPOSE" function |
kenjiArai | 5:783b039f9119 | 160 | * Check input frequency on TIM8+4 or TIM1+3 |
kenjiArai | 5:783b039f9119 | 161 | * print internal data (need to define "DEBUG") |
kenjiArai | 5:783b039f9119 | 162 | * @param gate time e.g. 1sec = 1.0f |
kenjiArai | 5:783b039f9119 | 163 | * @return frequency data |
kenjiArai | 5:783b039f9119 | 164 | */ |
kenjiArai | 5:783b039f9119 | 165 | uint32_t debug_read_input_frequency(double gatetime); |
kenjiArai | 5:783b039f9119 | 166 | |
kenjiArai | 5:783b039f9119 | 167 | /** "DEBUG PURPOSE" function |
kenjiArai | 5:783b039f9119 | 168 | * Check input frequency on TIM2 |
kenjiArai | 5:783b039f9119 | 169 | * print internal data (need to define "DEBUG") |
kenjiArai | 5:783b039f9119 | 170 | * @param gate time e.g. 1sec = 1.0f |
kenjiArai | 5:783b039f9119 | 171 | * @return frequency data |
kenjiArai | 5:783b039f9119 | 172 | */ |
kenjiArai | 5:783b039f9119 | 173 | uint32_t debug_read_base_clock_frequency(double gatetime); |
kenjiArai | 5:783b039f9119 | 174 | |
kenjiArai | 5:783b039f9119 | 175 | /** "DEBUG PURPOSE" function |
kenjiArai | 5:783b039f9119 | 176 | * print internal data (No need to define "DEBUG") |
kenjiArai | 5:783b039f9119 | 177 | * @param none |
kenjiArai | 5:783b039f9119 | 178 | * @return none (just print tha data) |
kenjiArai | 5:783b039f9119 | 179 | */ |
kenjiArai | 5:783b039f9119 | 180 | void debug_printf_all_buffer(void); |
kenjiArai | 5:783b039f9119 | 181 | |
kenjiArai | 5:783b039f9119 | 182 | protected: |
kenjiArai | 5:783b039f9119 | 183 | void start_action(void); // Start trigger for reciprocal |
kenjiArai | 5:783b039f9119 | 184 | void initialize_TIMxPy(void); // Initialize Timer_x + _y (16+16bit) |
kenjiArai | 5:783b039f9119 | 185 | void initialize_TIMz(void); // Initialize Timer_z (32bit) |
kenjiArai | 5:783b039f9119 | 186 | uint64_t get_diff(uint64_t new_dt, uint64_t old_dt); |
kenjiArai | 5:783b039f9119 | 187 | |
kenjiArai | 5:783b039f9119 | 188 | private: |
kenjiArai | 5:783b039f9119 | 189 | double newest_frequency; |
kenjiArai | 5:783b039f9119 | 190 | |
kenjiArai | 5:783b039f9119 | 191 | }; |
kenjiArai | 5:783b039f9119 | 192 | |
kenjiArai | 5:783b039f9119 | 193 | /* |
kenjiArai | 5:783b039f9119 | 194 | Interrupt handler does NOT work following code |
kenjiArai | 5:783b039f9119 | 195 | NVIC_SetVector(TIM4_IRQn, (uint32_t)FRQ_CUNTR::irq_ic_TIMxPy); |
kenjiArai | 5:783b039f9119 | 196 | From this reason, I wrote below code and set interrupt handler |
kenjiArai | 5:783b039f9119 | 197 | out side "FRQ_CUNTR" class |
kenjiArai | 5:783b039f9119 | 198 | NVIC_SetVector(TIM4_IRQn, (uint32_t)irq_ic_TIMxPy); |
kenjiArai | 5:783b039f9119 | 199 | */ |
kenjiArai | 5:783b039f9119 | 200 | void irq_ic_TIMxPy(void); // TIM4(F746) or TIM3(F411) IC Interrupt |
kenjiArai | 5:783b039f9119 | 201 | void irq_ic_TIMz(void); // TIM2(F746 & F411) IC Interrupt |
kenjiArai | 5:783b039f9119 | 202 | |
kenjiArai | 5:783b039f9119 | 203 | } // Frequency_counter |
kenjiArai | 5:783b039f9119 | 204 | |
kenjiArai | 5:783b039f9119 | 205 | #endif // MBED_FRQ_CUNTR |