Moin, und zwar baue ich gerade eine Propeller Uhr. Diese Funktioniert eigentlich schon einwandfrei. Einziges Problem, ich müsste die Drehzahl verdreifachen, was ich aber nicht möchte. So Flackert sie eben. Im Moment läuft das Programm wie folgt ab: Zuerst wird die Zeit von einer Realtime Clock über I2C eingelesen Dann wird mit einer Gabellichtschranke alle 360° ein Ext. Interuppt ausgelöst. Zwischen zwei Interrupts wird die Zeit gemessen. Nach dem zweiten Interrupt wird dieser abgeschaltet. Nun wird der Timer auf 1/60 der Gemessenen Zeit eingestellt. Jeder Timerinteruppt überprüft dann, ob der Jeweilige Zeiger an der entsprechenden Position ist. Nachdem 360 Grad absolviert wurden, lass ich noch mal die Zeit einlesen (also zu diesem zeitpunkt wird nichts angezeigt!) und aktiviere wieder den externen Interrupt. Dieser misst dann wieder die Zeit, etc... Das heißt ich habe effektiv jede 3te Umdrehung nur ein Bild. Kann mir vllt jemand auf die Sprünge helfen, wie ich die Zeit während dem Anzeigen messen kann?
Hi, wie wärs wenn du es mit einer Art hilfskonstruktion machst. Du lösst mit dem timer interrupts aus. Sagen wir jede 1/10 millisekunde oder sowas. Mit diesem Interrupt lässt du dann eine Variable Inkrementieren. Immer wenn der externe interrupt ausgelösst wird wird der zählerstand zwischengespeichert und der zähler wieder auf null gesetzt. mit diesen daten kannst du nun zum beispiel einen array mit anzahl von ticks berechnen. Immer wenn dann ein stand erreicht wird kannst du dann eine aktion ausführen. Habs jetzt nur grob umrissen wie ich das machen würde. hoffe es hilft dir vieleicht weiter. Gruß BlabLa
1/10 millisekunde könnte bissel heftig für die ticks sein, versuchs mal mit einer millisekunde. ^^ Gruß BlabLa
Die Idee ist nicht schlecht, allerdings gibt es folgendes Problem: Ich benötige einen Timerinteruppt, damit meine Zeiger genau auf Position sind.Wenn ich den inkrementierenden Wert überprüfe, kann es auserdem passieren, dass ich schon dran vorbei "geflogen" bin, und dann zeigt er an der Stelle keinen Zeiger an. Da müsste ich dann "Bereiche" definieren, in welchen die Zeiger sind, und das dürft schwer zu realisieren sein. Im Moment lass ich i inkrementieren (von 0 bis 59) und frage immer ab, ob die aktuelle Zeigerposition mit i übereinstimmt.
Externen Int. an lassen und die Timedif / 60 als Wert für einen zweiten Timer der im compare match läuft nutzen
Habe ich mir auch schon gedacht, aber ich habe nur zwei 8 Bit Timer und einen 16 Bit. Für ausreichend Genauigkeit reichen mir 265 nicht aus. Da habe ich gerade mal eine ~(12/9)° Auflösung. Zudem kommt dazu, dass ich nur in einem stark begrenzten Drehzahlbereich arbeiten kann. Von daher kann ich nur einen 16 bit Timer nutzen. Andere µC geht nicht, weil die Schaltung schon koplett aufgebaut ist. Für das nächste mal nehme ich zwei µC ;) Aber jetzt interessiert mich, wie andere das hinbekommen...
Wie wärs mit sowas while(1){ if(ticks >= fire){ fire += 0,02*umlaufticks; leuchtsequenz(); } } hab jetzt nur schnell hingetippelt, sind keine casts und variablendeklarationen dabei. ich denke diese methode sollte noch genau genug für das anzeigen sein. Gruß BlabLa
nur aus reiner neugier, wieviele umdrehungen pro minute macht denn dein motor beim anzeigen? Gruß MonsyX
>Für ausreichend Genauigkeit reichen mir 265 nicht aus.
Und? Dann nimm den 16 Bit Timer zum zählen einer Umdrehung und teil
diesen Wert durch die Anzahl Spalten die Du haben möchtest bzw. die
aufgrund der Abarbeitungszeit angezeigt werden können.
Unterbreche die Lichtschranke doch einfach alle 6°!!! Damit löst du wie bisher einen Interrupt aus und musst nur noch eine Variable hochzählen, dann weißt du wo du gerade bist. So bekommst du dann drehzahlunabhängig 60 Schritte auf 360° - das willst du ja gerade!
Ich würde einen Brushless-DC Motor nehmen, da weiss du immer wo er ist ;)
@ Propeller Uhr (Gast) >Habe ich mir auch schon gedacht, aber ich habe nur zwei 8 Bit Timer und >einen 16 Bit. Das mehr als genug. >Von daher kann ich nur einen 16 bit Timer nutzen. Genau so macht man das. 16 Bit laufen lassen, über externen Interrupt oder noch besser ICP die Drehzahl messen. Parallel dazu kann man per Output Compare dann die Ticks für die Datenausgabe erzeugen, sprich gemessene Periodendauer / Anzahl Spalten/U = Timertick. >Andere µC geht nicht, weil die Schaltung schon koplett aufgebaut ist. >Für das nächste mal nehme ich zwei µC ;) Käse. Sowas macht EIN uC (AVR?) locker. >Aber jetzt interessiert mich, wie andere das hinbekommen... So wie oben beschrieben. Damit kann man pro Umdrehung ein Bild schreiben. Und der AVR hat noch viel Zeit nebenher. MfG Falk
Hallo Falk, das mit dem ICP wusste ich nicht, dass dieses auch geht. Das ist natürlich perfekt. Ich habe das gleich ausprobiert und es funktioniert. Nur habe ich jetz das Problem, dass die zeit zwischen zwei Zeigerpositionen zu gering ist um die Uhrzeit per I2C einzulesen. Ich lass ihn im Moment jede 6te Umdrehung einlesen. Daher flackert es jedes 6te mal. Die 8 Mhz reichen wohl doch nicht, muss wohl der 20 Mhz Quarz hin... Wenn du dafür noch ne elegantere Lösung hättest als nen Quarz hinlöten, wär ich oberglücklich ;)
dann teile da auslesen der Uhr auf mehrere Steps auf (was benutzt du eigentlich Hardware I2C oder Software?) ! Sascha
@ Propeller Uhr (Gast) >Nur habe ich jetz das Problem, dass die zeit zwischen zwei >Zeigerpositionen zu gering ist um die Uhrzeit per I2C einzulesen. Das ist auch totaler Unsinn. Du hast einen freilaufenden Timer, der ist als Zeitbasis sehr gut geeignet. D.h. du liest EINMAL am Programmstart deine Zeit aus der RTC und lässt dann im AVR deine Uhr laufen. AVR - Die genaue Sekunde / RTC >Ich lass ihn im Moment jede 6te Umdrehung einlesen. Daher flackert es >jedes 6te mal. Die 8 Mhz reichen wohl doch nicht, muss wohl der 20 Mhz >Quarz hin... Vollkommen falscher Ansatz. Du brauchst nicht mehr PS sondern mehr Köpfchen! Siehe Multitasking. Deine Datenausgabe an die LEDs macht man per Timer-Interrupt, das Auslesen der RTC, wenn es denn überhaupt sinnvoll ist, einmal pro Sekunde in der Hauptscheife, da hat man alle Zeit der Welt. MFG Falk P S. Ein AVR mit 8 MHz langweilt sich in einer Propelleruhr gewaltig. Warum? Mal rechnen. Nehmen wir eine schon recht hohe Drehzahl von 25U/s = 25Hz. Pro Umdrehung wollen wir 512 Spalten erzeugen, das ist schon sehr viel. -> 25*512 = 12,8 kHz Spaltenfrequenz. -> 625 Takte/Spalte D.h. ein 8 Bit Timer müsste schon mit Prescaler laufen, um das machen zu können, erst recht bei geringerer Drehzahl. MFG Falk
du kannst im Berufsbildungscenter Schweiz nachfragen. Dort haben Auszubildene eine Propelleruhr gebaut. info@berufsbildungscenter.ch Sie haben auch eine ausführliche Doku darüber geschrieben. Wenn du nett fragst bekommst du sie villeicht ;)
Bei Robotikhardware auf der DVD findest du auch eien Beschreibung und neuderings auch eagle Dateien! Siehe News http://www.shop.robotikhardware.de/shop/catalog/news_zeigen.php?id_news=30
Also ich find sowas auch sehr interessant, gibt es die Uhr nicht als Bausatz zu kaufen??? Mich schreckt die olle Energieübertragung etwas ab (Ja Falk, ich weiß was ein Royer Converter ist und wie er funktioniert) aber der will ja auch erstmal gebaut werden. Wir könnten ja auch n neues Projekt daraus machen?! Wer hat Bock? Gruß Knut
Beitrag "Re: Auftragsarbeit - RGB-LED-Lauflicht" Die Platinen für die V2 (nicht die Rakete ;-) sind grade beim Hersteller... ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.