Pulse counting problem
Pulse counting problem
Hello
I'm makin device for my dirtbike which measure time, speed and trip. Speed and time works fine, but i do not know how to measure trip correctly. Now the trip increases too fast compared to speed, about 1km in 10-20s if speed is about 60 km/h. Here is my program attached, so can somebody help me please.
I know that the speed resolution is not very good, but i know how to fix it.
My dirtbike wheel circumference is 2.1m
Second thing what in do not understand is, why i have to use negative value to get positive results?
example:
freq_float = fsub(freq_float,-1)
BR
Ossi
I'm makin device for my dirtbike which measure time, speed and trip. Speed and time works fine, but i do not know how to measure trip correctly. Now the trip increases too fast compared to speed, about 1km in 10-20s if speed is about 60 km/h. Here is my program attached, so can somebody help me please.
I know that the speed resolution is not very good, but i know how to fix it.
My dirtbike wheel circumference is 2.1m
Second thing what in do not understand is, why i have to use negative value to get positive results?
example:
freq_float = fsub(freq_float,-1)
BR
Ossi
- Attachments
-
- Laskuri.c
- (19.34 KiB) Downloaded 409 times
-
- Laskuri.fcf
- (14.51 KiB) Downloaded 412 times
-
- Flowcode v5 User
- Posts: 28
- Joined: Wed Oct 02, 2013 12:16 pm
- Has thanked: 7 times
- Been thanked: 7 times
Re: Pulse counting problem
I'll try and help but I'm not really sure what the set up is and how your program works. And I'm the one usually scratching my head
I guess the input is coming from some sort of switch on the final drive?
The way I would do it is something like this:
Count=Count+1
Trip=Count*(0.0021/Counts per wheel revolution)
If I have got that right, it should give you the distance in Km's.

I guess the input is coming from some sort of switch on the final drive?
The way I would do it is something like this:
Count=Count+1
Trip=Count*(0.0021/Counts per wheel revolution)
If I have got that right, it should give you the distance in Km's.
Could it be because you are subtracting a negative. Do you get the same result with freq_float = fadd(freq_float,1)Second thing what in do not understand is, why i have to use negative value to get positive results?
example:
freq_float = fsub(freq_float,-1)
Re: Pulse counting problem
I try to explain beter how the program works (in my opininion):
- Program is based : Flowcode V4 examples --> 5. Digital frequency counter
- It uses TMR0 interrupt (16 interrupts = 1s)
- Macro "tulo" = input pulses from wheel
- Macro "kello_laskutoimitus" = Timer calculations seconds, minutes and hours.
- Macro "LCD_tulostus" = LCD printing
- tmr_service = interrupt
- main = main program
Trip calculation is bellow the trip comment in main program:
float_matka = fmul(freq_float2,0.0021) // 0.0021km = 2.1m = which is dirtbike wheel circumference
float_matka_total = fsub(float_matka_total,float_matka)
freq_float2 = freq_float2 +1 // rising variable freq_float2 +1 after the 1 second is passed the freq_float2 get value 0 and it starts all over again.
In Flowcode simulation it seems to work, but in my circuit it kind of multiplies the trip value depending wheel speed/frequency.
If you press play button in simulation and use (pulsing) that input switch(0), you can see that the trip value increasing. I dont understand why it is not work correctly in my circuit
-----------------------------------
Second problem
If i use negative value:
freq_float = fsub(freq_float,-1)
i get positive results 1, 2, 3...
If i use postive value
freq_float = fsub(freq_float,1)
i get negative results -1, -2, -3...
I hope you understand my explanations, beacause my english skils are not very good.
Here is attachment that "Digital frequency counter"
- Program is based : Flowcode V4 examples --> 5. Digital frequency counter
- It uses TMR0 interrupt (16 interrupts = 1s)
- Macro "tulo" = input pulses from wheel
- Macro "kello_laskutoimitus" = Timer calculations seconds, minutes and hours.
- Macro "LCD_tulostus" = LCD printing
- tmr_service = interrupt
- main = main program
Trip calculation is bellow the trip comment in main program:
float_matka = fmul(freq_float2,0.0021) // 0.0021km = 2.1m = which is dirtbike wheel circumference
float_matka_total = fsub(float_matka_total,float_matka)
freq_float2 = freq_float2 +1 // rising variable freq_float2 +1 after the 1 second is passed the freq_float2 get value 0 and it starts all over again.
In Flowcode simulation it seems to work, but in my circuit it kind of multiplies the trip value depending wheel speed/frequency.
If you press play button in simulation and use (pulsing) that input switch(0), you can see that the trip value increasing. I dont understand why it is not work correctly in my circuit

-----------------------------------
Second problem
If i use negative value:
freq_float = fsub(freq_float,-1)
i get positive results 1, 2, 3...
If i use postive value
freq_float = fsub(freq_float,1)
i get negative results -1, -2, -3...
I hope you understand my explanations, beacause my english skils are not very good.
Here is attachment that "Digital frequency counter"
- Attachments
-
- 5. Digital frequency counter.fcf
- (14 KiB) Downloaded 406 times
-
- Matrix Staff
- Posts: 9521
- Joined: Sat May 05, 2007 2:27 pm
- Location: Northamptonshire, UK
- Has thanked: 2585 times
- Been thanked: 3815 times
Re: Pulse counting problem
Hi Ossi,
On your hardware What value crystal are you using for you clock (have you got a part number for it)?
Have you considered INT0 rather than a tight loop for detecting wheel speed?
Martin
On your hardware What value crystal are you using for you clock (have you got a part number for it)?
Have you considered INT0 rather than a tight loop for detecting wheel speed?
Martin
Martin
Re: Pulse counting problem
Hellomedelec35 wrote:Hi Ossi,
On your hardware What value crystal are you using for you clock (have you got a part number for it)?
Have you considered INT0 rather than a tight loop for detecting wheel speed?
Martin
I use 4194304 Hz crystal and PIC16f887. These interrupts in program are new thing for me, so i dont know how to use INT0 in my case.
-
- Matrix Staff
- Posts: 9521
- Joined: Sat May 05, 2007 2:27 pm
- Location: Northamptonshire, UK
- Has thanked: 2585 times
- Been thanked: 3815 times
Re: Pulse counting problem
Hi Ossi, problem with counting over 1 second periods and 2.1m wheel circumference is if there are 10 det per sec then Kmh = 2.1*10*3.6 = 75.6
Yet if only one less detection per second then speed = 68.04 Kmh so the resolution is not that great.
So as an experiment, I have tried to compensate by using 5 seconds of detection time instead of 1 second.
The disadvantage id speed is updated every 5 seconds of course.
I have also used INT0 interrupr, so that does require a change of hardware.
i.e LCD = PortC and freq detection i on pin B0
This may or may not work?
If detection device is normally high, and when wheel is triggering detection sensor it goes low, then you will need to change RB0INT interrupt edge detection (within int properties) from rising edge to falling edge
Due ot low resolution and to make more efficient, I have removed all float variables.
Martin
Yet if only one less detection per second then speed = 68.04 Kmh so the resolution is not that great.
So as an experiment, I have tried to compensate by using 5 seconds of detection time instead of 1 second.
The disadvantage id speed is updated every 5 seconds of course.
I have also used INT0 interrupr, so that does require a change of hardware.
i.e LCD = PortC and freq detection i on pin B0
This may or may not work?
If detection device is normally high, and when wheel is triggering detection sensor it goes low, then you will need to change RB0INT interrupt edge detection (within int properties) from rising edge to falling edge
Due ot low resolution and to make more efficient, I have removed all float variables.
Martin
- Attachments
-
- Laskuri V2.fcf
- (15.69 KiB) Downloaded 376 times
Martin
-
- Matrix Staff
- Posts: 9521
- Joined: Sat May 05, 2007 2:27 pm
- Location: Northamptonshire, UK
- Has thanked: 2585 times
- Been thanked: 3815 times
Re: Pulse counting problem
Just had a thought on two things and wondering it's worth proceeding?
1) For better accuracy of updating every second, it it possible to have more than one triggering magnet (assuming hall effect device)?
The more magnets the accurate it would be.
Or
Rather than count revs per second or even revs per 5 seconds, how about using the Speed = distance over time?
We know the distance = 2.1 mtrs, so we can using an interrupt timer to time between pulses.
Once we have the time, then speed = 2.1/time taken between pulses.
1) For better accuracy of updating every second, it it possible to have more than one triggering magnet (assuming hall effect device)?
The more magnets the accurate it would be.
Or
Rather than count revs per second or even revs per 5 seconds, how about using the Speed = distance over time?
We know the distance = 2.1 mtrs, so we can using an interrupt timer to time between pulses.
Once we have the time, then speed = 2.1/time taken between pulses.
Martin
Re: Pulse counting problem
Hi
My main problem is tripmeter/odometer, not the speedometer. Like i sayd in my first post, I know that the speedometer resolution is not so good and like you said Martin in previously post, i propably add more magnets to get beter resolution.
Specs/functions for my meter:
- Speedometer, resolution 1km/h, max value about 100km/h
- Odometer/tripmeter , resolution 0.1km, max value 9999.9km , can set to zero
- Hourmeter, shows seconds, minutes and hours, max value hours 3 digits, can set to zero
- Saves data (hours, minutes, seconds and odo) in eeprom when engine is off
- Meter starts when engine is on
So can i done this all with based my program version "Laskuri" or Martin version "laskuri_V2" if can not, can somebody tell me beter solution. I'm also very glad if somebody tell why my "odometer" in my first post not working correctly.
Hopefully you understand what i mean.
Ossi
My main problem is tripmeter/odometer, not the speedometer. Like i sayd in my first post, I know that the speedometer resolution is not so good and like you said Martin in previously post, i propably add more magnets to get beter resolution.
Specs/functions for my meter:
- Speedometer, resolution 1km/h, max value about 100km/h
- Odometer/tripmeter , resolution 0.1km, max value 9999.9km , can set to zero
- Hourmeter, shows seconds, minutes and hours, max value hours 3 digits, can set to zero
- Saves data (hours, minutes, seconds and odo) in eeprom when engine is off
- Meter starts when engine is on
So can i done this all with based my program version "Laskuri" or Martin version "laskuri_V2" if can not, can somebody tell me beter solution. I'm also very glad if somebody tell why my "odometer" in my first post not working correctly.
Hopefully you understand what i mean.
Ossi
-
- Matrix Staff
- Posts: 9521
- Joined: Sat May 05, 2007 2:27 pm
- Location: Northamptonshire, UK
- Has thanked: 2585 times
- Been thanked: 3815 times
Re: Pulse counting problem
Hi Ossi,
I understand what your saying but I was working on the principle of getting the speed more accurate before working on Odometer.
Bad resolution Speedometer = way out Odometer multiplied several times.
If you can test Speedometer and it's reasonably accurate, then I can progress with the Odometer/tripmeter.
No use working on the latter if the former is not that good.
Also if circumference is 2.1 meters and you have an accurate speedometer, then if I have worked it out correctly
After 47 lots of 2.1meters = 98.7 mtrs = 0.0987 Km
or after 48 lots of 2.1meters = 100.8 mtrs = 0.1008 Km
That's about as accurate as you can get.
I can implement that , then post update flowchart.
Would that be helpful?
Martin
I understand what your saying but I was working on the principle of getting the speed more accurate before working on Odometer.
Bad resolution Speedometer = way out Odometer multiplied several times.
If you can test Speedometer and it's reasonably accurate, then I can progress with the Odometer/tripmeter.
No use working on the latter if the former is not that good.
Also if circumference is 2.1 meters and you have an accurate speedometer, then if I have worked it out correctly
After 47 lots of 2.1meters = 98.7 mtrs = 0.0987 Km
or after 48 lots of 2.1meters = 100.8 mtrs = 0.1008 Km
That's about as accurate as you can get.
I can implement that , then post update flowchart.
Would that be helpful?
Martin
Martin
Re: Pulse counting problem
Hello Martin
Program works in Flowcode but not in my circuit. I change LCD port to B and button back to D0 , but LCD prints only 1x 16 beams/bars. For me good resoluotion is 1km/h(speedometer) and 0.1km in odometer. I try to figure out tomorrow, why program is not working in my circuit.
That would be nice. If you could add some explanation comments in program for me.
Thanks
Program works in Flowcode but not in my circuit. I change LCD port to B and button back to D0 , but LCD prints only 1x 16 beams/bars. For me good resoluotion is 1km/h(speedometer) and 0.1km in odometer. I try to figure out tomorrow, why program is not working in my circuit.
That would be nice. If you could add some explanation comments in program for me.
Thanks
-
- Matrix Staff
- Posts: 9521
- Joined: Sat May 05, 2007 2:27 pm
- Location: Northamptonshire, UK
- Has thanked: 2585 times
- Been thanked: 3815 times
Re: Pulse counting problem
Hi ossir,
This is using B0int (interrupt) for 1rev detection.
Will not work with sensor connected to D0
LCD must be on portC
Port b does have weak pull-ups so I have enabled them.
This means that a pull-up resistor is not required.
I have modified flowchart to work with pull-ups.
The sensor has to be connected between 0V and B0
the trip reset switch has to be connected between 0V and B1
The Flowchart is a bit complex as it was more difficult than I first thought to get a reading up to 9999.9 without using any floats as they are not recommend with 8bit pics.
Was beginning to think I have bitten off more than I can chew.
If it does work then IU can add more comments to flowchart.
Just did not have enough time tonight.
Note simulator is not in real time so you will notice seconds incrementing by 2
Should be ok on hardware?
If it does not work then can you post a circuit diagram of your full set up.
Martin
This is using B0int (interrupt) for 1rev detection.
Will not work with sensor connected to D0
LCD must be on portC
Port b does have weak pull-ups so I have enabled them.
This means that a pull-up resistor is not required.
I have modified flowchart to work with pull-ups.
The sensor has to be connected between 0V and B0
the trip reset switch has to be connected between 0V and B1
The Flowchart is a bit complex as it was more difficult than I first thought to get a reading up to 9999.9 without using any floats as they are not recommend with 8bit pics.
Was beginning to think I have bitten off more than I can chew.
If it does work then IU can add more comments to flowchart.
Just did not have enough time tonight.
Note simulator is not in real time so you will notice seconds incrementing by 2
Should be ok on hardware?
If it does not work then can you post a circuit diagram of your full set up.
Martin
- Attachments
-
- Laskuri V2a.fcf
- (22.25 KiB) Downloaded 340 times
Martin
Re: Pulse counting problem
Hi Martin
Now it seems almost working, there is couple of bugs what i notice:
- Trip reset button not working
- when input frequency is about 13.23Hz = 100km/h, speedometer shows 101.3km/h or 997.9km/h, correct value maybe 97.9 km/h
Other questions:
- Is there some way to measure how long 1 second in circuit actually is with oscilloscope, or shorter time which is proportional to 1second? Now i have to compare it to my pc clock, which needs time before i can see error with my eye. In this device it's not super important to have 1.00000000000s accuracy, but it's nice to now if it can measure.
- What about temperature, how it will affect timer operation for example -20°C compared to +20°C ?
- Now resolution of speedometer is about 1.5km/h and 5 second update time. I think i use 3 magnets and 2 second update time, so then resolution is about 1.26 km/h if i'm right?
Ossi
Now it seems almost working, there is couple of bugs what i notice:
- Trip reset button not working
- when input frequency is about 13.23Hz = 100km/h, speedometer shows 101.3km/h or 997.9km/h, correct value maybe 97.9 km/h
Other questions:
- Is there some way to measure how long 1 second in circuit actually is with oscilloscope, or shorter time which is proportional to 1second? Now i have to compare it to my pc clock, which needs time before i can see error with my eye. In this device it's not super important to have 1.00000000000s accuracy, but it's nice to now if it can measure.
- What about temperature, how it will affect timer operation for example -20°C compared to +20°C ?
- Now resolution of speedometer is about 1.5km/h and 5 second update time. I think i use 3 magnets and 2 second update time, so then resolution is about 1.26 km/h if i'm right?
Ossi
-
- Matrix Staff
- Posts: 9521
- Joined: Sat May 05, 2007 2:27 pm
- Location: Northamptonshire, UK
- Has thanked: 2585 times
- Been thanked: 3815 times
Re: Pulse counting problem
Hi Ossi
go along.
All untested.
If you change that, trip reset should work.
Dont forget line is pulled to 0 to reset trip.
Wonder if its better to round to a whole number and drop the d.p?
e,g.
calculation box: Toggle = ! Toggle
Output: Toggle>portb2
Then place scope on portb2. pulse length should be 1 sec. freq= 0.5Hz
Martin
Not got any more time to work out accuracy as i'm currently at work. beside not an expert on that side of things.
Do you think it's better than you had before and is worth pursuing with the way flowchart is now done?ossir wrote:Now it seems almost working,
Was expecting a few but as I did not have correct hardware and was making it up as Iossir wrote:there is couple of bugs
go along.
All untested.
It looks like I have selected to read all of port B instead of B1 on the input icon.ossir wrote:Trip reset button not working
If you change that, trip reset should work.
Dont forget line is pulled to 0 to reset trip.
I will look into that tonight.ossir wrote:when input frequency is about 13.23Hz = 100km/h, speedometer shows 101.3km/h or 997.9km/h, correct value maybe 97.9 km/h
Wonder if its better to round to a whole number and drop the d.p?
I would guess the accuracy at the two temperatures would be dependant on the crystal accuracy. for that you would need to look at the crystal data sheet.ossir wrote:- What about temperature, how it will affect timer operation for example -20°C compared to +20°C
What about placing an output at the 1sec part with a toggle calculation.ossir wrote:- Is there some way to measure how long 1 second in circuit actually is with oscilloscope, or shorter time which is proportional to 1second? Now i have to compare it to my pc clock, which needs time before i can see error with my eye. In this device it's not super important to have 1.00000000000s accuracy, but it's nice to now if it can measure.
e,g.
calculation box: Toggle = ! Toggle
Output: Toggle>portb2
Then place scope on portb2. pulse length should be 1 sec. freq= 0.5Hz
Martin
Not got any more time to work out accuracy as i'm currently at work. beside not an expert on that side of things.
Martin
-
- Matrix Staff
- Posts: 9521
- Joined: Sat May 05, 2007 2:27 pm
- Location: Northamptonshire, UK
- Has thanked: 2585 times
- Been thanked: 3815 times
Re: Pulse counting problem
I have made some changes and hoping Its right.
Tested on a simulator only.
Set simulator to pulse low approx every 75ms and speed is showing as 99kmh which I believe is about Correct: I have calculated speed deriving from pulse from:
Speed = (1/pulse_Duration)*2.1*3.6
= Freq *2.1*3.6
13.3*7.56
= 100
Not sure how accurate the 70ms pulse is, but it does not seem that far out from expected results.
Greatly increased simulation speed so 1 hour takes a few minutes, and here are the results: Results are as near as expected. I know it should read 99 but it's only a simulation.
Martin
Tested on a simulator only.
Set simulator to pulse low approx every 75ms and speed is showing as 99kmh which I believe is about Correct: I have calculated speed deriving from pulse from:
Speed = (1/pulse_Duration)*2.1*3.6
= Freq *2.1*3.6
13.3*7.56
= 100
Not sure how accurate the 70ms pulse is, but it does not seem that far out from expected results.
Greatly increased simulation speed so 1 hour takes a few minutes, and here are the results: Results are as near as expected. I know it should read 99 but it's only a simulation.
Martin
- Attachments
-
- Laskuri V2c.fcf
- (20 KiB) Downloaded 330 times
Martin
Re: Pulse counting problem
Hello Martin
It seems to work similarly like in your simulation, so i'm happy with that.
Now i need to make some final adjustments and finalize the program.
Thanks a lot for your help Martin
It seems to work similarly like in your simulation, so i'm happy with that.
Now i need to make some final adjustments and finalize the program.
Thanks a lot for your help Martin
-
- Matrix Staff
- Posts: 9521
- Joined: Sat May 05, 2007 2:27 pm
- Location: Northamptonshire, UK
- Has thanked: 2585 times
- Been thanked: 3815 times