Undocumented frequency counter

If doesn't fit into any other category ....
Post Reply
User avatar
cicciocb
Site Admin
Posts: 1900
Joined: Mon Feb 03, 2020 1:15 pm
Location: Toulouse
Has thanked: 407 times
Been thanked: 1271 times
Contact:

Undocumented frequency counter

Post by cicciocb »

Hi all,
some time ago I implemented a frequency counter in the ESP32 using the internal modules PCNT.
These are simply counters that I managed to use as a frequency counter using a minimum of CPU time.
Theoretically it should be able to achieve 40MHz but I never had the change to really test it exhaustively.
This is inside Annex32 since some time, including the last version.

As I changed a lot of code inside Annex I'm not really sure that it still works so it could be interesting if someone can test it for me.
I'll manage to fix it and make it clearly available in the future

There are 2 simply commands :

counter.init pin ' set the pin to use as input
print counter.cpufreq ' returns the measured frequency in hertz

a simple test code can be

Code: [Local Link Removed for Guests]

counter.init 33 'use pin 33 as input
while 1
  wlog counter.cpufreq
  pause 1000
wend
Palm Liu
Posts: 41
Joined: Fri Jun 25, 2021 3:50 am
Has thanked: 10 times
Been thanked: 17 times

Re: Undocumented frequency counter

Post by Palm Liu »

Hi, here is my testing result:

1. ESP32 by LOLIN-D32 (Annex32 BLE CAN 1.48.22)
2. Frequency generator is RIGOL DG1022, it can only generate square wave at maximum 5MHz
freq.jpg
Source code as:

Code: [Local Link Removed for Guests]

counter.init 33 'use pin 33 as input
while 1
  wlog "counter.cpufreq = " + STR$(counter.cpufreq) + "  Actual freq = " + STR$(counter.cpufreq / 1.9529383)
  pause 1000
wend
WLOG as:

''FREQ = 500Hz

counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 994 Actual freq = 508.97665
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 976 Actual freq = 499.75977
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182
counter.cpufreq = 977 Actual freq = 500.27182

'FREQ = 50KHz

counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97646 Actual freq = 49999.531
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97646 Actual freq = 49999.531
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97646 Actual freq = 49999.531
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044
counter.cpufreq = 97647 Actual freq = 50000.044

'FREQ = 5MHz

counter.cpufreq = 9764558 Actual freq = 4999931.6
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764690 Actual freq = 4999999.2
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764690 Actual freq = 4999999.2
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
counter.cpufreq = 9764691 Actual freq = 4999999.7
You do not have the required permissions to view the files attached to this post.
videobelu
Posts: 73
Joined: Fri Feb 12, 2021 4:25 pm
Location: Villar Perosa
Has thanked: 140 times
Been thanked: 16 times

Re: Undocumented frequency counter

Post by videobelu »

Thank you for this interesting feature.
I tested with my ESP32 module and I verified that the maximum operating frequency is around 15 Mhz.
I used the code of Palm Liu correcting a little' the division constant to get the right reading
Screenshot 2022-12-07 09.47.30.png
IMG_20221207_093953.jpg
IMG_20221207_094646.jpg
This is the final code i used

counter.init 33 'use pin 33 as input
while 1
wlog "counter.cpufreq = " + STR$(counter.cpufreq) + " Actual freq = " + STR$(counter.cpufreq / 1.952955)
pause 1000
wend
You do not have the required permissions to view the files attached to this post.
Fabrizio Bellini
User avatar
cicciocb
Site Admin
Posts: 1900
Joined: Mon Feb 03, 2020 1:15 pm
Location: Toulouse
Has thanked: 407 times
Been thanked: 1271 times
Contact:

Re: Undocumented frequency counter

Post by cicciocb »

Thanks to both you for the testing, I was nearly sure that something changed, I just need to "fix" the opening time to have the correct reading.

However, I'm curious about the 15MHZ limit, it should be higher than this (40MHz); could you try to use another input pin?
Eventually adjust the range / offset (I see that you have +5V with 0 offset, I think it should be 3V with 1.5V offset)

The H/W counters also have an input filter to limit the noise so maybe I need to check if are enabled (normally should be disabled)
videobelu
Posts: 73
Joined: Fri Feb 12, 2021 4:25 pm
Location: Villar Perosa
Has thanked: 140 times
Been thanked: 16 times

Re: Undocumented frequency counter

Post by videobelu »

I try same input and other input with 3Vpp and 1,5V offset max stable reading 17 Mhz

Fabrizio
Fabrizio Bellini
User avatar
cicciocb
Site Admin
Posts: 1900
Joined: Mon Feb 03, 2020 1:15 pm
Location: Toulouse
Has thanked: 407 times
Been thanked: 1271 times
Contact:

Re: Undocumented frequency counter

Post by cicciocb »

[Local Link Removed for Guests] wrote: [Local Link Removed for Guests]Wed Dec 07, 2022 10:19 am I try same input and other input with 3Vpp and 1,5V offset max stable reading 17 Mhz

Fabrizio
OK thanks, in the while I found the problem and I'm testing using the PWM as signal generator.
I can reach 20MHz so far
videobelu
Posts: 73
Joined: Fri Feb 12, 2021 4:25 pm
Location: Villar Perosa
Has thanked: 140 times
Been thanked: 16 times

Re: Undocumented frequency counter

Post by videobelu »

A question, would there be the possibility of applying the 1Hz signal from the outside to control the meter reading?
I noticed that unfortunately due to the little stability of the internal oscillator of the ESP32 the reading slowly varies

Fabrizio
Fabrizio Bellini
User avatar
cicciocb
Site Admin
Posts: 1900
Joined: Mon Feb 03, 2020 1:15 pm
Location: Toulouse
Has thanked: 407 times
Been thanked: 1271 times
Contact:

Re: Undocumented frequency counter

Post by cicciocb »

Yes, it could be possible but it will be without any particular interest
videobelu
Posts: 73
Joined: Fri Feb 12, 2021 4:25 pm
Location: Villar Perosa
Has thanked: 140 times
Been thanked: 16 times

Re: Undocumented frequency counter

Post by videobelu »

[Local Link Removed for Guests] wrote: [Local Link Removed for Guests]Wed Dec 07, 2022 12:35 pm Yes, it could be possible but it will be without any particular interest
Only for have a more precision reading.....for example if a 1PPs is feed from a GPSDO

Fabrizio
Fabrizio Bellini
User avatar
cicciocb
Site Admin
Posts: 1900
Joined: Mon Feb 03, 2020 1:15 pm
Location: Toulouse
Has thanked: 407 times
Been thanked: 1271 times
Contact:

Re: Undocumented frequency counter

Post by cicciocb »

Yes, I understood the scope but this will require a GPS or another precise source .....
I think that it goes largely beyond the general interest
Post Reply