PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehzahl messen - Oszilloskop



mdettki
01.08.2006, 22:01
Hallo,

ich kann meine errechnete Drehzahl nicht am Oszilloskop ablesen. Leider werde ich aus der Anleitung des Oszi nicht schlau und bräuchte mal Hilfe.
Mein Motor (aus CDROM 9Volt) läuft ab 10% PWM-Duty-Cycle.

Eine Encoderscheibe 120 Löcher liefert mir Interrupts. Diese lese ich alle 0,0335 Sekunden aus.


// *** Setup Timer0-Interrupt ***
OPTION = 7; //Vorteiler 256:1
TMR0 = 125; //256-131=125
T0IE = 1; /* enable TMR0 interrupt */



if (T0IF) // Ursache des Interrupts feststellen
{ /* TMR0 overflow interrupt */
TMR0 = 125;
ist_rpm=impuls*15; // (impuls*30*60)/120
impuls=0;
T0IF = 0; /* reset flag */
}

Die Drehzahlen sind auch plausibel zwischen 270 (10%) und 2745 U/Min (100%). Wenn ich mir nun jedoch am Oszilloskop das Signal der Lichtschranke ansehe errechne ich 1200 U/Min. Ich habe es auf 50 usec eingestellt und lese an der Einteilung 4 Low und 4 High-Bits ab. Also 8 von 10 Zeiteinheiten auf der x-Achse.
Wie errechne ich daraus die Drehzahl?

Vielen Dank für Eure Hilfe

sigo
01.08.2006, 22:30
8 x 50µs = 400µs
1/400µs = 2500Hz
2500/12 = 20,83U/s
20,83U/s * 60 = 1250 U/min

Ich würde normalerweise dem Oszi eher trauen, als der Software, solange diese nicht verifiziert wurde.

Evtl. noch kontrollieren, ob evtl. eine Spreizung der Ablenkung aktiv ist?

Sigo

mdettki
02.08.2006, 08:15
Danke Sigo,

nun gut, also habe ich die Drehzahl am Oszi richtig interpretiert. Das heisst mein Programm rechnet falsch...
Mein Pic läuft mit 4 MHz und ich nutze Timer0.
Die Ticks kommen nach dieser Formel: http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer0
Tick = 1/(4MHz/(4*256)) alle 0,00025 s.
Nun zähle ich bis 131, also 0,00025*131= 0,033536 sek.

Der Interrupt tritt demnach 30-mal in der Sekunde auf. Dort berechne ich nun die Drehzahl (Umdrehungen pro Minute) wie folgt:
ist_rpm= anzahl_impulse * 30 * 60 / 120= anzahl_impulse*15

Ich finde den Fehler einfach nicht... ](*,)

sigo
02.08.2006, 08:30
Schau doch mal nach, ob du vielleicht auf jede Flanke einen Interrupt bekommst. Bei einigen Controllern kann man bei jeder Transition einen Interrupt bekommen.

Just a thought. I´m no Pic Expert..

Sigo

sigo
02.08.2006, 08:33
Die Lichtschranke erzeugt ca. 2500Hz.
Wieso kommt dein Interrupt denn dann nur 30mal pro Sekunde?
????

mdettki
02.08.2006, 10:55
Ich arbeite mit zwei Interrupts. Ein externer, der an der Lichtschranke anliegt und einem internen zum messen der Zeit.

Der externe Interrupt wird bei jeder steigenden Flanke erzeugt. Wenn ich die Events zähle, also die Welle von Hand bewege wird korrekt gezählt.

Die Lichtschranke erzeugt also einen Interrupt. Dort zähle ich die Impulse. In einem weiteren Interrupt der alle 0,33536 Sekunden aufgerufen wird lese ich die gezählten Impulse aus und errechne mir die Drehzahl pro Minute.
Die Lichtschranke liefert mir High-Low-Signale, die sind OK (sehe ich ja am Oszi). Sie ist für bis zu 5000 U/Min ausgelegt.

Es muss am Code liegen. Irgendwas ist an meinen Timern faul.

piclover
02.08.2006, 12:32
du hast schon berücksichtigt dass schlussendlich der pic intern nur mit 1mhz arbeitet (OSC/4)?!
oder hast du nen 16mhz quartz angeschlossen?

mdettki
02.08.2006, 16:14
@piclover: Ja habe ich berücksichtigt.

Tick = 1/(4MHz/(4*256)) alle 0,00025 s.

Meine Variablen haben auch 16Bit Breite.
Hast Du vielleicht noch ein Stück Code um einen Timer0-IRQ zu erzeugen?
Ich habe nur was für 1ms Timer gefunden. Ich finde es aber doof 1000 mal pro Sekunde die Drehzahl zu bestimmen...

Ist das denn so richtig?

// *** Setup Timer0-Interrupt ***
OPTION = 7; //Vorteiler 256:1
TMR0 = 125; //256-131=125
T0IE = 1; /* enable TMR0 interrupt */
Kommen da 0,0335 raus?

mdettki
02.08.2006, 20:32
Zum debuggen hab ich den IRQ eine LED toggeln lassen und messe, das er diesen alle 10 ms aufruft. Nach meiner Rechnung sollten es aber alle 33,5 ms sein.

Wäre toll wenn jemand eine Erklärung dafür hat.
Ich benutze einen PIC 16F627 mit 4Mhz und CC5x als Compiler.