Millisecond stopwatch

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
Anonymous
Not applicable

Hello, I am trying to create an accurate millisecond stopwatch which records the timing of external triggers. I would like to be able to record hours long samples but accurately time the stopwatch down to milliseconds. 

   

At the moment, I feel like my counter (see attached) is not recording accurately. 

   

For testing, my project has an internal 1s PWM, which when measured on a  scope is quite accurate.

   

This PWM fires an interrupt, which reads my Counter (which counts on an 1kHz clock). The main loop then prints this count number to my LCD, as well as the difference from the previous reading. I have as minimal work between interrupt fire and counter read as I can. 

   

The problem is, when I print the difference to my screen for the every 1s count read, I consistently get a difference of 993 counts, instead of the 1000 counts I expect. 

   

 

   

Can anyone offer any advice on how to improve the accuracy of my stopwatch counter? 

0 Likes
9 Replies
HeLi_263931
Level 8
Level 8
100 solutions authored 50 solutions authored 25 solutions authored

Use the capture feature of the counter. It allows a hardware signal to store the current counter value in a FIFO 8the capture register). When you then configure the counter to reset on capture, you are done 🙂

0 Likes
Anonymous
Not applicable

Thank you.

   

I've now tried the capture register part, but the difference was still coming out as 993.

   

Though, I have another question now. I'm using a 1khz signal into my PWM, which is generating a 1s signal, but according to the module it takes 992 to create a period of 1s.   Shouldn't this be 1000 for a 1s period?  Am I misunderstanding the PWM, or the Clock itself?

0 Likes
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

Your 1 kHz clock runs on 992.97Hz because you derive it from the 32.768kHz source from which you cannot get a true 1kHz.

   

Change your settings for the clocks and timers to get a clean source and count.

   

 

   

Bob

0 Likes
Anonymous
Not applicable

That was the problem. Thank you.

0 Likes
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

You are always welcome.

   

 

   

Bob

0 Likes
lock attach
Attachments are accessible only for community members.
Anonymous
Not applicable

Ok, I have a new issue.

   

I am using comparators on an external signal (on analog high impedance pins) as the input to my counter capture, which is set to capture at either edge.

   

I know for a fact that my analog signals are taking 28800 ms and  10 min , respectively, to switch high/low so the edges should at those time intervals. However, currently my LCD is still showing mostly 505ish ms (from my CyDelay(500) ) for both signals.

   

My LCD should only be showing numbers read from the Counter_n_Capture() api,  so this seems to indicate my capture FIFO is fireing all the time, but I can see the signals hold steady.  Is there anything else that could be fireing my captures, or could I be using something wrong? 

   

My project is attached, and I appreciate any advice.

0 Likes
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

You must reset the counter's interrupt cause by  counter_ReadStatusRegister(), The capture status bit is sticky and has to be read.

   

 

   

Bob

0 Likes
Anonymous
Not applicable

Thank you.
however, that doesn't explain why the actual value in the Capture register seems to be constantly updating.

   

I've tried clearing by Counter_1_ReadStatusRegister() inside the isr caused by the capture, and that hasn't changed the numbers at all. I still see the 505ish ms from the CyDelay,  instead of the  2880 ms I know the signal is taking.  

   

I've got my capture set to both edges, and the comparator should only be transistioning up/down every 2880 ms. So, I can't figure out why my difference from previous capture to current capture whould be 505 unless it's constantly capturing for some reason. 

   

 

   

Thank you for any assistance. 

0 Likes
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

As a try I would suggest to enable hysteresis in comparators to avoid oscillation.

   

 

   

Bob

0 Likes