ich habe hier einen Schrittmotor mit dazugehöriger Leistungsstufe. Nun kommen die Steuersignale (Richtung, Takt,...) von einem AVR und dieser soll nun auch die Beschleunigungs- / Bremsrampe liefern. Hat mir hier jemand nützliche Infos dazu? Einmal zur Festlegung der Rampen und zum anderen wie man diese Softwareroutinen am besten realisiert (also wie man sie aufbaut)?
Ich würde das Ganze mit 2 Timern probieren. Der eine Timer erzeugt die Frequenz für den Takt. Im Output-Compare-Register für den Timer den Wert entsprechend eintragen, dass du beim voreingestellten Prescaler die gewünschte Frequenz kriegst.
Eine gleichmäßige lineare Rampe könntest du erreichen, in dem du einen zweiten Timer verwendest, der in einer bestimmten Frequenz einen Interrupt auslöst, in dem dann das Output-Compare-Register bis zu einem bestimmten Maximalwert/Minimalwert inkrementiert/dekrementiert wird.
Wenn die Rampe nicht linear sein darf, dann müsste man die Werte einer nicht-linearen Rampe in einer Tabelle im Flash ablegen und die dann zum erhöhen/erniedrigen des 1sten Zählers verwenden.
Ein Rechenbeispiel: Takt 8Mhz, Prescaler Timer1 :1024, Timerfrequenz:
7812,5Hz Bsp: Wenn du von 1Hz (=7812) auf 1000Hz (=78) innerhalb von 250ms beschleunigen willst, müsstest du z.B. den Timerinterrupt auf 32,3µs einstellen, wenn du immer um 1 dekrementieren willst. (250ms/(7812-78)) Oder auf 323µs wenn du um 10 dekrementierst usw. 323µs*((7812-78)/10) = 250ms. Bei einem Prescaler von :64 beim zweiten Timer würde man dann für die 323µs einen Compare-Wert von 40 einstellen. Man würde dann den zum dekrementieren aufhören, wenn man entweder 773 Interrupts hatte, oder einfach wenn man den gewünschten Wert erreicht hat.
Ich hoffe ich hab mich jetzt da nicht allzu sehr vertan und es ist irgendwie verständlich.
Bin kein Firmware Spezialist, aber habe schon mal Schrittmotoren mit uC angesteuert (jemand anders codierte dann alles). Es kommt entscheidend darauf an, was an der Welle des Motors haengt. Wenn man die Rampen zu steil setzt, kommt der Motor aus dem Tritt (step skipping).
Ein wenig Drehmomentrechnung und danach die Steilheiten festlegen. Im Prinzip ist es nichts anderes als eine in der Frequenz an- oder abschwellende Pulsfolge. Das kann etnweder ueber Timer geschehen (war bei uns wie so ueblich natuerlich keiner mehr frei) oder per Software Loop.
ich hab sowas auch mal in nem AVR in Assembler implementiert und dafür einen Algorithmus vorher in Pascal getestet der von einer aktuellen Position auf eine Sollposition fährt, mit Beschl. bzw. Abbremsen. Der (pascal) Algorithmus hatte aber glaub ich irgendwo noch nen kleinen Fehler, so dass er am Ziel manchmal leich "überschwingt" und dann wieder zwei Schritte oder so zurückkorrigiert. Die Art der Beschleunigung (bzw. die Zeit bis zum nächsten Step bei aktueller Geschwindigkeit kann man über eine Funktion definieren).
habe sowas schon in verschiedenen Assemblern (aber nicht PIC und nicht AVR) geschrieben. Ein Timer zählt rückwärts und löst bei Null einen Interrupt aus. In der ISR wird dann das Motor Taktsignal ausgegeben und der Timer mit einem neuen Wert geladen. Dieser kommt aus einer Tabelle mit fixer Länge wo ein Zeiger drüber geschoben wird.
Die Tabelle selbst erzeuge ich mir mit einem kleinen C Programm als Include File. Beim Beschleunigen und Bremsen schiebe ich den Zeiger dann halt andersrum - oft reicht schon ein 8 bit Zeiger. Bei Fahrstrecken die länger als 2 Rampen sind, wird die Endgeschwindigkeit nicht erreicht und die Rampe entsprechend gekürzt. Bei Fahrstrecken die länger als 2 Rampen sind, wird eine konstante Fahrt mit n Schritten dazwischen geschoben - fertig.
Vorteil: Wenig Rechenzeitbelastung, Nachteil: Die Beschleunigung kann zur Laufzeit nicht verstellt werden, bzw. benötigt dann mehrere abgelegte Kurven. Andererseits kann aber auch leicht eine Sinuskurve zur sanften Beschleunigung oder 2D Interpolationen für mehrere Achsen abgelegt werden.
Am 3 Feb 2006 08:20:16 GMT schrieb Michael Schwingen :
Das funktionierte doch schon mitte der 80er Jahre des vorigen Jahrhunderts mit dem Kopfstepper der Commodore 1541 (für alle dies nicht (mehr) wissen: Die Floppy zum C64).
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.