[time-nuts] Frequency Counter using OCXO and MCU

Chris Albertson albertson.chris at gmail.com
Wed Mar 12 10:18:47 EDT 2014


Are you putting the "unknown signal" to be measured on an interrupt pin?
 that will work for low enough frequencies but most uPs have a built-in
counter.   It is a hardware register on the uP chip that will increment for
each pulse on a pin.  then you read that number and divide by the gate
time.   At some point the frequency will be to high for the counter pin so
then you switch in a hardware frequency diver as a pre-scaler.


On Tue, Mar 11, 2014 at 8:24 PM, d0ct0r <time at patoka.org> wrote:

>
> Hello,
>
> I am experimenting to build frequency counter using external OCXO and ST32
> MCU. The OCXO is external DATUM 2750013-1 device which produce 10Mhz sine
> wave. I connected its output to OC_IN on MCU. I have few challenges now.
>
> First, looks like I need to create some delay to turn on MCU _after_ OCXO.
> If I try to start both devices simultaneously, I got following result for
> 10 kHz TTL measurement:
>
>
> System Core Clock: 168000000 Hz
> SYSCLK_Frequency PCLK1_Frequency PCLK2_Frequency
> 16000000         16000000        16000000
>
> # Starting SuperLoop...
> FREQ: 105197
> FREQ: 105263
> FREQ: 105263
> FREQ: 105263
>
>
> As soon as I push reset button on MCU, I got correct results for its
> clocks and correct value for the counter:
>
>
> System Core Clock: 168000000 Hz
> SYSCLK_Frequency PCLK1_Frequency PCLK2_Frequency
> 168000000        42000000        84000000
>
> # Starting SuperLoop...
> FREQ: 10019
> FREQ: 10019
> FREQ: 10019
> FREQ: 10019
> FREQ: 10018
> FREQ: 10019
>
>
> Another challenge is the fact, that if I increase the input signal
> frequency, then performance of the MCU decreased. In the other word, I need
> to wait much more time to have a result. Probably MCU is super busy to
> handle the interrupt. Say for 10 kHz range its pretty fast. Then for 1 mHz
> its much slower.
>
> Here is main loop:
>
> while (1) {
>         if(j++ < 0xF00000) {
>             accum += deltaREF; // Moving Average
>             accum = (accum >> 1);
>         } else {
>             uwTIM1Freq = (uint32_t) SystemCoreClock / accum;
>             printf("FREQ: %ul\n\r", uwTIM1Freq);
>             accum = j = 0;
>         }
>     }
>
> The counter is based on timer in "input capture" mode and driven by
> interrupt:
> [ See STM32F4xx_StdPeriph_Examples\TIM\TIM_InputCapture ]
>
> Also this counter shows incorrect results for low frequency. For example,
> for 100 Hz:
>
> FREQ: 4968
> FREQ: 5030
> FREQ: 5056
> FREQ: 4916
>
> I would be interesting to hear any advise how to improve it.
>
> And another question is: what will be "pros" and "cons" to transform 10Mhz
> sine to square to feed MCU ? I tried it, but didn't catch any difference.
>
> Here is schema
> http://www.qsl.net/va3iul/Homebrew_RF_Circuit_Design_
> Ideas/Sine-to-Square_Wave_BJT_Converter_Wenzel.gif
>
>
> --
> WBW,
>
> V.P.
> _______________________________________________
> time-nuts mailing list -- time-nuts at febo.com
> To unsubscribe, go to https://www.febo.com/cgi-bin/
> mailman/listinfo/time-nuts
> and follow the instructions there.
>



-- 

Chris Albertson
Redondo Beach, California


More information about the time-nuts mailing list