PDA

View Full Version : Using CCP1 and CCP2 to measure instant fuel consumption



srspinho
- 19th July 2007, 14:45
Hello friends,

some time ago, I did a digital speedometer for my car using the following code to count pulses (written by Tim_B for Proton Basic)

==============================================

Define LCD_DREG PORTA
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5

REM Variables
TMR0_POSTCOUNT1 var WORD ' POSTSCALER COUNTERS
COUNT_RESULT var WORD ' THE RESULT OF THE COUNT
REFRESHED var BIT ' FLAG TO SAY COUNT REFRESHED

'-------------------------'
ON INTERRUPT GOTO PULSE_COUNT ' DEFINE WHERE TO JUMP TO ON AN INTERRUPT
'-------------------------'

GOTO INITIALIZE ' JUMP ALL INT CODE

'----- INTERRUPT CODE -------------------
Disable
PULSE_COUNT:
TMR0 = TMR0 + 7 ' RELOAD THE TIMER
TMR0_POSTCOUNT1 = TMR0_POSTCOUNT1 - 1
IF TMR0_POSTCOUNT1 = 0 THEN
TMR0_POSTCOUNT1 = 500 ' 1/4 sec (may need some adjust)
T1CON.0 = 0 ' TURN OFF THE TMR1
COUNT_RESULT.lowbyte = TMR1L ' GET THE COUNT
COUNT_RESULT.Highbyte = TMR1H ' GET THE COUNT
TMR1L = 0
TMR1H = 0
T1CON.0 = 1
REFRESHED = 1 ' SET FLAG TO SAY COUNT READ
ENDIF
INTCON.2 = 0 ' CLEAR INTTERUPT FLAG
Resume
enable ' RELOAD THE SYSTEM VARS
'------ END OF INTERRUPTS CODE ----------

'------ INTIALIzE ALL REGS --------------
INITIALIZE:

TMR0_POSTCOUNT1 = 500 ' INITIALZE THE POST SCALERS
OPTION_REG.0 = 0 ' SET THE PRESCALER TO 1:1
OPTION_REG.1 = 0
OPTION_REG.2 = 0
OPTION_REG.5 = 0 ' TMR0 CLOCK FROM MAIN OSC
OPTION_REG.3 = 0 ' IN THIS INSTANCE PRESCALER IS ASSINED TO TMR0
INTCON.2 = 0 ' CLEAR INTERRUPT FLAG
T1CON = %00000110
T1CON.0 = 1 ' TURN TIMER 1 ON
TMR0 = 7 ' LOAD THE TIMER
INTCON.5 = 1 ' ENABLE TMR0 INTERRUPTS
REFRESHED = 0 ' DONT MAKE FIRST READ UNTIL MAIN INT HAS OCCURED
INTCON.7 = 1 ' START THE WHOLE THING RUNNING
COUNT_RESULT = 0
pause 500
lcdout $FE,1



'------ MAIN CODE BELOW HERE -------------

LOOP:
IF REFRESHED = 1 THEN
lcdout $fe,1,$fe,2, "Freq = ", dec (COUNT_RESULT * 4) ' Show results in pulses / Sec
REFRESHED = 0 ' PREVENT A RE-READ UNTIL NEXT MAIN INTERRUPT
ENDIF
GOTO LOOP

END

===========================================

Well, I bought a new car (used, but newer than the other one). I had do modify a lot my circuit to make it working due to the Car´s Hall sensor strange bahavior. Now, it´s fixed.

But now, I would like to measure my instat fuel consumption, reading the Injector´s "on" time and the engine´s RPM (please, see http://www.eelkevisser.nl/fuel.htm )

I was reading the 16F877A datasheet and I noticed that CCP1 and CCP2 uses Timer1.

Is it possible to measure those two other parameters (engine´s RPM and Injector "on"-time) using the CCP1 and CCP2 without messing my interrupts ?

Sorry for my bad english !

Regards.

Sérgio

Bruce
- 19th July 2007, 16:22
Capture is not reliable with Timer1 in asynchronous counter mode. You're also
stopping & clearing Timer1 in your interrupt handler which would cause
problems with capture.

I would change to the 18F4431. This one has a Motion Feedback Module with
capture that uses Timer5, measures pulse widths or frequency, and it's really
easy to use.

The 18F4431 has everything you need.

Johan
- 20th July 2007, 04:13
Hi Bruce,

I am interested to use motion feedback module on 18F4431, could you please post sample code how to read the number of rotation ?

Thanks,

Johan

srspinho
- 20th July 2007, 12:15
Thanks Bruce !

I will check here were I live, if I can buy this device.

But, thank you for your advice !

Do you have tips on how to use the CCP4 and/or CCP5 on this device ?

Regards .

Sérgio

Bruce
- 20th July 2007, 16:43
Here's an example of measuring a 32kHz signal on RA2 with the Motion Feedback Capture. It's pretty simple to use.


DEFINE OSC 4
DEFINE DEBUG_REG PORTC
DEFINE DEBUG_BIT 6
DEFINE DEBUG_BAUD 9600
DEFINE DEBUG_MODE 0 ' 1 = inverted, 0 = true

T1 VAR WORD
T2 VAR WORD
T3 VAR WORD

Capture VAR PIR3.1
False CON 0
True CON 1

' auto time base reset, capture on rising to falling edge
RiseToFall CON %01000111
' auto time base reset, capture on falling to rising edge
FallToRise CON %01000110
' auto time base reset, frequency mode, capture on every rising edge
Frequency CON %01000101

ANSEL0 = 0 ' All digital
TRISA.2 = 1 ' Cap1 input pin (Capture input)
INTCON = 0 ' Interrupts off
TMR5H = 0 ' Clear high byte of TMR5 counter
TMR5L = 0 ' Clear low byte
T5CON = %00000001 ' prescale=1:1, int clock, TMR5=on

GOTO Main

Trash: ' Trash 1st capture after capture mode changes
Capture = False ' Reset capture flag
WHILE Capture = False ' Wait for capture
WEND '
Capture = False ' Reset capture flag
RETURN ' Return

Main:
GOSUB LtoH
GOSUB HtoL
GOSUB Freq
PAUSE 500
GOTO Main

LtoH:
' Capture on falling to rising edge
CAP1CON = FallToRise
GOSUB Trash
WHILE Capture = False
WEND
T1.HighByte = CAP1BUFH ' high byte
T1.LowByte = CAP1BUFL ' low byte

DEBUG "Low PW = ",DEC T1,"uS",13,10
RETURN

HtoL:
' Capture on rising to falling edge
CAP1CON = RiseToFall
GOSUB Trash
WHILE Capture = False
WEND
T2.HighByte = CAP1BUFH
T2.LowByte = CAP1BUFL

DEBUG "High PW = ",DEC T2,"uS",13,10
RETURN

Freq:
' Frequency measurement mode, capture every rising edge
' to measure period
CAP1CON = Frequency
GOSUB Trash
WHILE Capture = False
WEND
T3.HighByte = CAP1BUFH
T3.LowByte = CAP1BUFL

DEBUG "Freq = 1/",DEC T3,"uS",13,10
RETURN

END
Returns;
High PW = 17uS
Low PW = 14uS
Freq = 1/31uS

This 18F series has a boat-load of nifty features. Check out how fast the A/D
is. Should be a killer PIC for robotics applications.

srspinho
- 20th July 2007, 18:05
Thank you very Much Bruce !

regards .

Sérgio

mystified
- 11th September 2008, 03:02
duty var word
ansel0=%00000000 'all digital
'ansel1=%00000000


trisa=%11111111 'set all port a pins to input cap1,cap2,cap3
trisb=%00000000 'set all port b pins as output
portb=%00000000 'set port b to all zero
trisc = 2 ' rc1=flta input(ground pin 16 to stop) pin 16 high to run

'capture mode
intcon =0 'interrupts off
tmr5h = 0 'clean high byte of tm5 counter
tmr5l = 0 'clean low byte
t5con = %00000001 ' prescale 1:1, int clock, tmr5 =on

cap1con=%01000101 ' enable caputure,pulse width measurement mode,
'every rising o falling edge
cap2con=%01000101
cap3con=%01000101

where is the capture data go from here

' ovdcond=%00010010 'turn on / off pwm pins
'ovdcons=%00000000

'pcpwm init
dtcon = %00000101 'set deadtime to -500ns
ptcon0 =%00000000 ' 1:1 postscaale,fosc/4 1:1 prescale, free run mode
ptperl =0
ptperh=1
pwmcon0= %01010000 'pwm[5:0] output enabled 0100pwm4,5 independent,
'pwm0,1,2,3 complementary

pwmcon1=1 'update enable,overrides sync w/time

ptcon1=%10000000 'pwm time base is on, counts up
fltconfig = %00000011 ' enable fault a, cycle-by-cycle mode

duty =100 ' 50% =800
PDC2L = duty.lowbyte 'main a fixed 50% duty cycle on pwm4,5
PDC2H = duty.highbyte 'independent pwm outputs.

main:
for duty = 900 to 100 step-1 ' 10% to 90%
PDC0L = duty.lowbyte 'register controls pwm1/0
PDC0H = duty.highbyte
PDC1L = duty.lowbyte 'register controls pwm3/2
PDC1H = duty.highbyte
PDC3L = duty.lowbyte 'register controls pwm6/7
PDC3H = duty.highbyte
pause 50
next duty

pause 500' 1/2 second delay between ramp up / down

for duty = 100 to 900 ' 90% to 10%
PDC0L = duty.lowbyte
PDC0H = duty.highbyte
PDC1L = duty.lowbyte
PDC1H = duty.highbyte
PDC3L = duty.lowbyte
PDC3H = duty.highbyte
pause 5
next duty

pause 500' 1/2 second delay between ramp up / down

goto main

end

skimask
- 11th September 2008, 03:37
Here's how I monitor instant fuel consumption...

http://www.youtube.com/watch?v=7sUVMn4OJ58

mystified
- 19th September 2008, 11:58
trying to us motion feedback module with capture on state mode on pins 3,4,5

skimask
- 19th September 2008, 12:49
trying to us motion feedback module with capture on state mode on pins 3,4,5
What's the question/problem?

mystified
- 20th September 2008, 03:19
i want to set up a brushless dc motor control,I need to setup capxcon to input state change, (hall sensor as the inputs)
rest tmr5 if a change on cap1 or cap2 or cap3, us a ic interupst and ovdcond regisiters to turn on or off pwn channels (pins)in a sequence for rotation for the motor. How do I check the flags to turn on or off the channels ?(doc an899)

Archangel
- 20th September 2008, 08:35
Here's how I monitor instant fuel consumption...

http://www.youtube.com/watch?v=7sUVMn4OJ58

Looks great Jeremy, more on screen than my snap on scanner, what kind of display is that, a monitor? What are you measuring the fuel flow with? ( the mpg goes over 60 due to the computer shuts off the fuel completely when decellerating. Impressive work.

skimask
- 20th September 2008, 15:50
Looks great Jeremy, more on screen than my snap on scanner, what kind of display is that, a monitor?
http://www.sparkfun.com/commerce/product_info.php?products_id=569
It's the same screen that I posted the color lcd code to here awhile back.


What are you measuring the fuel flow with? ( the mpg goes over 60 due to the computer shuts off the fuel completely when decellerating. Impressive work.
Straight OBD2 data, mass air, temp, pressures, etc.etc.etc. Do enough math, mainly unit conversions and a bit of integration, and you can get almost anything you want out of OBD2...although the outputs are all 'estimated' because they're all derived from formulas with a few generic numbers (i.e. fudge factors) thrown in. But based on my driving over the past 8,000-ish miles, that 'estimation' seems to be quite accurate.
And when the mileage goes over 60...
The Nissan I've got ('98 200SX) isn't very aggressive at decel fuel cutoff like todays vehicles are. Based on my datalogging and calculations, if I'm doing 65mph and I let off the gas, I only get complete cutoff under certain conditions (above 2000 rpm, above 25mph, closed throttle, MAF below 500grams/sesc, MAP below 6 in/hg, calc.load.val below 10%). Other than that, I figure it goes open loop and tries to hit an A/F of about 25:1. Apparently, today's vehicles go to decel cutoff as soon as you think about slowing down (which accounts for some of todays vehicles being a just a little bit jerky at lower throttle settings in my experience).