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...
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
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.
??????? 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.
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.
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?
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.
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.