PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Highspeed-Drehzahlmessung über Lichtschranke - Fortsetzung



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

Vitis
18.10.2006, 23:43
hmmm ... nen langsameren Quarz nehmen am Einfachsten denk ich ;)

oder in etwa so:



$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 Tmess1 As String * 10
dim timerwert as word at &hb0
dim ueberlauf as byte at &hb1
dm lowbyte as byte at &Hb0

Zaehlerirq0 = 0


On Timer0 Timerirq
enable timer0

On Int0 Irq0
Enable Int0

Enable Interrupts

Do
Tmess1 = Str(timerwert)
Locate 1 , 1
Lcd Tmess1
Waitms 500
Loop


Irq0:
lowbyte=timer0
timerwert=0
timer0=0
Return
end

timerirq:
incr ueberlauf
return
end