Ansteuerung 28byj-48 Steppermotor

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • sk8erboi schrieb:

    Vielleicht habe ich auch etwas in den flaschen Hals bekommen?
    Falls der Abgang nicht so gemeint war, wie er auf mich wirkte, tut es mir für das Missverständnis leid.
    Ja mit „ich bin raus“ wollte ich vermitteln das ich vom Thema abweiche. Ist doch "Codeschnipsel"
    Hatte auch nicht die Absicht über mein Bauplan einer Mini 3D Fräse zu diskutieren.

    Michael schrieb:

    Der Betrieb des Motors mit 12V ist ok, zumal er ja nur handwarm wird.
    Ich habe hier einen Motor, der 2,8V als Aufdruck hat, der Treiber bekommt 36V.
    Na nu du legst doch immer großen Wert auf Einhaltung der Technische Daten/Datenblatt.
    Ich nicht so toll, deshalb die Anfrage. Lege halt größeren Wert auf praktische Erfahrungen.

    tschoeatsch schrieb:

    Wenn man nicht mal mehr in moderne Leds schauen sollte, würde ich auch keinen Refexionsblitz eines schwachen Lasers im Auge haben wollen. Das hält mich von Spielereinen mit Lasern bisher ab. Mal schnell probieren, ob die Schutzbrille auch schützt, ist nicht so meins
    Da macht Euch keine Sorgen. Ist ein fertiges Minimodul und stammt aus einem Medizinischem Labor(USA). Ist ein fokussierbarer Faserlaser.
    Schnittspalt ist < 80µm. Schneiddüse mit Blasgas vorhanden. Ein Eigenbau ist wohl ausgeschlossen. Da für mein Material, ich nenne es einfach mal Plaste, nur eine Schnitttiefe von 8 mm Garantiert wird möchte ich natürlich den Kopf so nah wie möglich absenken.
    Der max. XY Vorschub wird laut Angabe mit Tiefe x 2,4 Sekunde angegeben.

    tschoeatsch schrieb:

    Das war doch so gemeint, max Drehzahl 88 U/min, oder?
    Die max Drehzahl von 88 U/min bezog sich auf Angabe „Schrittwinkel: 5.625 x 1/64“.
    Die Motoren sollen wie erwähnt nur für Verfahrensweg sein.
    Ein Getriebespiel sollte doch die Software ausglichen können. :?:
    Gruß
  • fredred schrieb:

    Na nu du legst doch immer großen Wert auf Einhaltung der Technische Daten/Datenblatt.
    Der Herr Henry definiert sich so: Vs/A
    Es geht hier nicht nur um Spannung, es muss auch Strom fließen können. Und dazu braucht
    es Zeit. Je kürzer also die Zeit, desdo größer sollte die Spannung sein.


    fredred schrieb:

    Lege halt größeren Wert auf praktische Erfahrungen.
    Auch praktische Erfahrungen gehen einher mit den technischen Grundlagen.
    Dazu zählen auch Technische Daten/Datenblatt.

    Michael schrieb:

    Der Betrieb des Motors mit 12V ist ok, zumal er ja nur handwarm wird.
    Ich habe hier einen Motor, der 2,8V als Aufdruck hat, der Treiber bekommt 36V.
    Was Michael da schreibt, sind auch "praktische Erfahrungen" . Eben auch auf
    technischen Grundlagen basierend.

    Detlef
    Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
  • Vergesst Bitte all mein Blabla.

    Nun habe ich diese Module bekommen.
    3x 28BYJ-48 DC5V Stepper Motor mit ULN2003 Driver Board.

    Eigenschaften:
    Hochwertiger Schrittmotor mit Getriebeuntersetzung, geräuscharm, reibungsloser Betrieb.
    ULN2003 Schrittmotor-Treiber-Karte: A, B, C, D Vier-Phasen-LED zeigt den Status der Schrittmotor Arbeit an.

    Technische Daten:
    Motorspannung: 5V
    Durchmesser: 28mm
    Schrittwinkel: 5.625 x 1/64
    Untersetzungsverhältnis: 1/64

    Mit der bipolaren Ansteuerung in Verbindung mit Stromregelung (wie mit L297/L298 ) noch nie Probleme gehabt(4 Anschlüsse).
    So wie diese Module beschrieben(5 Anschlüsse) können diese nur unipolar angesteuert werden.
    Kann aber nach meinen Versuchen nicht stimmen.
    Habe keine Probleme diese mit Halb- Vollschritt bipolar zu betreiben. Aber immer nur in eine Richtung obwohl mit der Software die „Richtung“ auch entgegen sein müsste.
    Also wie kann ich mit gleicher Vorgabe der Schritte die Richtung ändern?

    Motor4.bas

    Quellcode

    1. $regfile = "M644pdef.dat"
    2. $crystal = 16000000
    3. $baud = 19200
    4. $baud1 = 19200
    5. $hwstack = 100
    6. $swstack = 100
    7. $framesize = 100
    8. Print
    9. Print "erstallt am : " ; Version(1)
    10. Print "Version Code : " ; Version(3)
    11. Print
    12. Wait 1
    13. '###################################
    14. ' alle Print nur für Konntrolle.
    15. '###################################
    16. '********* LCD **************************************************
    17. Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2
    18. Config Lcd = 16 * 2
    19. Initlcd
    20. Cursor Off
    21. Cls
    22. '*** für Taster an .. ***
    23. Config Pinb.0 = Input 'Taster0
    24. Pinb.0 = 1
    25. Config Pinb.1 = Input 'Taster1
    26. Pinb.1 = 1
    27. '--- allg. Variablen -----------
    28. Dim Warte As Integer
    29. Dim R As Integer
    30. Dim Li As Integer
    31. Dim X As Integer
    32. '-------------------------------
    33. Config Portd.4 = Output
    34. Config Portd.5 = Output
    35. Config Portd.6 = Output
    36. Config Portd.7 = Output
    37. Spule1a Alias Portd.4
    38. Spule1b Alias Portd.5
    39. Spule2a Alias Portd.6
    40. Spule2b Alias Portd.7
    41. '**** Starteinstellungen ****
    42. Warte = 24 'Zeit für eine Umdrehung pro Minute
    43. '1 = Minimum bei dieser Schritteinstellung
    44. Spule1a = 0
    45. Spule1b = 0
    46. Spule2a = 0
    47. Spule2b = 0
    48. '***************************
    49. Do
    50. Locate 1 , 1
    51. Lcd "Motor-Stillstand"
    52. '!!!! hat nach Return immer einen Neustart ausgelöst !!!
    53. ' Debounce Pinb.0 , 0 , Rlauf ', Taster0
    54. ' Debounce Pinb.1 , 0 , Llauf ', Taster1
    55. 'Taster abfragen ist ja auch eine Art entprellen.
    56. If Pinb.0 = 0 Then
    57. Locate 1 , 1
    58. Lcd " Ist Rechtslauf "
    59. Waitms 50
    60. Gosub Rlauf
    61. End If
    62. If Pinb.1 = 0 Then
    63. Locate 1 , 1
    64. Lcd " Ist Linkslauf "
    65. Waitms 50
    66. Gosub Llauf
    67. End If
    68. Print "Taster0 " ; Pinb.0
    69. Print "Taster1 " ; Pinb.1
    70. '--- Zeit für Testlauf ---
    71. Wait 2
    72. Loop
    73. End
    74. Rlauf:
    75. Print "Rechts " ; Pinb.0
    76. For R = 1 To 512
    77. Locate 2 , 1
    78. Lcd "Schritte = " ; R
    79. Spule1a = 1
    80. Spule1b = 0
    81. Spule2a = 0
    82. Spule2b = 1
    83. Waitms Warte
    84. Spule1a = 1
    85. Spule1b = 0
    86. Spule2a = 1
    87. Spule2b = 0
    88. Waitms Warte
    89. Spule1a = 0
    90. Spule1b = 1
    91. Spule2a = 1
    92. Spule2b = 0
    93. Waitms Warte
    94. Spule1a = 0
    95. Spule1b = 1
    96. Spule2a = 0
    97. Spule2b = 1
    98. Waitms Warte
    99. Print "R= " ; R
    100. Next R
    101. '--- Spulen abschalten ---
    102. Spule1a = 0
    103. Spule1b = 0
    104. Spule2a = 0
    105. Spule2b = 0
    106. '--- Zeile leeren ---
    107. Locate 2 , 1
    108. Lcd Spc(16)
    109. Return
    110. Llauf:
    111. Print "Links " ; Pinb.1
    112. For Li = 1 To 512
    113. Locate 2 , 1
    114. Lcd "Schritte = " ; Li
    115. Spule1a = 0
    116. Spule1b = 1
    117. Spule2a = 0
    118. Spule2b = 1
    119. Waitms Warte
    120. Spule1a = 0
    121. Spule1b = 1
    122. Spule2a = 1
    123. Spule2b = 0
    124. Waitms Warte
    125. Spule1a = 1
    126. Spule1b = 0
    127. Spule2a = 1
    128. Spule2b = 0
    129. Waitms Warte
    130. Spule1a = 1
    131. Spule1b = 0
    132. Spule2a = 0
    133. Spule2b = 1
    134. Waitms Warte
    135. Print "L= " ; Li
    136. Next Li
    137. Spule1a = 0
    138. Spule1b = 0
    139. Spule2a = 0
    140. Spule2b = 0
    141. Locate 2 , 1
    142. Lcd Spc(16)
    143. Return
    Alles anzeigen



    Erfahrung mit dem billig Zeug:
    Wichtig ist die kleine Bauweise, der Nachteil des „langsamen“ Verfahrensweg wird durch Kraft wieder weg gemacht und der Haltestrom spielt durch Getriebe auch keine Rolle mehr.
    All dies habe ich getestet. Modul schafft es sogar die Spindeln eines Proxxson – Kreuztisch anzutreiben.
    Gleich noch als Antrieb für eine große Weihnachtspyramide erfolgreich getestet.Fest naht.

    Wär Nett wenn sich jemand die Software anschaut und mir sagt wo mein bescheuerter Irrtum liegt um die Drehrichtung zu ändern.
    Danke
    Ist vom Händler eingestellt. Naja gemeinsames Common auf + ist mir nicht bekannt oder?
    Bild1.jpg

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von fredred ()

  • Hallo fredred,
    sind das die kleinen Getriebemotoren mit der ULN - Platine? Da hatte ich im alten Forum ja was zu geschrieben- ist natürlich alles futsch :( . Aber den BASCOM- Code für den Testbetrieb hab ich noch :) . Ist für eine Drehrichtung; in die andere Richtung muß nur die Reihenfolge umgekehrt sein. Ist ja ähnlich wie Dein Code, das also nur als Ergänzung.
    Gruß Christian


    BASCOM-Quellcode

    1. '************************************************************
    2. ' Kleiner Mikrocontroller Einsteigerkurs
    3. ' (c) 2013/2014 ceperiga
    4. '------------------------------------------------------------
    5. ' Projektinfos: www.ceperiga.de
    6. '------------------------------------------------------------
    7. ' Stufe 1: Attiny 13
    8. '------------------------------------------------------------
    9. 'Informationen zur CC-Lizensierung:http://creativecommons.org
    10. '============================================================
    11. ' Name:
    12. ' Unit: 1.1.2
    13. '------------------------------------------------------------
    14. 'Beschreibung: Steppermotortest Vollschritt
    15. '************************************************************
    16. $regfile = "attiny13.dat" 'verwendeter Controller
    17. $crystal = 1200000 'Taktfrequenz
    18. $hwstack = 6 'Stackwerte und Framesize zuweisen
    19. $swstack = 6
    20. $framesize = 28
    21. '==============================================================================
    22. 'Ausgänge / Eingänge deklarieren / Aliasvergabe
    23. '------------------------------------------------------------------------------
    24. Config Portb = Output ' Ganzer Port B als Ausgang
    25. Dim I As Word
    26. '==============================================================================
    27. 'Hauptprogramm
    28. '------------------------------------------------------------------------------
    29. I = 1200
    30. Do 'Schleifenanfang
    31. Portb = 9 '1001
    32. Waitus I
    33. Portb = 5 '0101 '
    34. Waitus I
    35. Portb = 6 '0110
    36. Waitus I
    37. Portb = 10 '1010
    38. Waitus I
    39. Loop 'Zurück zu Do (Schleifenanfang)
    40. '==============================================================================
    41. End 'end program
    Alles anzeigen
    Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
  • @fredredHi Fred, wenn du zum 'Ausschalten' alle ports für die Spulen auf 0 legst, dann bestromst du die alle. Ist das so gedacht?


    Alles Quatsch, was ich geschrieben hab', es ist ja der ULN dazwischen!
    Raum für Notizen

    -----------------------------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------------------------

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

  • Danke für Hilfe.

    Nachdem ich diese Info fand.
    Zitat:
    Unipolar = Eine Stromrichtung
    Bipolar = Beide Stromrichtungen
    Bei Unipolar braucht man Spulen mit Mittelanzapfung. Hier legt man die Versorgungsspannung an die Mittelanzapfung der Spule an und steuert die Polung des Magnetfeldes in dem man die eine oder andere Spulenhälfte einschaltet.
    Bei Bipolar braucht man die Mittelanzapfung nicht, dafür muss man aber die Stromrichtung umkehren, z.B. mit einer H-Brücke.
    Zitat Ende:
    Habe ich erst mal auf Motoreingriff verzichtet und einfach mal diese Software-Variante für mein Testaufbau angepasst.

    ftelektro schrieb:

    Eine weitere Codemöglichkeit:
    Danke ftelektro.

    Mein Testcode

    Quellcode

    1. $regfile = "M644pdef.dat"
    2. $crystal = 16000000
    3. $baud = 19200
    4. $baud1 = 19200
    5. $hwstack = 100
    6. $swstack = 100
    7. $framesize = 100
    8. Print
    9. Print "erstallt am : " ; Version(1)
    10. Print "Version Code : " ; Version(3)
    11. Print
    12. Wait 1
    13. '************************ LCD **************************************************
    14. Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2
    15. Config Lcd = 16 * 2
    16. Initlcd
    17. Cursor Off
    18. Cls
    19. '*** für Test Taster ***
    20. Config Pinb.0 = Input
    21. Portb.0 = 1
    22. Taster0 Alias Pinb.0
    23. Config Pinb.1 = Input
    24. Portb.1 = 1
    25. Taster1 Alias Pinb.1
    26. '*** Pins für Motortreiber ***
    27. Config Portd = &B11110000
    28. 'oder so für besseres Verständnis
    29. '(
    30. Config Portd.4 = Output
    31. Config Portd.5 = Output
    32. Config Portd.6 = Output
    33. Config Portd.7 = Output
    34. Spule1a Alias Portd.4
    35. Spule1b Alias Portd.5
    36. Spule2a Alias Portd.6
    37. Spule2b Alias Portd.7
    38. Spule1a = 0
    39. Spule1b = 0
    40. Spule2a = 0
    41. Spule2b = 0
    42. ')
    43. Dim A As Byte
    44. Dim Br As Word
    45. Dim Bl As Word
    46. Dim Warte As Byte
    47. Warte = 8 'Zeit für eine Umdrehung pro Minute A = 1
    48. Do
    49. Portd = &B00000000
    50. Locate 1 , 1
    51. Lcd "Motor-Stillstand"
    52. If Pinb.0 = 0 Then
    53. Locate 1 , 1
    54. Lcd " Ist Rechtslauf "
    55. Waitms 50
    56. Gosub Rlauf
    57. End If
    58. If Pinb.1 = 0 Then
    59. Locate 1 , 1
    60. Lcd " Ist Linkslauf "
    61. Waitms 50
    62. Gosub Llauf
    63. End If
    64. Print "Taster0 " ; Pinb.0
    65. Print "Taster1 " ; Pinb.1
    66. '--- Zeit für Testlauf ---
    67. Wait 2
    68. Loop
    69. Rlauf:
    70. A = 1
    71. Print "Rechts"
    72. For Br = 1 To 2048 Step 1
    73. A = A - 1
    74. If A = 0 Then A = 8
    75. Waitms Warte
    76. Gosub Stepp
    77. Print "Br " ; Br
    78. Print "A " ; A
    79. Next Br
    80. Return
    81. Llauf:
    82. A = 1
    83. Print "Links"
    84. For Bl = 2048 To 1 Step -1
    85. A = A + 1
    86. If A = 9 Then A = 1
    87. Waitms Warte
    88. Gosub Stepp
    89. Print "Bl " ; Bl
    90. Print "A " ; A
    91. Next Bl
    92. Return
    93. Stepp:
    94. Select Case A
    95. Case 1 : Portd = &B10000000
    96. Case 2 : Portd = &B11000000
    97. Case 3 : Portd = &B00100000
    98. Case 4 : Portd = &B01100000
    99. Case 5 : Portd = &B00100000
    100. Case 6 : Portd = &B00110000
    101. Case 7 : Portd = &B00010000
    102. Case 8 : Portd = &B10010000
    103. End Select
    104. Return
    Alles anzeigen
    Siehe da der Motor dreht mal rechts und mal links wie gewünscht.
    Der Halbschrittbetrieb ist okay aber ich möchte nicht das komplette PortD für Motorsteuerung festlegen.
    Portd.0 bis Portd.3 sind für mich heilig(Uart für Datentransfer) in meinem Aufbau sind ja nur 4 Adern für Portd.4 bis Portd.7 nötig.
    Wenn ich die Pins 0 bis 3 ständig mit auf 0 ziehe, kommt Uart aus den „Tritt“.

    Die Mittelanzapfung wird ja vom ULN2003 Driver Board bedient.

    Somit Code wie ganz oben zu sehen/geschrieben funktioniert die Richtungsänderung nicht.
    Nun beschlägt meine Brille ständig beim schauen wo im Codevergleich mein Denkfehler ist.

    Mein Dank an alle für Hilfe.
    Ein Superdank an den der zeigt wo mein Programmierfehler lieg(CASE oder wo auch immer).
    Hardwarefehler ist ja nun ausgeschlossen.
    Mit freundlichen Grüßen
    Fred

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von fredred ()

  • Case 3: portd=&b01000000

    War wieder Quatsch, also nochmal neu:
    es darf nur durch eine Spulenhälfte Strom fließen, daher mein neuer Tipp
    10000000
    10100000
    00100000
    01100000
    01000000
    01010000
    00010000
    10010000
    Raum für Notizen

    -----------------------------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------------------------

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von tschoeatsch ()

  • Hallo Fredred, was passiert, wenn du dein Port D aufteilst in Aus- und Eingänge ?
    Vielleicht so : DDRD = &b11110000
    Ich würde dann ein Array für die Schritte schaffen.
    Vielleicht so: Dim Schritttab(8) As Byte
    Schritttab(1) =128
    Schritttab(2) = 192
    Schritttab(3) = 32
    Schritttab(4) = 96
    Schritttab(5) = 32
    Schritttab(6) = 48
    Schritttab(7) = 16
    Schritttab(8) = 144

    Und die Zuweisung dann : PortD=schritttab(A)
    Rechtslauf A von 1 nach 8 zählen, Linkslauf A von 8 nach 1 zählen.

    Kannst es ja mal versuchen.

    Detlef
    Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
  • @fredred schau nochmal meinen post an, ich hab' da alle bytes für jeden case-Fall aufgelistet. Bei dir im case 2, und im case 6 bestromst du beide Hälften einer Spule. Das Magnetfeld löscht sich dabei aus. Es darf pro Spule nur max eine Hälfte, a bzw b oder keine bestromt werden.
    Raum für Notizen

    -----------------------------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------------------------
  • Der Code nur für bestimmte Ports.Motor bewegt Engel mit einem Gesamtgewicht von ca 1,5Kg auf eimem
    Weihnachtsberg.Weglänge ca75cm.Für Viertelschritte Case 1,Case 3,Case 5 und Case7deaktivieren bzw.ausblenden.

    BASCOM-Quellcode

    1. 'Engelantrieb mit Schrittmotor 28BYJ-48 12V 1Umdrehung = 4096 Schritte
    2. 'Eingänge auf Minus geschalten.
    3. 'ftelektro
    4. $regfile = "attiny4313.dat"
    5. $crystal = 8000000 '8Mhz internal
    6. $hwstack = 40
    7. $swstack = 16
    8. $framesize = 32
    9. $sim
    10. Config Scl = Portb.7
    11. Config Sda = Portb.5
    12. 'Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portd.4 , Db7 = Portd.3 , E = Portd.2 , Rs = Portd.1
    13. Config Lcd = 20x4
    14. $lib "YwRobot_Lcd_i2c.lib" 'YwRobot Treiber für LCD
    15. Const Pcf8574_lcd = 126 'Adresse des I2C-LCDs
    16. 'Pcf8574_lcd = 78
    17. 'Pcf8574A_lcd = 126
    18. Dim Lcd_backlight As Byte '1 = an; 0 = aus. Wird erst durch einen LCD-Befehl umgesetzt!
    19. Config I2cdelay = 1 '1=1Mhz,5=200Khz,10=100Khz,15=66,66Khz
    20. 'Wenn in Lcd keine Anzeige muß der Delaywert erhöht werden.Mit Wert 15 beginnen und dann langsam verringern.
    21. Waitms 300 'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init!
    22. Display On
    23. Cursor Off , Noblink
    24. Cls
    25. 'Portb.6 = zum Schrittzeahler extern
    26. 'Portb.7 = Endschalter unten
    27. 'Portd.1 = Status Marke Led
    28. 'Portd.2 = Schalter zur Einstellung bei jedem Aufbau 1x erforderlich
    29. 'Portd.3 = Einzelschritte abwärts
    30. 'Portd.4 = Einzelschritte aufwärts
    31. 'Portd.5 = Status Endschalter Led und oder Beeper
    32. 'Portd.6 = Endschalter oben
    33. 'portd.0 = Display nullen
    34. Config Pina.0 = Input
    35. Config Pina.1 = Input
    36. Pina.0 = 1
    37. Pina.1 = 1
    38. Config Portb.0 = Output
    39. Config Portb.1 = Output
    40. Config Portb.2 = Output
    41. Config Portb.3 = Output
    42. Config Portb.4 = Input
    43. Portb.4 = 1
    44. Config Portb.6 = Output
    45. Config Portd.0 = Input
    46. Config Portd.1 = Output 'Marke (speicher) Led
    47. Config Portd.2 = Input
    48. Config Portd.3 = Input
    49. Config Portd.4 = Input
    50. Config Portd.5 = Output
    51. Config Portd.6 = Input
    52. Portd.0 = 1
    53. Portd.2 = 1 'pullup on
    54. Portd.3 = 1 'pullup on
    55. Portd.4 = 1 'pullup on
    56. Portd.6 = 1 'pullup on
    57. Led4 Alias Portb.6 'Impulszähler Led extern
    58. Led5 Alias Portd.5 'Endschalterauslösung Led
    59. 'variablen definieren
    60. Dim A As Byte
    61. Dim B As Word
    62. Dim F As Word
    63. Dim Fa As Word
    64. Dim I As Byte
    65. Dim X As Word
    66. Dim Y As Word
    67. Dim Marke As Byte
    68. A = 1
    69. If Pind.2 = 0 Then
    70. 'Engel nach oben
    71. 'Main:
    72. For F = 1 To 25000 Step 1
    73. A = A + 1
    74. If A = 9 Then A = 1
    75. Led4 = 1
    76. Gosub Drehen
    77. Waitms 10
    78. Led4 = 0
    79. If Pind.6 = 0 Then Exit For
    80. Portd.6 = 1
    81. Locate 1 , 1
    82. Lcd "Einstellfahrt-Engel "
    83. Locate 2 , 1
    84. Lcd F
    85. Locate 2 , 11
    86. Lcd "Schritte"
    87. Next
    88. Portd.5 = 0
    89. Portb.3 = 0
    90. Portb.2 = 0
    91. Portb.1 = 0
    92. Portb.0 = 0
    93. Portd.6 = 0
    94. Wait 3
    95. 'Engel um eine Viertelumdrehung nach unten bei auslösen des Endschalters Portd.6
    96. For Fa = 1 To 1024 Step 1
    97. A = A - 1
    98. If A = 0 Then A = 8
    99. Led4 = 1
    100. Gosub Drehen
    101. Waitms 10
    102. Toggle Portd.5
    103. Led4 = 0
    104. Locate 3 , 1
    105. Lcd Fa
    106. Locate 3 , 11
    107. Lcd "Schritte"
    108. Next
    109. Marke = 1
    110. Writeeeprom Marke , 20
    111. Portd.5 = 0
    112. Portb.3 = 0
    113. Portb.2 = 0
    114. Portb.1 = 0
    115. Portb.0 = 0
    116. If Pind.3 = 0 Then
    117. 'Engel um einen Schritt nach oben
    118. A = A + 1
    119. If A = 9 Then A = 1
    120. Gosub Drehen
    121. Waitms 2
    122. Portb.3 = 0
    123. Portb.2 = 0
    124. Portb.1 = 0
    125. Portb.0 = 0
    126. End If
    127. If Pind.4 = 0 Then
    128. 'Engel um einen Schritt nach unten
    129. A = A - 1
    130. If A = 0 Then A = 8
    131. Gosub Drehen
    132. Waitms 2
    133. Portb.3 = 0
    134. Portb.2 = 0
    135. Portb.1 = 0
    136. Portb.0 = 0
    137. End If
    138. End If
    139. Wait 15
    140. Cls
    141. Readeeprom Marke , 4
    142. 'Marke = 1
    143. If Marke = 1 Then
    144. Portd.1 = 1
    145. End If
    146. '--------------------- Engelbetätigung -----------------------------------------
    147. Do
    148. 'If Pind.2 = 0 Then Goto Main
    149. If Pina.0 = 0 Then Gosub Runter 'von SPS
    150. If Pina.1 = 0 Then Gosub Hoch 'von SPS
    151. If Pind.6 = 0 Then Gosub Ab 'Endschalter
    152. If Pinb.4 = 0 Then Gosub Auf 'Endschalter
    153. If Pind.0 = 0 Then Gosub Anz 'Display löschen
    154. Loop
    155. '------------------------ Gosubs -----------------------------------------------
    156. Anz:
    157. Cls
    158. Return
    159. Drehen:
    160. 'Tabelle Halbschrittsteuerung PortB.3 zu PortB.0
    161. Select Case A
    162. Case 1
    163. : Portb.3 = 1
    164. : Portb.2 = 0
    165. : Portb.1 = 0
    166. : Portb.0 = 0
    167. Case 2
    168. : Portb.3 = 1
    169. : Portb.2 = 1
    170. : Portb.1 = 0
    171. : Portb.0 = 0
    172. Case 3
    173. : Portb.3 = 0
    174. : Portb.2 = 1
    175. : Portb.1 = 0
    176. : Portb.0 = 0
    177. Case 4
    178. : Portb.3 = 0
    179. : Portb.2 = 1
    180. : Portb.1 = 1
    181. : Portb.0 = 0
    182. Case 5
    183. : Portb.3 = 0
    184. : Portb.2 = 0
    185. : Portb.1 = 1
    186. : Portb.0 = 0
    187. Case 6
    188. : Portb.3 = 0
    189. : Portb.2 = 0
    190. : Portb.1 = 1
    191. : Portb.0 = 1
    192. Case 7
    193. : Portb.3 = 0
    194. : Portb.2 = 0
    195. : Portb.1 = 0
    196. : Portb.0 = 1
    197. Case 8
    198. : Portb.3 = 1
    199. : Portb.2 = 0
    200. : Portb.1 = 0
    201. : Portb.0 = 1
    202. End Select
    203. Return
    204. Ab:
    205. 'Engel um eine Viertelumdrehung nach unten
    206. For F = 1 To 1024 Step 1
    207. A = A - 1
    208. If A = 0 Then A = 8
    209. Led4 = 1
    210. Gosub Drehen
    211. Waitms 10
    212. Toggle Portd.5
    213. Led4 = 0
    214. Locate 3 , 1
    215. Lcd F
    216. Locate 3 , 8
    217. Lcd "Endschalter"
    218. Next
    219. Marke = 1
    220. Writeeeprom Marke , 20
    221. Portd.5 = 0
    222. Portb.3 = 0
    223. Portb.2 = 0
    224. Portb.1 = 0
    225. Portb.0 = 0
    226. Wait 5
    227. Cls
    228. Return
    229. Auf:
    230. 'Engel um eine Viertelumdrehung nach oben
    231. For F = 1 To 1024 Step 1
    232. A = A + 1
    233. If A = 9 Then A = 1
    234. Led4 = 1
    235. Gosub Drehen
    236. Waitms 10
    237. Toggle Portd.5
    238. Led4 = 0
    239. Locate 3 , 1
    240. Lcd F
    241. Locate 3 , 11
    242. Lcd "Endschalter"
    243. Next
    244. Marke = 0
    245. Writeeeprom Marke , 20
    246. Portd.5 = 0
    247. Portb.3 = 0
    248. Portb.2 = 0
    249. Portb.1 = 0
    250. Portb.0 = 0
    251. Wait 5
    252. Cls
    253. Return
    254. Runter:
    255. 'wenn Engel oben, dann senken, wenn Engel unten passiert nichts
    256. If Pina.0 = 0 And Marke = 1 Then Gosub Engel_runter
    257. Return
    258. Hoch:
    259. 'wenn Engel unten, dann heben, wenn Engel oben passiert nichts
    260. If Pina.1 = 0 And Marke = 0 Then Gosub Engel_hoch
    261. Return
    262. Engel_hoch:
    263. X = 4000
    264. Y = 1000
    265. For B = 1 To 18000 Step 1
    266. A = A + 1
    267. If A = 9 Then A = 1
    268. 'Bremsen
    269. If B >= 14000 Then
    270. Incr X
    271. 'Volle Fahrt
    272. Elseif B >= 4001 Then
    273. X = Y
    274. Else
    275. 'Anfahren
    276. If B <= 4000 Then
    277. Decr X
    278. End If
    279. End If
    280. Led4 = 1
    281. Gosub Drehen
    282. Waitus X
    283. Led4 = 0
    284. Locate 4 , 1
    285. Lcd B
    286. Locate 4 , 7
    287. Lcd "Schritte hoch"
    288. Next B
    289. Marke = 1
    290. Writeeeprom Marke , 4
    291. Portb.3 = 0
    292. Portb.2 = 0
    293. Portb.1 = 0
    294. Portb.0 = 0
    295. If Marke = 1 Then
    296. Portd.1 = 1
    297. End If
    298. Wait 5
    299. Cls
    300. Return
    301. Engel_runter:
    302. X = 4000
    303. Y = 1000
    304. Portd.1 = 0
    305. For B = 1 To 18000 Step 1
    306. A = A - 1
    307. If A = 0 Then A = 8
    308. 'Bremsen
    309. If B >= 14000 Then
    310. Incr X
    311. 'Volle Fahrt
    312. Elseif B >= 4001 Then
    313. X = Y
    314. Else
    315. 'Anfahren
    316. If B <= 4000 Then
    317. Decr X
    318. End If
    319. End If
    320. Led4 = 1
    321. Gosub Drehen
    322. Waitus X
    323. Led4 = 0
    324. Locate 4 , 1
    325. Lcd B
    326. Locate 4 , 7
    327. Lcd "Schritte runter"
    328. Next B
    329. Marke = 0
    330. Writeeeprom Marke , 4
    331. Portb.3 = 0
    332. Portb.2 = 0
    333. Portb.1 = 0
    334. Portb.0 = 0
    335. If Marke = 0 Then
    336. Do
    337. If Pina.1 = 0 Then
    338. Exit Do
    339. End If
    340. Waitms 1500
    341. Toggle Portd.1
    342. If Pina.1 = 0 Then
    343. Exit Do
    344. End If
    345. Loop
    346. End If
    347. Wait 5
    348. Cls
    349. Return
    350. 'Dta:
    351. ' $eeprom
    352. ' Data 255 , 255 , 255 , 255 , 1 ,
    353. ' $data
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ftelektro ()

  • @fredred
    Ich habe die Werte für die Schritttab.aus deinem Programm aus deinem Post #32 genommen
    und in dezimal umgerechnet. Wenn deine CASE - Werte nicht richtig sind, stimmen auch die Werte
    in der schritttab. nicht. !!!!!!
    Ich habe das nicht weiter überprüft. Werte müssen dann neu berechnet werden.

    Die Vorgehensweise ist aus einem Programm zur Ansteuerung einer Fräse. Meine Fräse hat
    zwar Bipolarmotore und damit eine Schritttabelle die nur bis 4 geht, aber das Prinzip ist das gleiche.

    Detlef
    Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
  • Dekaman schrieb:

    Hallo Fredred, was passiert, wenn du dein Port D aufteilst in Aus- und Eingänge ?
    Vielleicht so : DDRD = &b11110000
    Ich würde dann ein Array für die Schritte schaffen.
    Vielleicht so: Dim Schritttab(8) As Byte
    Schritttab(1) =128
    Schritttab(2) = 192
    Schritttab(3) = 32
    Schritttab(4) = 96
    Schritttab(5) = 32
    Schritttab(6) = 48
    Schritttab(7) = 16
    Schritttab(8) = 144

    Und die Zuweisung dann : PortD=schritttab(A)
    Rechtslauf A von 1 nach 8 zählen, Linkslauf A von 8 nach 1 zählen.

    Kannst es ja mal versuchen.

    Detlef


    Danke

    Nein ich möchte, will nicht DDRD = &b11110000 nutzen.
    Ist doch schon sehr oft von mir erwähnt. Bascom ist Klasse. Aber das ansprechen der Register ist vielfältig möglich.
    Für mich ein Vorteil aber für dritte die nicht wissen „was im Eingemachten“ passiert nicht so toll.

    Möchte nicht wieder Thema verfehlen aber der Hinweis sollte erlaubt sein.
    Mit $baudx = x wird Uart definiert(Rx und Tx) ist ja super.

    Nun macht ein Programmierer den Fehler diese Register(nach Lust und Laune) wenn möglich neu zu setzen.
    Na klar wird dies vom Uart- Flag versucht zu verhindern. Ist aber sehr instabile, wenn ein „sinnloses Bit“ mit Takt gesetzt wird.
    Fragt euch mal was sollen die Fusebiteinstellungen?
    Sind doch wichtige Ventileinstellungen, wo und wann der Behälter gefüllt oder entleert werden soll. Na klar wenn es nur um einen Tropfen geht. Müssen wir nur warten bis der Behälter platzt oder total leer ist. Kann ja dauern.
    Ich nannte und nenne es auch heute noch „Chaos- Programmierung“ man ist nicht immer abhängig von der Hardware wenn diese flecksiebel ist.

    Mit freundlichen Grüßen