Forum: Mikrocontroller und Digitale Elektronik Bipoler Schrittmotor über AtMega8 -> L6219 im Vollschritt schaltet nicht


von Smarki (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich versuche vergeblich mit einem AtMega8 über einen L6219 einen 
bipolaren Schrittmotor im Vollschritt zu steuern.
Die Schaltung entspricht dem Logikplan (s. Anlage) und die 
Dimensionierung der Bauteile sollte zu dem von mir verwendeten Motor (s. 
Anlage) passen, da ein mir bekannter Entwickler die Variante Motor <-> 
L6219 auch so in seinen Produkten verwendet.
Die Funktionstabelle (s. Anlage) habe ich für den Vollschritt in 
Assembler folgendermaßen umgesetzt.

.include    "m8def.inc"

Start:
  ldi  r16,low(ramend)
  ldi  r17,high(ramend)  ;Adresse vom RAM-Ende laden
  out  spl,r16      ;Stackpointer auf
  out  sph,r17      ;RAM-Ende setzen

; Port B&D als Ausgang setzen
; Port D schaltet den Motor
; Port B schalten Kontroll LED'S
    ldi     r16,0xff
    out     DDRB,r16
    out     DDRD,r16

;Port B&D alle Augänge = LOW
    ldi     r16,0x00 ;
  out portb, r16
    out portd, r16

  ldi r16, 0x18 ; Schrittzahl definieren (0x18 = 24 Schritte)
MotorLoopVw: ; Drehen vorwärts

  ; FULL STEP 1 I01 | I11 | Ph1 | Ph2 | I02 | I12
  ;            LOW  |LOW  |LOW  |LOW  |LOW |LOW
  ldi r21, 0x00
  out portb, r21
  out portd, r21
  rcall wait

  ; FULL STEP 2 I01 | I11 | Ph1 | Ph2 | I02 | I12
  ;            LOW  |LOW  |HIGH |LOW  |LOW  |LOW
  ldi r21, 0x04

  out portb, r21
  out portd, r21
  rcall wait

  ; FULL STEP 3 I01 | I11 | Ph1 | Ph2 | I02 | I12
  ;            LOW  |LOW  |HIGH |HIGH |LOW  |LOW
  ldi r21, 0x0C
  out portb, r21
  out portd, r21
  rcall wait

  ; FULL STEP 4 I01 | I11 | Ph1 | Ph2 | I02 | I12
  ;            LOW  |LOW  |LOW  |HIGH |LOW  |LOW
  ldi r21, 0x08
  out portb, r21
  out portd, r21
  rcall wait

  dec r16
  brne  MotorLoopVw      ;0 erreicht? nein -> Schleife

  ;Ende Port B&D alle Augänge = LOW
    ldi     r16,0x00 ;
    out portb, r16
  out portd, r21
  ende:
  rjmp ende


wait:  ldi  r19,1      ;r19,r18,r17 -> 3-Byte-Zähler ca 500ms bei r19 = 
10
  clr  r18      ;höchstes Byte = 10, restliche
  clr  r17      ;Bytes = 0
wait1:  dec  r17      ;niedrigstes Byte -1
  brne  wait1      ;0 erreicht? nein -> Schleife
  dec  r18      ;mittleres Byte -1
  brne  wait1      ;0 erreicht? nein -> Schleife
  dec  r19      ;höchstes Byte -1
  brne  wait1      ;0 erreicht? nein -> Schleife
  ret        ;Schleifenende, Rückkehr

Am Port B prüfe ich mit Hilfe von LED’s die Schaltfolge der Pins, Port D 
schaltet den Motortreiber. Leider macht der Motor keinen Mucks, obwohl 
die LED’S sich entsprechend der Schaltfolge verhalten. Den Motor habe 
entsprechend des Schaltplans geschaltet. Zwischen Braun und Schwarz, 
bzw. Gelb und Orange messe ich 7 Ohm. Die Spannungen am L6219 sind alle 
vorhanden, am Port 11 und 15 liegen über den Spannungsteiler 3,5 Volt 
an. Der Mikrokontroller ist auf einem Evaluierungsplatine stabil 
verankert, die Schaltung aus dem Logikplan habe ich auf einem Steckbrett 
gesteckt.
Ich bin mittlerweile ratlos und hoffe, dass Euch noch was auffällt.

Gruß, Smarki

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Ich würde zunächst mal schauen, ob der Motor ein spürbares Haltemoment 
entwickelt. Ein Bild der Platine bzw. des Aufbaus wäre für weitere Tipps 
hilfreich.

Die Implementierung kann man deutlich eleganter gestalten. Man kann die 
Bitmuster für die Schrittausgabe z.B. in einer Tabelle ablegen, und für 
die Schrittausgabe immer einen Wert aus der Tabelle holen. Mann muss 
dann je nach Drehrichtung nur den Zeiger erhöhen oder erniedrigen (und 
natürlich die Grenzen der Tabelle beachten). Bei Vollschritt ist das 
noch egal, aber wenn du so ein Projekt mit Mikroschritt programmierst, 
verlierst du sehr schnell den Überblick.

Mit freundlichen Grüßen
Thorsten Ostermann

von Smarki (Gast)


Lesenswert?

Thorsten Ostermann schrieb:
> Ich würde zunächst mal schauen, ob der Motor ein spürbares Haltemoment
>
> entwickelt.


Hallo Thorsten,

bei einem Bitmuster 0x00 (alle Ports auf Low) an PortD müsste der Motor 
die Position halten, oder wie teste ich das Haltemoment?

Gruß,
Smarki

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Ja, z.B. Falls der uC gesockelt ist könntest du den auch erstmal 
entfernen, und die Leitungen hart auf Masse oder +5V ziehen. Dann 
könntest du auch die Schrittsequenz manuell durchsteppen. Du brauchst ja 
erstmal nur die beiden Phase-Lines, die anderen 4 Leitungen können alle 
auf Masse bleiben.

Mit freundlichen Grüßen
Thorsten Ostermann

von smarki (Gast)


Lesenswert?

Hallo,

ich habe heute nochmal den L6219-Teil der Schaltung komplett neu 
gesteckt und siehe da, die Schaltung funktioniert doch.
War mal wieder ein blöder Verdrahtungsfehler, aber zum optimieren der 
Arbeitspunkte ist man halt manchmal auf das Steckboard angewiesen....

Sorry, war nur falscher Alarm.

Schönes Wochenende.....

von Smarki (Gast)


Lesenswert?

Hier ist noch ein sehr kostengünstiger Schrittmotor mit Getriebe der 
perfekt mit dem oben gelinkten Logikplan funktioniert:
http://www.pollin.de/shop/dt/MzE1OTg2OTk-/Motoren/Schrittmotoren/Getriebe_Schrittmotor_NMB_MAT_PG35L_048_USC0.html

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
Noch kein Account? Hier anmelden.