www.mikrocontroller.net

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


Autor: Propeller Uhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: BlabLa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BlabLa (Gast)
Datum:

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

Gruß
BlabLa

Autor: Propeller Uhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Guestle (Gast)
Datum:

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

Autor: Propeller Uhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: BlabLa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BlabLa (Gast)
Datum:

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

Gruß
MonsyX

Autor: Guestle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Josh I. (aproquos)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Anselm 68 (anselm68)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Propeller Uhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Sascha Weber (sascha_w)
Datum:

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

Sascha

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Blackintosh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/ne...

Autor: Knut (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beitrag "Re: Auftragsarbeit - RGB-LED-Lauflicht"

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

;-)

Autor: Knut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, dann wohl nicht :-(

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.