Anfängerprojekt Schrittmotor steuern
Hallo zusammen!
Nachdem ich einige neue Maschinen mein eigen nennen darf, darunter auch eine konventionelle Fräse von
Optimum (MH 28V) und ich etwas Zeit im Alltag zur Verfügung gestellt bekomme (von meiner Chefin :o), möchte ich gern ein "kleines?"
Projekt starten.
Ich möchte gerne an besagter Fräse eine Achse (X) mit einem Schrittmotor verfahren.
Es geht hier nur um einen Achsvorschub und nicht um eine CNC Steuerung.
(evtl. können auch mehrere Achsen vefahren werden aber ich will es ersteinmal nur mit einer testen)
Sollte es solch ein Thema schon gegeben haben dann bitte ich um entschuldigung und um versetzung an die richtige Stelle. Danke!
Mein größtes Problem ist wie immer die Programmierung... :(
Da ich mit Bascom aber schon ein paar Erfahrungen sammeln konnte (danke Searcher, danke Kampi :)) würde ich dieses Projekt auch gerne damit proggen.
Zur Hardware...
Es stehen zur Verfügung:
1. Schrittmotor: Nema23 Stepper Motor 23HS8430, 3.0A
2. Treiber: Nema23 Schrittmotor-Controller-Treiber 2M542 4.2A
3. Atmega 168 (RN- Mini Control)
4. Bascom (Demo)
5. Fräse natürlich... :)
Eine genauere Auflistung der Verwendeten Teile kommt am Ende des Projektes.
Zur Funktion:
Der Schrittmotor soll die Achse der Fräse antreiben.
Die Geschwindigkeit des Schrittmotors wird über ein Poti gesteuert.
Ein Taster läst beim schließen den Motor laufen, beim öffnen bleibt der Motor stehen (evtl. Bremsen)
Ein Schalter zum umschalten links / rechtslauf
Mehr erst einmal nicht.
Natürlich habe ich keine Ahnung wie ich mit dem Code anfangen soll - werde aber heute Abend etwas probieren
und euch den (schreckens-) Code :rolleyes: zeigen.
Vielen Dank für eure Unterstützung / Hilfe / Tipps / Infos!
Viele Grüße, :)
P@
Liste der Anhänge anzeigen (Anzahl: 3)
Danke für dein Infos,
da ich es aber alles erst einmal auf dem Tisch aufbauen möchte vernachlässige ich die End- und Referenzschalter fürs erste.
Auch damit ich und andere den Code - das Ansteuern des Schrittis mit Bascom verstehen und es nicht schon von Anfang an zu überladen wird.
Bin grade dabei mich wieder mit Bascom an zu freunden... Aber lange ist es her...
Hier das Material...
Anhang 32076Anhang 32077
- - - Aktualisiert - - -
So,
erst mal alles angeschlossen. Sollte klappen.
Anhang 32078
Hier mal ein Code den ich im Netz gefunden habe und ausprobieren wollte da kurz und "Übersichtlich". (Gibt´s aber noch ne Menge Fragezeichen :o)
Läuft leider nicht - war ja klar! :)
Code:
$regfile = "M168def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100
$baud = 9600
'Programmkonfiguration
' r16 laden
!STS MCUCSR, R16 ' Zweimal wiederholen
!STS MCUCSR, R16
Config Portc = Output
Dim Anzahl_s As Long 'Schritte (zähler)
'Minus an GND oder frei lassen (läuft ohne.. )
Puls Alias Portc.0 'Pul
Richtung Alias Portc.1 'Dir
Freigabe Alias Portc.2
Freigabe = 0
'Ena (es gibt noch die Möglichkeit, die Leistung über PWM zu steuern)
'Programmkonfiguration
Do
'Schleife oder mit Timer
Puls = 1 'Signal erzeugen
Gosub Schritte 'Zählen
Waitus 400 'Impulsbreite
Puls = 0
Waitus 100 'Abstand zwischen Impulsen
Loop
Schritte:
If Anzahl_s > 400 Then
If Richtung = 1 Then
Gosub Links 'Richtung wechseln
Else
Gosub Rechts
End If
Waitms 1
End If
Anzahl_s = Anzahl_s + 1 'Schritte addieren
Return
Rechts: ' Rechts drehen
Richtung = 1 'Richtung auf 1 oder 0
Anzahl_s = 0 ' Schritte Reset
Waitms 100 'Haltepause/Bremszeit Motor braucht mindestens 5-30 ms
Return
Links: 'Links drehen
Richtung = 0 'Richtung auf 1 oder 0
Anzahl_s = 0 'Schritte/Bremszeit Reset
Waitms 100
Return
End
'Ende des Programms
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von
p@ty
...ok, also ich versuche als erstes mal nur einen Takt über den Timer1 an einem Pin zu erzeugen - den maximalen Takt (oder annähernd) für den den Leadshinetreiber.
....ähm, was sagt ihr? :confused:
Hallo p@ty,
es gibt so viele Möglichkeiten einen Takt zu erzeugen. Dein Programm nutzt einen Interrupt um dort einen Pin zu toggeln. Damit lassen sich sicher keine 300kHz erzeugen weil Interruptausführung (mit Sichern von Registern) und Toggle Kommando zuviel Zeit beanspruchen. Es werden dann mehr Interrupts benötigt als überhaupt ausgeführt werden können. Die Timer im AVR können aber selbst HW-mäßig einen Pin toggeln.
Ich habe Dir dazu mal einen Testgenerator für einen Mega88 angehangen, der compiliert für einen Mega168 auch dort laufen sollte. Mit max. 2550Hz ist der Generator zwar noch weit von 300kHz entfernt, sollte aber zum Probieren gut sein. Welche Frequenz brauchst Du denn effektiv bzw Dein Motor? 300Khz scheint mir für die Praxis schon recht viel. Aber mit 16MHz Systemfrequenz und Prescaler = 1 für Timer1 kommt man hier schon recht einfach auf 40kHz und bei weiteren Modifikationen auch höher - teoretisch bis 333kHz wenn man den ADC_new Wert zB. manuell auf 2047 setzt.
Programm ist bis etwa 1,9kHz getestet. Mangels eines richtigen Schrittmotortreibers diente ein ATtiny44 mit L293D als Simulator mit einem bipolaren Schrittmotor (der bei höherer Taktfrequenz aus dem Tritt kam) aus einem Floppylaufwerk.
Das Programm nutzt den Timer1 des Mega88 im Mode 15. Das ist Fast-PWM, bei dem der Timer immer nur bis zum OCR1A Registerwert läuft. Durch ein Poti wird der OCR1A Wert verändert und damit wird die Frequenz des Taktes beeinflußt. Im PWM Modus wird der OCR1A-Wert gepuffert und erst zu einem unkritischen Zeitpunkt effektiv,; hier am "BOTTOM" bei TCNT1 = 0. Die Ausgabe des Taktes wird durch die Timereinstellung Toggeln von OC1A bei Erreichen des OCR1A-Wertes erreicht.
Mit zwei Tastern kann man DIR und ENABLE beeinflussen.
Gruß
Searcher
Frequenzangaben zum Programm berichtigt. Hoffe sind keine weiteren Bugs drin :-(