- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 2 von 2

Thema: Highspeed-Drehzahlmessung über Lichtschranke - Fortsetzung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2005
    Beiträge
    29

    Highspeed-Drehzahlmessung über Lichtschranke - Fortsetzung

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    hmmm ... nen langsameren Quarz nehmen am Einfachsten denk ich

    oder in etwa so:
    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 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
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress