Forum: Mikrocontroller und Digitale Elektronik Denkanstoß für Propeller Uhr


von Propeller Uhr (Gast)


Lesenswert?

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?

von BlabLa (Gast)


Lesenswert?

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

von BlabLa (Gast)


Lesenswert?

1/10 millisekunde könnte bissel heftig für die ticks sein, versuchs mal 
mit einer millisekunde. ^^

Gruß
BlabLa

von Propeller Uhr (Gast)


Lesenswert?

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.

von Guestle (Gast)


Lesenswert?

Externen Int. an lassen und die Timedif / 60 als Wert für einen zweiten 
Timer der im compare match läuft nutzen

von Propeller Uhr (Gast)


Lesenswert?

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...

von BlabLa (Gast)


Lesenswert?

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

von BlabLa (Gast)


Lesenswert?

nur aus reiner neugier, wieviele umdrehungen pro minute macht denn dein 
motor beim anzeigen?

Gruß
MonsyX

von Guestle (Gast)


Lesenswert?

>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.

von Josh I. (aproquos)


Lesenswert?

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!

von Anselm 6. (anselm68)


Lesenswert?

Ich würde einen Brushless-DC Motor nehmen, da weiss du immer wo er ist 
;)

von Falk B. (falk)


Lesenswert?

@  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

von Propeller Uhr (Gast)


Lesenswert?

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 ;)

von Sascha W. (sascha_w)


Lesenswert?

dann teile da auslesen der Uhr auf mehrere Steps auf (was benutzt du 
eigentlich Hardware I2C oder Software?) !

Sascha

von Falk B. (falk)


Lesenswert?

@  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

von Blackintosh (Gast)


Lesenswert?

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 ;)

von Bastler (Gast)


Lesenswert?

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

von Knut (Gast)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

Beitrag "Re: Auftragsarbeit - RGB-LED-Lauflicht"

Die Platinen für die V2 (nicht die Rakete ;-) sind grade beim 
Hersteller...

;-)

von Knut (Gast)


Lesenswert?

Naja, dann wohl nicht :-(

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
Noch kein Account? Hier anmelden.