Lincolnmhkn
18.10.2006, 18:13
Hallo Allesamt!
Vielleicht erinnert ihr euch noch: Ich wollte eine Drehzahlmessung zusammenbasteln, die mir Drehzahlen von einem Modellbaumotor bis zu 15.000/min erfassen kann.
Der Versuchsaufbau steht nun und funktioniert auch soweit. Ich habe hierfür die Encoderscheibe umgemodelt, da ich nur einen Impuls pro Umdrehung benötige. Um das ganze zu verbessern habe ich etwa die Hälfte der Markierungen der Scheibe abgekratzt und die andere Hälfte abgeklebt, somit ist das Zeitfenster größer und ich bekomme auch am Oszi bei hohen Drehzahlen noch den gewünschten Impuls.
Nun hab ich aber eine weitere Frage:
Um die Drehzahl besser auswerten zu können habe ich den Interrupt so programmiert, dass dieser über den Timer0 (Timer1 benötige ich für das PWM-Signal) jeweils die Zeit zwischen zwei Impulsen misst.
Jetzt ist der Timer0 aber ja leider nur ein 8-Bit Timer. Er misst mir zwar den Zeitabstand schön konstant, fängt aber halt jedes Mal wenn er über die 255 kommt wieder bei 0 an zu zählen, er läuft also praktisch über.
Je schneller der Motor dreht, desto besser somit das Ergebnis da der Timer nicht mehr "überläuft".
Oh man, ich hoffe ich konnte das erklären...
Anbei der Code:
$regfile = "m16def.dat"
$crystal = 16000000
$framesize = 32
$swstack = 32
$hwstack = 32
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64
Baud 9600
Config Int0 = Falling
Config Timer0 = Timer , Prescale = 1024
Dim Vartime As Integer
Dim Tmess1 As String * 10
Dim Tstart As Byte
Dim Tende As Byte
Dim Tmess As Byte
Zaehlerirq0 = 0
On Int0 Irq0
Enable Int0
Enable Interrupts
Do
Tmess1 = Str(tmess)
Locate 1 , 1
Lcd Tmess1
Waitms 500
Loop
Irq0:
If Vartime = 0 Then
Tcnt0 = 0
Tstart = Tcnt0
Else
Tende = Tcnt0
Tmess = Tende - Tstart
Vartime = -1
End If
Vartime = Vartime + 1
Return
Hat mir jemand eine Idee wie ich die Zeit hier vernünftig herausbekomme?
Besten Dank und Gruß, Martin
Vielleicht erinnert ihr euch noch: Ich wollte eine Drehzahlmessung zusammenbasteln, die mir Drehzahlen von einem Modellbaumotor bis zu 15.000/min erfassen kann.
Der Versuchsaufbau steht nun und funktioniert auch soweit. Ich habe hierfür die Encoderscheibe umgemodelt, da ich nur einen Impuls pro Umdrehung benötige. Um das ganze zu verbessern habe ich etwa die Hälfte der Markierungen der Scheibe abgekratzt und die andere Hälfte abgeklebt, somit ist das Zeitfenster größer und ich bekomme auch am Oszi bei hohen Drehzahlen noch den gewünschten Impuls.
Nun hab ich aber eine weitere Frage:
Um die Drehzahl besser auswerten zu können habe ich den Interrupt so programmiert, dass dieser über den Timer0 (Timer1 benötige ich für das PWM-Signal) jeweils die Zeit zwischen zwei Impulsen misst.
Jetzt ist der Timer0 aber ja leider nur ein 8-Bit Timer. Er misst mir zwar den Zeitabstand schön konstant, fängt aber halt jedes Mal wenn er über die 255 kommt wieder bei 0 an zu zählen, er läuft also praktisch über.
Je schneller der Motor dreht, desto besser somit das Ergebnis da der Timer nicht mehr "überläuft".
Oh man, ich hoffe ich konnte das erklären...
Anbei der Code:
$regfile = "m16def.dat"
$crystal = 16000000
$framesize = 32
$swstack = 32
$hwstack = 32
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64
Baud 9600
Config Int0 = Falling
Config Timer0 = Timer , Prescale = 1024
Dim Vartime As Integer
Dim Tmess1 As String * 10
Dim Tstart As Byte
Dim Tende As Byte
Dim Tmess As Byte
Zaehlerirq0 = 0
On Int0 Irq0
Enable Int0
Enable Interrupts
Do
Tmess1 = Str(tmess)
Locate 1 , 1
Lcd Tmess1
Waitms 500
Loop
Irq0:
If Vartime = 0 Then
Tcnt0 = 0
Tstart = Tcnt0
Else
Tende = Tcnt0
Tmess = Tende - Tstart
Vartime = -1
End If
Vartime = Vartime + 1
Return
Hat mir jemand eine Idee wie ich die Zeit hier vernünftig herausbekomme?
Besten Dank und Gruß, Martin