Forum: Mikrocontroller und Digitale Elektronik ATmega328 Rücklesen der ausgegebenen PWM


von Andy Y. (merlin129)


Lesenswert?

Guten Tag Zusammen, ich bräuchte mal einen "Schubser" in die richtige 
Richtung :) Dabei bin ich mir nicht sicher, ob das geht bzw. das mal 
jemand getestet hat:

  * Hier nutze ich einen ATmega328 auf einem Arduino Nano Board 
(wohlgemerkt nur die Hardware - ohne Arduino).
  * Ich möchte zwei Schrittmotoren über eine Leistungselektronik 
ansteuern. Das können OC1A und OC1B machen (Also einfache PWM, Frequenz 
lassen wir jetzt mal außen vor...).
  * Nun möchte ich gerne die Impulse mit zählen. Also PCINT1 und PCINT2 
über die jeweiligen Interrupts zum Zählen verwenden.

Grundsätzlich:
  * Würde eine PWM Ausgabe und das gleichzeitige Zählen überhaupt 
zusammen gehen?
  * Oder muss ich das vielleicht gar nicht, weil der Timer 1 irgendwo 
ein Register hat und schon mitzählt - und ich es in meinem Wahn gerade 
im Datenblatt nicht finde?

Mein Use Case: Ich möchte die jeweiligen Schritte der beiden 
Schrittmotoren mit zählen damit ich eine Orientierung der Position habe.

Als Ergänzung:
  * Nein, ich habe keinen Geber angeschlossen der mir die Position 
rückliefert. Es ist auch nicht vorgesehen.
  * Ja, ich bin mir darüber bewusst, dass ich aufgrund des Moments an 
der Motorabtriebsseite Schritte verlieren kann und dadurch die Zählung 
bzw. Orientierung der Position ungenau wird.
  * Es geht mir erstmal um das prinzipielle, daher habe ich absichtlich 
noch keine Eigenschaft der PWM vorgegeben.

Vielen Dank...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andy Y. schrieb:
> weil der Timer 1 irgendwo ein Register hat und schon mitzählt
Der Timer 1 ist ein Register, das zählt.

> Mein Use Case: Ich möchte die jeweiligen Schritte der beiden
> Schrittmotoren mit zählen damit ich eine Orientierung der Position habe.
Schrittmotore verwendet man eigentlich genau aus dem Grund, weil man die 
Schritte vorgeben kann und deshalb weiß, was da gerade ausgegeben 
wird. Und die Motoren fahren dann bei geeigneter Dimensionierung einfach 
diesen Schrittvorgaben nach.

Sprich: du musst einfach dein Programm so umschreiben, dass du nicht 
eine ungeeignete Funktion verwendet z.B. MachSchritte(1000, links); und 
zukuckst, was die so macht, sondern eine Funktion, bei der du bei jedem 
Impuls weißt, was gerade los ist.

Fazit: lass dir bei jedem Timerüberlauf (der auch den Stepper-Pin 
toggelt) einen Interrupt geben und zähl mit.

: Bearbeitet durch Moderator
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Andy Y. schrieb:
> Also PCINT1 und PCINT2
> über die jeweiligen Interrupts zum Zählen verwenden.

Das ist unnötig, weil die PWM auf Wunsch schon Interrupts liefern. Die 
können je nach PWM beim Erreichen von TOP, TOV oder BOTTOM ausgelöst 
werden. Schau dir die Liste der PWM Modi an, da steht, welche IRQs 
ausgelöst werden.

von Max M. (Gast)


Lesenswert?

???????
Du willst eine PWM automatsich vor sich hintackern lassen, um dann die 
Information wie oft das nun war wieder einzulesen?

Also wie viel mehr von hinten durch die Brust ins Auge kann man das 
eigentlich noch machen?

Also ein Pulswechsel pro Timerüberlauf.
Der Timerüberlauf kann einen IRQ Auslösen, wenn Du ihm das sagst.
In der IRQ kannst Du einen Zähler hochsetzen.

von Max M. (Gast)


Lesenswert?

Andy Y. schrieb:
> dass ich aufgrund des Moments an
> der Motorabtriebsseite Schritte verlieren kann

Dann hast Du den falsch dimensioniert.
Wenn der Stepper Schritte verliert ist er überlastet.

von Rubimix (Gast)


Lesenswert?

Max M. schrieb:
> Du willst eine PWM automatsich vor sich hintackern lassen, um dann die
> Information wie oft das nun war wieder einzulesen?
>
> Also wie viel mehr von hinten durch die Brust ins Auge kann man das
> eigentlich noch machen?
Ähh, ich bin verwirrt.
Ich hätte genau das Prozedere des TO gewählt und der Tipp der anderen 
Antwortenden (den Interrupt des Timers zum Zählen der Schritte zu 
verwenden) ist genau richtig.

Wie hättest Du es auf dem AVR gemacht bei den typischen Anforderungen 
mit Rampen und so?

von Max M. (Gast)


Lesenswert?

Rubimix schrieb:
> Wie

Bestimmt nicht so.
So würde ich einen Timer pro Step brauchen, weil ja nicht alle Steps mit 
gleicher freq laufen und bei rampen muss ich permanent neue Timer werte 
berechnen und glitchfrei aktualisieren.
Also ist bei 3 steps dann schluss und die müssen auch exakt auf den Pins 
liegen die die drei 16bit Timer blockieren. Alles andere an signalen 
muss ich eh in SW erzeugen.
Und ich muss rechtzeitig den Timer stoppen, bevor der weiter rumstept, 
aber auch nicht zu früh, damit der Step noch ausgeführt wird.
Also drei 16b timer Werte berechnen und innerhalb eines Zyklus in ide 
Register laden, bzw. die Timer starten / stoppem, weil sonst die Achsen 
nicht mehr synchron laufen.

Also systic timer und den Rest per software.

von Wolfgang (Gast)


Lesenswert?

Rubimix schrieb:
> Wie hättest Du es auf dem AVR gemacht bei den typischen Anforderungen
> mit Rampen und so?

Guck dir die diesbezügliche AVR446 von Atmel an (Linear speed control of 
stepper motor). Da ist ein typisches Verfahren beschrieben (inkl. Code).

von Carsten-Peter C. (carsten-p)


Angehängte Dateien:

Lesenswert?

Hallo, ich hab mal sowas für einen Plotter geschrieben. Irgendwie muss 
man dem Arduino ja erzählen, was er gerade tun soll. Das habe ich über 
die Serielle Schnittstelle bzw. USB gemacht. Zuerst habe ich die 
Rampenlängen vom Laufweg abgezogen, dann die erforderlichen Schritte 
berechnet, OCR1 mit dem Startwert gesetzt und den Zähler gestartet. In 
der ISR hab ich dann die zu laufenden Schritte runter gezählt. Das 
funktioniert ganz gut. Ich kann Dir gerne den Quelltext zukommen lassen. 
Ist allerdings in ASM für einen ATmega 1284 geschrieben. Der hatte den 
größten Speicher für den Ringpuffer.
Gruß Carsten

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.