Ik heb een toerenteller in PIC basic. Het maakt gebruik van de CCP module en weergave via LCD.

Dit is het programma, fuses ect. staan er niet bij.


' PIC16F876A

' mimimum gewenst bereik is 600 toeren per minuut
' 600 tpm = 10 tpsec 
' 10 tpsec = 1000000 us
' 1 toer duurt 100000 us

' XTAL = 20 MHz

' PRESCALER TIMER1 = 1:1
' elke 2 us een count
' overflow bij 65535 counts
' overflow bij 131070 us
' aantal toeren (flanken) dat theoretisch langs komt voor overflow: 1,31

' PRESCALER TIMER1 = 1:2
' elke 4 us een count
' overflow bij 65535 counts
' overflow bij 262140 us
' aantal toeren (flanken) dat theoretisch langs komt voor overflow: 2,62

' PRESCALER TIMER1 = 1:4
' elke 8 us een count
' overflow bij 65535 counts
' overflow bij 524280 us
' aantal toeren (flanken) dat theoretisch langs komt voor overflow: 5,24

' PRESCALER TIMER1 = 1:8
' elke 16 us een count
' overflow bij 65535 counts
' overflow bij 1048560 us
' aantal toeren (flanken) dat theoretisch langs komt voor overflow: 10,49

' ***** include *****


  ' Variabelen voor Capture   
        DIM PERIOD AS WORD                                            ' Periode = word; 16bit (65535)
	DIM TIMEuS AS WORD                                            ' Tijd us = word; 16bit (65535)
		    
  ' Variabelen voor berekeningen		
        DIM FREQUENCY AS FLOAT                                        ' Frequentie = word; 16bit (65535)
        DIM RPM AS DWORD                                              ' Toerental = word; 16bit (65535)
        
        TRISC.2 = 1                                                   ' Pin C.2 = CCP1 = INPUT
        PIE1.2 = 1                                                    ' CCP1 INTERRUPT ENABLE; BIT 2 PIE1 register
        INTCON.7 = 1                                                  ' Global Interrupt Enable bit; BIT 7 INTCON register
                         
	SYMBOL CCPR1 = CCPR1L.WORD	            ' Maakt een 16-bit variabele van CCPRL1
        SYMBOL TIMER1 = TMR1L.WORD	            ' Maakt een 16-bit variabele van TMR1L
        SYMBOL CAPTURE = PIR1.2		            ' CCP1 capture flag
	SYMBOL OVERFLOW	= PIR1.0	            ' Timer1 overflow flag
		
        DELAYMS 200                                                   ' Stabilisatieperiode PIC
        CLEAR                                                         ' RAM wissen
        CLS                                                           ' LCD wissen
 
  'Keuze flankmeting:

                  ;76543210
        CCP1CON = %00000101		              ' CCP1 capture, elke stijgende flank; BIT 3-0 = 0101
   '    CCP1CON = %00000110		              ' CCP1 capture, elke 4e stijgende flank; BIT 3-0 = 0110
   '    CCP1CON = %00000111		              ' CCP1 capture, elke 16e stijgende flank; BIT 3-0 = 0111

  'Keuze clock prescaler:
             
                ;76543210                                             ' BIT 0 = aanzetten timer
    '   T1CON = %00110001                                             ' TMR1 prescaler = 1:8 (16uS per count); BIT 5-4 = 11
         T1CON = %00100001                           ' TMR1 prescaler = 1:4 (8uS per count); BIT 5-4 = 10
    '   T1CON = %00010001                                             ' TMR1 prescaler = 1:2 (4uS per count); BIT 5-4 = 01
    '   T1CON = %00000001                                             ' TMR1 prescaler = 1:1 (2uS per count); BIT 5-4 = 00

                                         
WHILE 1 = 1                                                           ' Start oneindige lus
WHILE CAPTURE = 0 : WEND		                                ' Wacht op capture        
           PERIOD = CCPR1   				                                  ' Sla CAPTURE periode op in PERIOD
           TIMEuS = CCPR1                                             ' Sla CAPTURE periode op in TIMEuS
	IF OVERFLOW = 0 THEN			                                          ' Spring eruit bij een overflow
	PRINT AT 1,1, "Period: ", DEC PERIOD, "   "                  ' zet PERIOD op lcd
	PRINT AT 2,1, "TimeuS: ", DEC TIMEuS, "   "                  ' zet TIMEuS op lcd


    'Frequentieberekening afhankelijk van keuze flankdetectie: 				
	 '   FREQUENCY = 1000.0 / (PERIOD * 4)                        ' CCP1 capture, elke stijgende flank
	'   FREQUENCY = 1000.0 / PERIOD                              ' CCP1 CAPTURE, elke 4e stijgende flank
	'   FREQUENCY = 1000.0 / (PERIOD / 4)                        ' CCP1 CAPTURE, elke 16e stijgende flank	
						
				
    'Frequentie en toerenberekening&weergave:				
		FREQUENCY = 1000.0 / (PERIOD * 4)                     ' Bereken de frequentie
                PRINT AT 3,1, "Freq:   ", DEC FREQUENCY, " KHz  "     ' frequentie op lcd zetten
                
                RPM = FREQUENCY * 600                                 ' Bereken toerental 
                RPM = RPM * 100                                       ' Toerentalschaalverdeling = 100                
                
                PRINT AT 4,1, "RPM:    ", DEC RPM, " /min  "          ' toerental op lcd zetten
                PRINT AT 6,1, "         "
  ELSE
                PRINT AT 6,1, "OVERFLOW "                             ' overflow op lcd zetten
                
  ENDIF
			    CAPTURE = 0						                                      ' Clear de capture flag
	
			    WHILE CAPTURE = 0 : WEND		                                ' Wachten op start volgende peride
			    CLEAR TIMER1					                                      ' Clear Timer1
			    CAPTURE = 0						                                      ' Clear capture flag
			    OVERFLOW = 0					                                      ' Clear overflow flag	
WEND

Mijn vraag is eigenlijk eenvoudig; welke prescaler voor timer1 kan ik het best gebruiken om vanaf 600 toeren een vrij betrouwbaar resultaat te krijgen?

Bij 1:1 komen theoretisch op het maximale toerental 33 flanken voorbij (4000 us per flank)
Bij 1:2 komen theoretisch op het maximale toerental 65 flanken voorbij (4000 us per flank)
Bij 1:4 komen theoretisch op het maximale toerental 131 flanken voorbij (4000 us per flank)
Bij 1:8 komen theoretisch op het maximale toerental 262 flanken voorbij (4000 us per flank)

iemand een idee?

Alvast bedankt.

Welke nauwkeurigheid wil je bereiken? Hoeveel flanken komen er voorbij op het minimaal te meten toerental? Zoek een prescaler waarbij je zowel min als max toerental goed kunt onderscheiden.

De nauwkeurigheid wordt nu softwarematig in stappen van 100 weergegeven (rustiger beeld).

' mimimum gewenst bereik is 600 toeren per minuut
' 600 tpm = 10 tpsec
' 10 tpsec = 1000000 us
' 1 toer duurt 100000 us

' PRESCALER TIMER1 = 1:1
' elke 2 us een count
' overflow bij 65535 counts
' overflow bij 131070 us
' aantal toeren (flanken) dat theoretisch langs komt voor overflow: 1,31

' PRESCALER TIMER1 = 1:2
' elke 4 us een count
' overflow bij 65535 counts
' overflow bij 262140 us
' aantal toeren (flanken) dat theoretisch langs komt voor overflow: 2,62

' PRESCALER TIMER1 = 1:4
' elke 8 us een count
' overflow bij 65535 counts
' overflow bij 524280 us
' aantal toeren (flanken) dat theoretisch langs komt voor overflow: 5,24

' PRESCALER TIMER1 = 1:8
' elke 16 us een count
' overflow bij 65535 counts
' overflow bij 1048560 us
' aantal toeren (flanken) dat theoretisch langs komt voor overflow: 10,49

Wil je de grootste nauwkeurigheid bij een laag of hoog toerental?
Want 1:1 geeft de beste nauwkeurigheid bij een laag toerental, 1:16 bij een hoog toerental.

Of je doet het compleet anders: In een bepaalde tijd tel je een aantal pulsen en hoelang de tijd was voor die pulsen. Ook bepaal je dan hoevaak je het display updated moet worden (hoef je niet af te ronden op 100).

Bijvoorbeeld 4X per seconde het display updaten.
Met die methode krijg je een rustig display en bent op makkelijk op 1 rpm nauwkeurig.
Wel heb je iets meer code nodig.