- 3D-Druck Einstieg und Tipps         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 26

Thema: Anfängerprojekt Schrittmotor steuern

  1. #1
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51

    Anfängerprojekt Schrittmotor steuern

    Anzeige

    E-Bike
    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 ), 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 zeigen.

    Vielen Dank für eure Unterstützung / Hilfe / Tipps / Infos!

    Viele Grüße,
    P@

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Hm, Z-Achse fräst auch gerne mal in den Tisch rein (Erfahrung aus der Lehre).

    Als erstes mal einstellbare Stop Nocken und entsprechende Schalter als Öffner.
    (zusätzlich zu den Endschaltern in den Endlagen die die Spindel etc. schützen sollen)

    Eventuell geht analog zum Hebel an einerer Fräse mit mechanischem Vorschub ein Digitaler Joystik oder ein Tastschalter (ON OFF ON)
    Wobei ich nicht weis ob es sowas heute noch gibt.
    Das waren Schalter die aus beiden Stellungen zurück in Mittelstellung gefallen sind.
    Damit läuft der Vorschub solange man hält.
    Oder einfach ein Schalter (ON OFF ON) der fährt dann bis ein Endschalter ausgelöst wird oder er von Hand in Mittelstellung gebracht wird.
    Das Poti ist dann für die Geschwindigkeitsvorgabe.
    Und die beiden Schaltkontakte für die Richtung und Enable.

  3. #3
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51
    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...

    Klicke auf die Grafik für eine größere Ansicht

Name:	DSC_0252.jpg
Hits:	34
Größe:	52,1 KB
ID:	32076Klicke auf die Grafik für eine größere Ansicht

Name:	DSC_0253.jpg
Hits:	25
Größe:	56,5 KB
ID:	32077

    - - - Aktualisiert - - -

    So,
    erst mal alles angeschlossen. Sollte klappen.
    Klicke auf die Grafik für eine größere Ansicht

Name:	DSC_0254.jpg
Hits:	23
Größe:	64,1 KB
ID:	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 )

    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Ich habe zwar noch nie Bascom programmiert, aber ich würde im ersten Schritt mal folgenden Code testen.
    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
    
      Waitus 400                                                  'Impulsbreite
      Puls = 0
      Waitus 100                                                  'Abstand zwischen Impulsen
    Loop
    
    End
    Eventuell die Zeiten größer machen und mit einer LED ansehen ob da ein entsprechendes Rechtecksignal an Portc.0 raus kommt. Ansonsten per Osziloskop prüfen.

    Im zweiten Schritt dann:
    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
        
        Anzahl_s = 0
        Waitms 100
      End If
      Anzahl_s = Anzahl_s + 1                                     'Schritte addieren
    Return
    
    End
    Natürlich mit der korrekten Fassung der DO LOOP Schleife die aus dem ersten Schritt entstehen müsste.
    Hier sollte ja nach 400 Pulsen eine Pause entstehen und dann wieder 400 Pulse kommen.
    Wenn das klappt. Kann man DIRection und Enable hinzunehmen.
    Kommen die Signale alle aus dem Controller, kann man den Motortreiber anschließen.
    Dazu dann aber mal bei verschiedenen CNC Threads reinschauen, mit diesem Typ Motortreiber gabs glaube ich schon öfters Probleme. Da kann etwas Nacharbeit erforderlich sein.

  5. #5
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51
    Hey i_make_it,

    danke für dein geprogge - werde ich heute Nachmittag ausprobieren. Morgen hab ich frei da kann
    ich schön den ganzen Tag zum testen investieren!

    Ein Osziloskop habe ich leider nicht - die Led muss reichen.
    Danke für die Tips und deine Unterstützung!

    Viele Grüße,
    p@

  6. #6
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51
    Noch ne kleine Frage...

    Müssen der Treiber und der Atmega eigentlich gleiches Potenzial / Spannungsversorgung haben?

    Hab alles zusammen gerödelt aber der Motor Summt nur leise vor ich hin...

    Hab Enable, Direction, und Puls in Bascom erzeugt.
    Enable steht auf 0 aber ob ich 0 oder 1 setzte interessiert den Treiber nicht...Motor Summt weiter.

    Direction steht auf 0 = Linkslauf / 1 = Rechtslauf

    S1 ist ein Taster um den Puls ein / aus zu schalten.

    Kontrol- Led für Puls Blinkt bei Tasterdruck lustig alle 50ms. Liegt hier der Fehler?

    Zum Testen mal diesen ganz einfachen...
    Code:
    $regfile = "M168def.dat"
    $crystal = 16000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    $baud = 9600
    
    
    
    'Programmkonfiguration
    
    Config Portb.4 = Output
    Config Portc.1 = Output
    Config Portb.1 = Output
    
    Config Pinc.0 = Input
    Config Pind.4 = Input
    
    
    Puls Alias Portb.1 'Pul
    Puls = 0
    
    Richtung Alias Portc.1 'Dir
    Richtung = 0
    
    Freigabe Alias Portb.4 'Ena
    Freigabe = 0
    
    S1 Alias Pind.4
    S1 = 1
    
    'Hauptprogramm
    
    Do
    
    If S1 = 0 Then
    
    Waitms 40
    Puls = 0
    Waitms 10
    Puls = 1
    
    Else
    
    Puls = 0
    
    End If
    
    Loop
    
    End
    Vielen Dank für eure Unterstützung!
    p@
    Geändert von p@ty (06.10.2016 um 21:37 Uhr)

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Eine gemeinsame Masse braucht es schon.
    Wenn der GND vom Atmega z.B. 2V niedriger liegt wie der GND vom Motortreiber, wird dieser bei 5V niemals ein High Signal bekommen, da das ja mehr wie 3,7V braucht.

  8. #8
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51
    Ok, das war mir jetzt etwas zu schnell...

    Habe ein Netzteil 48V für den Treiber und ein Netzteil 5V für den Atmega...

    GND vom Atmega mit GND vom Treibernetzteil verbinden?

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Zitat Zitat von p@ty Beitrag anzeigen
    GND vom Atmega mit GND vom Treibernetzteil verbinden?
    Ja, genau das.

    Alle Masse bezogenen Signale müssen ein gemeinsames Bezugspotential (GND) haben sonst wird das nichts.

    Nur differentielle Signale sind bezugslos. und nur durch die Spannungsdifferenz zwichen der positiven und der negativen Leitung definiert.
    Wobei es egal ist ob so ein Signal dann symetrisch z.B. +15V - -15V ist oder +30V - 0V oder 0V - -30V ist, in allen Fällen ist die Differenz 30V.
    Ein Massebezogenes Signal wie ein 5V Logikpegel, hat bei unterschiedlichen Bezugspotentialen an verschiedenen Schaltungsteilen halt nur da 5V wo das Bezugspotential genau 5V negativer als das Signal ist.
    Stell es Dir vor wie ein Fluß der an verschiedenen Stellen unterschiedlich Tief ist (Ground). Der Wasserspiegel ist zwar von oben gesehen überall gleich, aber spätestens da wo ein Schiff auf Grund läuft, reicht die Wassertiefe (Signalpegel) nicht aus damit das Signal (Schiff) durch kommt.
    Das Bespiel ist nicht richtig zutreffend und etwas blöd, aber was anderes ist mir auf die Schnelle nicht eingefallen.

  10. #10
    Benutzer Stammmitglied Avatar von p@ty
    Registriert seit
    05.06.2011
    Ort
    Bottrop
    Beiträge
    51
    Danke für deine Ausführung - macht Sinn!

    Also mit diesem kleinen Code läuft der Motor schon mal...

    Code:
    $regfile = "M168def.dat"
    $crystal = 16000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    $baud = 9600
    
    
    'Programmkonfiguration
    
    Config Portb.4 = Output
    Config Portc.1 = Output
    Config Portb.1 = Output
    
    Config Pind.4 = Input
    
    Puls Alias Portb.1                                          'Pul
    Puls = 0
    
    Richtung Alias Portc.1                                      'Dir
    Richtung = 1
    
    Freigabe Alias Portb.4                                      'Ena
    Freigabe = 1
    
    S1 Alias Pind.4                                             'Taster
    S1 = 1
    
    'Hauptprogramm
    
    Do
    
       If S1 = 0 Then
    
          Waitms 1
          Puls = 0
          Waitms 1
          Puls = 1
    
       Else
    
          Puls = 0
    
       End If
    
    Loop
    
    End
    Den Schrittmotor habe ich parallel an den Treiber angeschlossen. Ansonsten wie im Code zu sehen:

    PinB.4 = Freigabe (obwohl der Motor auch ohne diesen Anschluss läuft - warum?)
    PinC.1 = Richtung (das klappt mit 1 = Linkslauf / 0 = Rechtslauf)
    PinB.1 = Puls (die Frequenz die hier einfach über ein waitms erzeugt wird - hier 2ms => 500Hz => 0.5kHz richtig?)
    PinD.4 = Taster S1 (die Frequenz soll erst erzeugt werden wenn Taster gedrückt wird)

    Den Treiber habe ich so eingestellt:
    Current RMS = 3A
    Puls / Schritte = 400
    400 Schritte finde ich recht wenig aber bei den anderen Einstellungen läuft er nur sehr viel langsamer - habt ihr irgendwelche Tipps dazu?

    ...und macht das denn überhaupt Sinn die Frequenz so zu erzeugen oder sollte man da besser eine PWM nutzen?

    Der nächste Schritt wäre die Geschwindigkeit über ein Poti zu steuern - aber da hört es jetzt erstmal völlig auf bei mir...

    Hab ja frei heute - ich probier mal rum!

    Danke für deine Unterstützung i_make_it

    - - - Aktualisiert - - -

    ...ok, hab mal ein wenig mit dem waitms gespielt - den 2. Wert durch 10 geteilt. Bei 400 Schritten läuft der Motor sehr viel schneller...



    Wenn ich die Schrittweite am Treiber von 400 auf z.B. 6400 umstelle läuft der Motor entsprechend langsamer. Klar, er muss ja mehr Schritte bei gleicher Frequenz machen. Ok, dachte ich Frequenz nochmals erhöhen - aber bringt nix - Geschwindigkeit bleibt gleich. Wenn man es mit der Frequenz übertreibt z.B. 0,2ms (5kHz) dann steht der Motor und Summt nur laut...



    ...irgendwelche Ideen wie ich es besser machen könnte?

    Greez,
    p@

    - - - Aktualisiert - - -

    ...hier mal der Code mit Schalter für Richtungswechsel...

    Code:
    $regfile = "M168def.dat"
    $crystal = 16000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    $baud = 9600
    
    
    'Programmkonfiguration
    
    Config Portb.4 = Output
    Config Portc.1 = Output
    Config Portb.1 = Output
    
    Config Pind.4 = Input
    Config Pind.5 = Input
    
    
    Puls Alias Portb.1                                          'Pul
    Puls = 0
    
    Richtung Alias Portc.1                                      'Dir
    Richtung = 1
    
    Freigabe Alias Portb.4                                      'Ena
    Freigabe = 1
    
    T1 Alias Pind.4                                             'Taster zum Frequenzerzeugen
    T1 = 1
    
    S1 Alias Pind.5                                             'Schalter zum Richtungswechsel
    S1 = 1
    
    'Hauptprogramm
    
    Do
    
       If T1 = 0 Then
    
          Waitms 1
          Puls = 0
          Waitms 0.1
          Puls = 1
    
       Else
    
          Puls = 0
    
       End If
    
       If S1 = 1 Then
       Richtung = 1
    
       Else
    
       Richtung = 0
    
       End If
    
    Loop
    
    End

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Schrittmotor zeitpräzise steuern
    Von Geistesblitz im Forum Software, Algorithmen und KI
    Antworten: 7
    Letzter Beitrag: 12.07.2011, 23:07
  2. schrittmotor steuern
    Von watermelon im Forum Software, Algorithmen und KI
    Antworten: 6
    Letzter Beitrag: 17.11.2010, 21:23
  3. Schrittmotor über Schrittmotor steuern?
    Von Tarribo im Forum Motoren
    Antworten: 1
    Letzter Beitrag: 06.06.2010, 23:40
  4. Schrittmotor mit LPT steuern
    Von timo1105 im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 11.11.2006, 12:40
  5. Schrittmotor mit PC steuern
    Von SK112 im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 08.01.2005, 09:23

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress