Frequency counter library only for DISCO-F746NG & NucleoF411RE +F446RE

Dependencies:   RingBuff

Dependents:   FreqCntr_GPS1PPS_F746F4xx_w_recipro Freq_Cntr_GPS1PPS_F746NG_GUI

Fork of Frq_cuntr_full by Kenji Arai

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?

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