theove
Take care to get what you like or you will be forced to like what you get
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)
theove
Take care to get what you like or you will be forced to like what you get
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.
theove
Take care to get what you like or you will be forced to like what you get
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.