- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi all,
I have to read the frequency of a square wave around 500kHz (50%).
What's the best way?
Can it be done with the Timer (HAL) by reading the width of the positive part of the wave?
https://infineon.github.io/psoc6hal/html/group__group__hal__timer.html#subsection_timer_snippet_1
Thank you
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Here is a standard gated design. 1 Hz resolution. If you change gate to .1s or .01s period you can reduce
the size of the gate logic hence saving resources but dropping resolution.
Because of the gate period of 1s that means latency to measurement is worst case
2 sec, as the source is a 2 Hz signal, high time used for gate. That can be cut by using
a PWM to develop 1s + a few additional clocks instead of the 1s low time of the 2 Hz.
Cut even further if you use 10, 100, 1000 Hz as gate, but resolution suffers proportionally.
I used the DDS for the test source.
Note you have to add the dependency to the DDS24 in order for it to compile. Or delete
it off schematic and hook up a pin in its place to the freq source you want to measure.
I also have reciprocal counter designs, but they are really intended for very low freq measurement.
Otherwise their resolution at 500 Khz very poor.
Attached DDS project and freq cntr project
Regards, Dana..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi @Marso ,
You should be able to do it because the default clk frequency is 1MHz,
Thanks,
Rakesh B G
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ok thanks for your reply,
I used the interrupt on the GPIO to start and stop the count:
void gpio_interrupt_handler(void* handler_arg, cyhal_gpio_event_t event)
if(rise == 1)
{
cyhal_timer_start(&timer_obj);
cyhal_gpio_write(P9_2, 1);
cyhal_gpio_enable_event(P9_0, CYHAL_GPIO_IRQ_FALL, GPIO_INTERRUPT_PRIORITY, true);
rise = 0;
}
else
{
cyhal_timer_stop(&timer_obj);
cyhal_gpio_write(P9_2, 0);
read_val = cyhal_timer_read(&timer_obj);
cyhal_timer_reset(&timer_obj);
cyhal_gpio_enable_event(P9_0, CYHAL_GPIO_IRQ_RISE, GPIO_INTERRUPT_PRIORITY, false);
rise = 1;
}
At this point I believe it is not the timer but the time lost in the interrupt.
Attached are the waveforms for 10kHz and 500kHz.
Is there a way to be faster in starting and stopping the timer?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Marso,
How accurate a frequency do you want to measure?
The source frequency to measure is 'around' 0.5 MHz. Do you need to measure the frequency with a tolerance or do you just need to detect the presence of 'about' a 0.5 MHz input?
For example if you want to measure a frequency of 0.5 MHz with +/- 10% tolerance you need a input decimation clock to the timer at least 10x the measurement frequency. This means the Timer input clock needs to be 0.5 * 10 MHz = 5 MHz.
The best way to measure the frequency with the Timer is to use the Capture input. This uses the HW of the Timer to capture the Timer at the input signal transitions with virtually no latency.
Using a CPU interrupt to read the counter has unpredictable latencies. which at a fast Timer clock can mean extra counts.
"Engineering is an Art. The Art of Compromise."
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for your reply.
>>> How accurate a frequency do you want to measure?
10% is fine.
I am new to using ModusToolbox, is there an example of how to use the timer capture input?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Marso,
My preferred tool is PSoC Creator.
Hopefully someone else can provide a useful Timer Capture example.
"Engineering is an Art. The Art of Compromise."
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
PSoC Creator versus Modus Toolbox is obsolete?
I don't see some PSoC62s in the PSoC Creator 4.4 device selector.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Following done in Creator.
Here is one method, used in stretching a regenerated pulse train -
You would have to raise clock, say to 24 Mhz, so you can oversample the
incoming waveform. Its resolution kind of poor, at 500 Khz thats a count of
48, so res is ~ .5 Khz
Another method used to get duty cycle and period (same limits as above) -
The advantage of above two methods is relatively low latency to result.
If you want hi res then you use a gate, 1 sec for 1 Hz res, but latency becomes
essentially the gate period.
Note above projects you have to look at max counting rate for counter components.
May force you to use ripple counter component, not UDB, or use a Verilog solution.
The non UDB basic counter clocks at -
Maybe the 74HC user community library component would be faster.
https://cypresscomstg.prod.acquia-sites.com/validated-components
Regards, Dana.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for your reply,
it would appear that the PSoC62 I use is not supported by PSoC Cretor.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Marso,
...
it would appear that the PSoC62 I use is not supported by PSoC Cretor.
Regretable. I've looked used MTB whether there are any examples of Timer Capture examples from Infineon. No luck. Someone outside of Infineon may have an example they can provide.
Any volunteers?
Can you provide the PSoC62xxx part you plan to use?
Also, have you committed GPIO assignments yet? Hopefully not. This would provide the best solution to a volunteer for a solution.
"Engineering is an Art. The Art of Compromise."
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Len, thanks for the support!
The part is CY8C6244AZI
The committed pins are:
P2.0 P2.1 P2.2 P2.3 P2.5 P2.7
P3.0 P3.1
P5.0 P5.1 P5.6 P5.7
P6.2 P6.3 P6.4 P6.5 P6.6 P6.7
P9.1
Thank you
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I can supply the project and you can cut/paste the code into modbus project.
Change whats different. The component setup straight forward.
Just a thought.
Regards, Dana.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ok Dana,
send me the project so I try.
Thank you
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Here is a standard gated design. 1 Hz resolution. If you change gate to .1s or .01s period you can reduce
the size of the gate logic hence saving resources but dropping resolution.
Because of the gate period of 1s that means latency to measurement is worst case
2 sec, as the source is a 2 Hz signal, high time used for gate. That can be cut by using
a PWM to develop 1s + a few additional clocks instead of the 1s low time of the 2 Hz.
Cut even further if you use 10, 100, 1000 Hz as gate, but resolution suffers proportionally.
I used the DDS for the test source.
Note you have to add the dependency to the DDS24 in order for it to compile. Or delete
it off schematic and hook up a pin in its place to the freq source you want to measure.
I also have reciprocal counter designs, but they are really intended for very low freq measurement.
Otherwise their resolution at 500 Khz very poor.
Attached DDS project and freq cntr project
Regards, Dana..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Found one error. User is limited to setting in counter dialog period to a minimum of 1,
but further reading of data sheet states clearly counter on reset/start,
starts at 0. I had been subtracting one in ISR when I read capture register,
so eliminated that mis- correction.
I also added LCD to display freq as a debug aid.
If I get time I will add USBUART to it for a PC interface.
Regards, Dana.