PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Bascom AVR wie Counter benutzen??



bnitram
26.10.2012, 19:34
Hallo Forum,
Ich möchte mir einen Drehzahlmesser für einen alten 2 Takter bauen. Als Taktgeber würde ich dann einen Hallsensor benutzen. Als µC nehm ich ein ATmega8 und einen 8*2 LCD. Nun zu meinem eig. Problem. Wie kann ich dem Timer als Counter benutzen ??
Der Timer müsste dann später die "High" Impulse in 1sec. messen. Wie kann ich das in Bascom schreiben??
So viel hab ich schon verstanden:

Config Timer1 = Counter , Edge = Rising

Wie muss der Rest programmiert werden?? Also mit den Impulsen pro sec. die Ich später als Variable weiter verarbeiten kann.
Den Rest schaffe ich dann selber.

Mfg
bnitram

Sauerbruch
26.10.2012, 21:27
Der Timer müsste dann später die "High" Impulse in 1sec. messen.

Dafür muss der Controller auf jeden Fall exakt eine Sekunde abmessen können. Man könnte einen zweiten Timer so konfigurieren, dass er jede Sekunde überläuft, und in der ISR den als Counter konfigurierten Timer auslesen.

bnitram
26.10.2012, 21:32
Hallo Sauerbruch,
Danke für die Antwort.
Wie progge ich das dann??
Also wie ich eine Sekunde hinkrieg weiß ich. Aber in welcher Reihenfolge muss das kommen?? Oder wird das dann in einer Schleife geschrieben.

Mfg
bnitram

Sauerbruch
26.10.2012, 21:44
Sicherlich führen tausend Wege nach Rom - einer davon könnte so aussehen: Timer1 wird als Counter konfiguriert, ein zweiter timer als 1-Sekunden-Timer. In der ISR des 1-Sekunden Timers wird der Inhalt des Timer1 in eine Word-Variable übernommen, auf 0 zurückgesetzt und ein Flag gesetzt. In der Hauptschleife wird das Flag dann abgefragt, und wenn es gesetzt ist, wird die Word-Variable mit 60 multipliziert (weil´s ja Umdrehungen pro Minute sind), angezeigt, und das Flag gelöscht:




Config timer1 as counter, edge = rising

Config timer0 as timer.... '
On timer0 Sekunde
Enable timer0
Enable Interrupts

Dim RPM as word
Dim Flag as Bit

Do

If Flag = 1 then
RPM = RPM * 60
LCD RPM
Flag = 0
End if

Loop


Sekunde:
RPM = Timer1
Timer1=0
Flag = 1
Return




Das ist jetzt einfach nur mal ´ne Idee, auf blauen Dunst geschrieben und ungetestet!!

Thomas E.
26.10.2012, 21:45
Ich würde das anders angehen:
Statt in einem Zeitfenster von einer Sekunde Impulse zu zählen, würde ich eher die Zeit zwischen zwei Impulsen messen und dieses Ergebnis dann auf eine Sekunde aufrechnen.

bnitram
26.10.2012, 21:46
Vielen Dank auf jeden Fall schonmal. Ich werde den Code mal durchgehen und auch mal testen.

Mfg
bnitram

Edit:
Welche Methode ist den dann die bessere??

Sauerbruch
01.11.2012, 21:32
Welche Methode ist den dann die bessere??

Das ist schwer zu sagen - das kommt darauf an, welche Leistungsmerkmale im Einzelfall wichtig sind.
Der wesentliche Unterschied besteht in der Auflösung: Zählst Du während einer Sekunde die Umdrehungs-Impulse, ist die Drehzahl (in U/min) immer 60 * Zahl der Impulse. Das heißt, dass die angezeigte Drehzahl immer ein Vielfaches von 60 ist, und die Auflösung ebenfalls konstant 60 U/min beträgt.
Wertest Du aber die Zeit zwischen zwei Umdrehungsimpulsen aus (indem Du einen Timer zwischen zwei Umdrehungsimpulsen hochzählen lässt und anschließend ausliest), ist die Drehzahl ja umgekehrt proportional zum Timerwert (je langsamer der Motor dreht, umso weiter kann der Zähler zwischen zwei Impulsen zählen). Im unteren Drehzahlbereich hast Du somit eine ziemlich "feine" Auflösung, während die Drehzahl im oberen Bereich in eher gröberen Schritten angezeigt werden.

Ist das Projekt denn überhaupt noch aktuell??

bnitram
01.11.2012, 21:58
Hallo Sauerbruch,
Ja das Thema ist noch aktuell. Es geht in erster Linie darum einen alten Benzin Motor Drehzahl mäßig einzustellen. Es kommt dabei weniger auf die untere drehzahl an. Wichtiger ist der Drehzahlbereich von 2000-5000. Später sollte der drehzahl Messer dann auch fest als Anatur instaliert werden. Welche Möglichkeit wäre dann die bessere ?

Mfg und vielen Dank für die Antwort
bnitram

bnitram
04.11.2012, 16:53
Keiner eine Idee??

Mfg
bnitram

Thegon
04.11.2012, 17:59
Naja wenn man so ein bisschen rechnet dann wäre für diese Drehzahlen doch die Methode mit dem "Zeitabstandmessen" besser geeignet.

Weil 3000rpm = 50Hz, (Unter der Annahme, dass eine Umdrehung genau einen Impuls auslöst)

-> Wenn man eine Sekunde Zeitfenster macht, bekommt man 50 Impulse rein -> wie oben schon gesagt die Auflösung in +- 60rpm, klar.

Wenn man annimmt, der Mega8 ist mit 8Mhz getaktet, dann kann er den Zeitlichen Abstand (zumindest theoretisch) in 125ns - Schritten messen, und bei einer Frequenz von 50Hz wäre ein Fehler von +-125ns weniger als 0,001 % was entsprechen würde +- 0,018 rpm.

Soweit wenn man es theoretisch in den Taschenrechner eintippt, praktisch wäre es halt genauer als man es dann am Display anzeigen wird.

Nur das Problem dabei ist, wenn sich der Motor beim Starten sehr langsam dreht, dann kommen da riesige Anzahlen von 125ns Schritten heraus (bei 60rpm eben 8Mio, klar) , die man mit der Software halt bewältigen muss, aber mit Timer1 könnte das schon gehen, denke ich.

Kritisch würde es bei dieser Art der Messung ja erst werden, wenn man sich dem Systemtakt annähern würde, sich der Motor also mit Millionen Umdrehungen pro Sekunde drehen würde, aber das ist ja nicht der Fall ;-)

Ich würde es hier auf jeden Fall über "Zeitabstand messen" machen, also den Impuls per Interrupt in den AVR, und in der ISR Timerstand von vorher auslesen, Timerstand resetten, Timer weiterlaufen lassen und auf den Nächsten Impuls warten ;-)

Zeitfenster machen eher Sinn, wenn man z.B. ein Display hat, das einem die Frequenz ( in 1Hz Schritten) eines Signals anzeigen soll, dessen Frequenz sehr variabel ist. Die Frequenzanzeige meines Eigenbau - Funktionsgenerators habe ich so gemacht, auch mit ATmega und Bascom.

Soweit meine Meinung ;-)

Mfg Thegon

bnitram
04.11.2012, 18:05
Vielen Dank Thegon für deine Antwort :)
Hat mir sehr geholfen. Dann werde ich mich mal mit dem Zeitabstands Messungen auseinander setzen.
Vielen Dank.

Mfg
bnitram