Forum: Mikrocontroller und Digitale Elektronik Zeit zählen bzw Rampe


von Wolfgang K. (polarwolf_94)


Lesenswert?

Hallo,

Ich weiß, dass es viele Beiträge dazu schon gibt, aber bis jetzt habe 
ich kein entsprechendes gefunden.

Und zwar mache ich gerade eine Diplomarbeit und habe zwei fragen:
1)
Ich habe einen Antrieb und steuere das ganze mit einem Schrittmotor an 
(Controller ist ein XMEGA128A3, mit C programmiere ich)
Auf der anderen Seite habe ich eine Lochscheibe, die halt die Impulse 
ausgibt.
Nun war meine Idee, dass ich die Positive Flanke verwende, um die Zeit 
zu starten und bei der nächsten positven Flanke die auszulesen und auf 
null zu setzen. und von neuem beginnen.
Wenn halt die Zeit nicht dem Soll entspricht, dann soll der Schrittmotor 
schneller bzw lngsamer drehen.    Soweit sogut.   Aber wie genau sieht 
der Code dazu aus?

2)Der Motor soll auch nicht von Null auf 100 hochdrehen. 
(Schrittverlust)
Hat jemand eine gute Idee eine Rampe für den Takt zu erstellen?


Mal ein paar Details zur Arbeit:

Es ist so, dass ich in der Diplomarbeit einen Art Saisograph baue, nur 
soll der halt die Spannung bzw Strom messen.
Der eine Motor soll eine Spindel betreiben(dafür Rampe) und der zweite 
soll das Papier befördern(zweite Motor mit Lochscheibe.  Lochscheibe ist 
eig unnötig, aber der Professor wollte das unbedingt)
Die Motor haben 0.7A pro Phase mit 12V
Habe den Schrittmotor treiber EASYDRIVER4.4  (Sehr zu empfehlen!!!)

von MaWin (Gast)


Lesenswert?

ENTWEDER du hast einen Schrittmotor ODER du ermittelst die 
Geschwindigkeit mit einer Lochscheibe.

Beides zusammen ist doppelt gemoppelt und ähnlich wie wenn man 2 Uhren 
hat, weiss man dann nie genau wie spät es ist.

Du musst/kannst davon ausgehen, daß der Schrittmotor keine 
Schrittverluste hat, sonst wäre er mechanisch fehldimensioniert. Wenn du 
das überprüfen willst, kannst du die Lochscheibe verwenden, die z.B. 
alle 10 Schritte dann ein Loch haben müsste, und wenn das 12 Schritte 
dauert, sind wohl welche verloren gegangen. Verwende die Lochscheibe 
nicht um die Geschwindigkeit zu MESSEN, schliesslich gibt du dem 
Schrittmtoor die Geschwindigkeit VOR, die IST dann auch so.

von Stefanus (Gast)


Lesenswert?

> Nun war meine Idee, dass ich die Positive Flanke verwende,
> um die Zeit zu starten und bei der nächsten positven Flanke
> die auszulesen und auf null zu setzen. und von neuem beginnen.

Das ist unnötig kompliziert und birgt außerdem ( bei hohen 
Geschwindgkeiten) die Gefahr, dass Du eine Flanke verpasst und dann ein 
völlig falsches Ergebnis erhälst.

Mach es so:

Du startest einen Timer, der frei durchläuft. Nennen wir in TIMER. Und 
du legst zwei globale Variablen an, um Beginn- und End-Zeitpunkte der 
Messung zu speichern. Die Variablen müssen volatile sein.

volatile uint16_t start;
volatile uint16_t ende;

Wenn Du einen 8bit Timer verwendest, müssen die Variablen vom Typ 
uint8_t sein.

Die positive Flanke löst einen Interrupt aus. In der Interrupt-Routine 
machst du folgendes:

start=ende;
ende=TIMER;

Im Hauptprogramm (main) berechnest Du die Differenz der beiden 
Variablen. Das ist die Zeit, die zwischen zwei Flanken verstrichen ist. 
Damit kannst Du dann die Drehzahl berechnen.

uint16_t diff=ende-start;

Falls der Timer zwischendurch übergelaufen ist - macht nix. Das Ergebnis 
ist dann trotzdem richtig.

Bezüglich der Regelung solltest Du dich mit Regelungstechnik 
beschäftigen. Ein gebräuchlicher Ansatz ist der "PID Regler", eine 
Kombination aus drei Algorithmen. Versuche, bei der Implementierung auf 
Fließkomma-Arithmetik zu verzichten, weil kleine Mikrocontroller das 
nicht so gut können (dauert zu lange).

von Michael (Gast)


Lesenswert?

Wolfgang Karner schrieb:
> Hat jemand eine gute Idee eine Rampe für den Takt zu erstellen?

Zur Berechnung/Steuerung von Beschleunigungsrampen findest du einiges in 
der "AVR446: Linear speed control of stepper motor" von Atmel

von Arsenico (Gast)


Lesenswert?

Du entwickelst also den '' Saismograph ''

von STK500-Besitzer (Gast)


Lesenswert?

>Saisograph
was das?

Wolfgang Karner schrieb:
> Nun war meine Idee, dass ich die Positive Flanke verwende, um die Zeit
> zu starten und bei der nächsten positven Flanke die auszulesen und auf
> null zu setzen. und von neuem beginnen.

Zeit starten und anhalten? Deswegen habe ich also dauernd Déjà-Vues :P
Die Lochscheibe ist als Kontrolle, ob Schritte verloren gegangen sind.
Also muss man nicht die Zeit, sondern die Anzahl der Impulse mit den 
Schritten des Motors vergleichen. Sowas kann man per Interrupt erledigen 
und in der ISR die Ist-Schritte der Lochscheibe zählen.

von Ulrich (Gast)


Lesenswert?

Für die Zeitmessung haben viele µC (auch der Xmega) eine extra Hardware 
Unterstützung (hießt beim AVR Input Capture). Damit wird der Timerstand 
schon in Hardware ausgelesen, unabhängig davon wie schnell der Interrupt 
reagiert.

Beim Schrittmotor wird die Lochscheibe eher nur eine Kontrollfunktion 
haben - da sollte reines Zählen reichen, ggf. auch mit Auswertung des 
Quadratursignals. Auch dafür haben einige der µC bereits eine extra 
Funktion drin. Ob es beim Xmega-A drin ist müsste man im Datenblatt 
nachsehen. Wie schon oben geschrieben wäre es ggf. Sinnvoll wenn die 
Lochscheibe nicht einfach die Schritte zählt, sondern eher eine andere 
Teilung hat. Damit ließen sich ggf. auch Fehler bei der Lochscheibe 
erkennen.

Nachregeln nach der Lochscheibe wäre wohl nur sinnvoll wenn die sehr gut 
(etwa mehr als 2000 Teile pro Motor-Umdrehung) ist und 
Mikroschrittbetrieb beim Motor genutzt wird.

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.