ATmega328 Rücklesen der ausgegebenen PWM

#6985658
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...
Moderator (Firma: Titel) Persönliche Seite #6985664
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.
Gast #6985671
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.
Gast #6985707
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?
Gast #6985717
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.
#6985921
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren