- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 41

Thema: Bascom: Schrittmotorsteuerung mit Drehencoder?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78

    Bascom: Schrittmotorsteuerung mit Drehencoder?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Leute ich hab mal wieder eine Frage, bin lausiger Programmier-Anfänger:

    Ich will einen Schrittmotor steuern, der 48 S/U hat und per A3967 getrieben wird, also mit Enable, Dir und Step. Die Hardware steht und funktioniert, hab ein kl. Testprogramm damit laufen.
    Code:
      ' Stepper_test1.bas - Testprogramm  für A3967 Platine mit Dir Step und Enable
    
    $regfile = "attiny2313.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 8000000                                          'Quarzfrequenz
    $baud = 9600
    
    
    
    Declare Sub Key_pressed
    Dim I As Long
    Config Timer1 = Timer , Prescale = 1
    Enable Timer1
    Timsk.toie1 = 1
    Dim Timer1_reload As Word
    Portd.4 = 1                                                 ' Pullup Widerstand ein   für Enable - ****Enable =0 bedeutet Motor On!!!!  ****
    Enable Interrupts
    
    Config Pind.2 = Output
    Stepper_takt Alias Portd.2
    
    Config Pind.4 = Output
       Stepper_enable Alias Portd.4
       Portd.4 = 0                                              'sprich Motor ON
    
    On Timer1 Isr_timer1
    
     ' Step/Takt auf PD.2 / Taster auf PD.3 / Enable auf PD4 / Richtung auf PD5 /
    
               '***********Hauptschleife:**********
    
    Do
    
    
    
    Loop
    
    End
    
    
    
    Isr_timer1:
       Timer1_reload = 45536                                    ' Vorgabe für 400 / sec
       Timer1 = Timer1_reload
       Toggle Stepper_takt
    Return

    Der Schrittmotor soll nun aber mittels eines Drehencoders langsamer und schneller gemacht werden, die Routine hab ich aus dem Hoffmann-Buch.

    Code:
    '-----Deklarationen fuer Drehimpulsgeber:
    Config Portd.0 = Input : Encoder_a Alias Pind.0             'Encoder Signal B  an Pin 2
    Config Portd.1 = Input : Encoder_b Alias Pind.1             'Encoder Signal A  an Pin 3
    Config Pind.3 = Input : Taster1 Alias Pind.3
    
    Pind.0 = 1                                                  'Pullups für den Drehencoder
    Pind.1 = 1
    Pind.3 = 1
                                                                'LED-Outputs:
    Config Portd.2 = Output : Portd.2 = 0                       'das ist Pin 6   alles mit Pulldown
    Config Portd.5 = Output : Portd.5 = 0                       ' Pin 9
    Config Portb.4 = Output : Portb.4 = 0                       ' Pin 16
    Led_gelb Alias Portd.2
    Led_gruen Alias Portd.5
    Led_rot Alias Portb.4
    
    ' BASCOM-Programm
    ' Stefan Hoffmann 2009
    ' Drehimpulsgeber/Encoder     mit ENCODER-Befehl
    '
    ' In: Drehimpulsgeber an d.0 und d.1 sowie Taster
    
    Dim Wert As Word
    Wert = 100
    Dim Zustand As Byte
    
    Do
    Zustand = Encoder(pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 1)
    
       If Wert > 100 Then Led_rot = 1
    
       If Wert < 100 Then Led_gruen = 1
    
       If Taster1 = 0 Then Led_gelb = 1
                                              'Zu Testzwecken
    Loop
    End
    
    Linksroutine:
    Decr Wert
    Return
    
    Rechtsroutine:
    Incr Wert
    Return
    Ich schnall einfach nicht, wie ich diese Routine mit einer Timer-Takterzeugung verheiraten kann. Der Takt ist doch konstant, und die Encoder-Routine braucht das doch als Variable, oder?

    Habt ihr eine Idee, wie man so was lösen kann?

    Vielen Dank für Anregungen!

    MM08

    (PS: - ich hatte schon einen anderen Code in Arbeit - s. Link und wieder verworfen, weil ich da schließlich vor dem gleichen Problem stand und kein Takt rauskam. Jetzt will ich das Ganze mal abspecken und klein und möglichst einfach wieder anfangen.)
    Geändert von MrMiffy08 (13.10.2012 um 12:47 Uhr)

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78
    Hallo,

    merkwürdig, in meinen Emails sehe ich dass HeXPloreR mir am Nachmittag zweimal geantwortet hat, aber im Forum sehe ich die Beiträge bis jetzt nicht. Hab schon mal aus- und eingeloggt, kpl. neu gestartet, mal sehen wann ich sie sehen kann.

    Ich habe jedenfalls nach seinen Vorschlägen (im unteren Codeschnipsel) die Doppelpunkte weggenommen und eigene Zeilen für jeden Befehl gemacht und die Inputs mit PIN statt Port benannt.
    Jetzt passiert hier schon mal etwas mehr und Reproduzierbares, aber so richtig glücklich bin ich damit noch nicht. Ich mache da morgen mal weiter mit, muss mal in die Heia.

    Grüße MM08
    Geändert von MrMiffy08 (17.10.2012 um 23:39 Uhr) Grund: Daddeldu im Text

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    ja richtig, aber ich habe sie wieder gelöscht weil ich einfach noch zu unsicher bin was die Port config betrfft. Und ich möchte mir abgewöhnen zu schnell und vorallem wenig hilfreiche Beträge ab zu geben

    Aber denke schon das es PinD.0 statt PortD.0, bei InPut heissen müsste. PortD (OHNE .x) benutzt man besser nur wenn man den ganzen Port als Input nutzen möchte.

    Benutzt Du denn auch Drehimpulsgeber so wie im Beispiel gedacht (Hab das Buch seit gestern nachmittag auch )
    Taster extra oder im Geber?
    Taster korrekt angeschlossen (Pullup/-down beachtet)?

    Mehr weiß ich dazu momentan nicht.

    Viel Erfolg
    Geändert von HeXPloreR (14.10.2012 um 08:13 Uhr)

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.01.2007
    Ort
    westliches Pannonien
    Beiträge
    123
    Ja, Super! Ihr seid klasse!

    Mein 2.0.7.3 macht den Code so geändert jetzt auch!

    Vielen, vielen Dank!

    Wie schön, dass hier so viele hilfreiche Leute am Werk sind, die ihr Wissen mit anderen teilen.....


    Diese Antwort in dem anderen Faden läßt allerdings den Schluß zu,
    daß das Problem erledigt ist, oder?

    MfG

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78
    Hallo zusammen,
    @HeXPloreR - danke für den Hinweis mit Port und Pin, das half schon mal weiter. DIe mit : getrennten Anweisungen hatte ich mal irgendwo gesehen und sofort falsch zur Regel erklärt. Ich gewöhn mir das sofort wieder ab!

    Ja, den Encoder nutze ich wie im Buch - mit der Änderung dass die Kontakte jeweils noch 100nF gegen GND als Entprellung bekommen haben. UNd Pullups sind im zweiten Code drin, ich benutze den eingebauten Taster auch, ebenfalls mit Pullup, die schalten ja alle gegen GND.

    @Rone -
    (PS: - ich hatte schon einen anderen Code in Arbeit - s. Link und wieder verworfen, weil ich da schließlich vor dem gleichen Problem stand und kein Takt rauskam. Jetzt will ich das Ganze mal abspecken und klein und möglichst einfach wieder anfangen.)
    ist ja schon eine Weile her; das "erledigt" bezog sich auf die unklare Fehlermeldung des Compilers, die dann endlich weg war. Die grundsätzliche Problematik die sich danach stellte war, dass keine sinnvolle Funktion dabei herauskam. Ich mach dazu noch mal einen abschließenden Beitrag in dem anderen Thread.

    Was hier jetzt übrig ist, ist dass die beiden Teilcodes funktionieren, aber ich noch keine Ahnung habe wie ich den Drehencoder Code mit dem Rest so verknüpfe dass der Takt für den Schrittmotor im ersten Teil sich dadurch regeln läßt. Dazu eine Idee? Ich bin mit Variablen &Co nicht sehr erfahren, was man da so anstellen kann.

    Vielen Dank für weitere Hilfe!
    Geändert von MrMiffy08 (14.10.2012 um 11:06 Uhr)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.07.2009
    Beiträge
    405
    Ich habe mal ein Board geroutet da hat es mit den Kondensatoren am Encoder nicht geklappt - ohne dann schon.
    Meine Idee war das im encoder Befehl ein entprellen schon integriert ist?

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78
    Hallo dussel,

    das wäre schön und würde zwei Teile einsparen. Ich habe den selben Encoder (ALPS STEC12E) mit und ohne 100nF ausprobiert, beides hat die gleiche Wirkung. Ich versuche morgen mal das dezidiert zu beschreiben.

    Wichtiger wäre mir allerdings die Problematik der "Verheiratung" der beiden Code-Stücke zu etwas sinnvollem. Dazu jmd Anregungen?

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Wie wäre es denn wenn Du die Codestücke ordnest - also die Teile der Encoderabfrage dort hin schreibst wo zum beispiel die Ports und Subs definiert/deklariert werden...deine Encoderabfrage mit in die do loop der (leeren) Hauptschleife kopieren oder ausschneiden. Die do loop vom encoder vorher im einzelprogramm kann man komplett auskommentieren ( '( ...auskommentierter codetext... ') oder normal mit ' ) oder entfernen. Die Subs bleiben wo sie sind.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    02.04.2009
    Beiträge
    78
    Ok, ich versuch's mal.


    Code:
      ' Testprogramm  für A3967 Platine mit Dir Step und Enable
    
    $regfile = "attiny2313.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 8000000                                          'Quarzfrequenz
    $baud = 9600
    
    
    Config Timer1 = Timer , Prescale = 1
    Enable Timer1
    Timsk.toie1 = 1
    Dim Timer1_reload As Word
    Portd.4 = 1                                                  ' Pullup Widerstand ein   für Enable - ****Enable =0 bedeutet Motor On!!!!  ****
    Enable Interrupts
    
                    ' Inputs: Drehimpulsgeber an d.0 und d.1 sowie Taster an d.3
    '-----Deklarationen fuer Drehimpulsgeber:
    Config Pind.0 = Input 
        Encoder_a Alias Pind.0             'Encoder Signal B  an Pin 2
    Config Pind.1 = Input 
        Encoder_b Alias Pind.1             'Encoder Signal A  an Pin 3
    Config Pind.3 = Input 
        Taster1 Alias Pind.3
    
    Pind.0 = 1                                                  'Pullups für den Drehencoder
    Pind.1 = 1
    Pind.3 = 1
                                                                    'LED-Outputs stellvertretend für Step, Dir, Enable
                    ' In der endgültigen Hardware liegen: Step/Takt auf PD.2 / Taster auf PD.3 / Enable auf PD4 / Richtung auf PD5 /
    Config Portd.2 = Output 
        Portd.2 = 0                       'das ist Pin 6   - alles mit Pulldown   -  steht für Step/Takt
    Config Portd.5 = Output 
        Portd.5 = 0               ' Pin 9  - der hier steht für Dir
    Config Portb.4 = Output 
        Portb.4 = 0                       ' Pin 16   -  diese Led steht für Enable
    
    Led_gelb Alias Portd.2
    Led_gruen Alias Portd.5
    Led_rot Alias Portb.4
    
    
    On Timer1 Isr_timer1        'Deklaration der Timerroutine
                    
        
    Dim Wert As Word
    Wert = 100                          'willkürlich gewählter Startwert
    Dim Zustand As Byte
    
           '***********Hauptschleife:**********
    Do
    
    Zustand = Encoder(Pind.0 , Pind.1 , Linksroutine , Rechtsroutine , 0)
    
       If Wert > 100 Then Led_rot = 1
    
       If Wert < 100 Then Led_gruen = 1
    
    Loop
    
    End
    
    
    Isr_timer1:
       Timer1_reload = 45536                                    'Vorgabe für 400 / sec
       Timer1 = Timer1_reload
       Toggle Led_gelb        '= Stepper_takt
    Return
    
    
    Linksroutine:
    Decr Wert
    Return
    
    Rechtsroutine:
    Incr Wert
    Return
    So, und beim Starten dieses Codes leuchtet zunächst die gelbe Led (ist klar, Timer1), und beim Drehen je eine Raste leuchtet grün und in die andere rot, gehen aber nicht wieder aus. Dies jeweils egal mit Encoder mit 100nF gegen GND oder ohne und ebenso mit dem Pollin-Drehencoder ohne Kondensatoren, der hier schon mehrfach angesprochen wurde und der mehr oder weniger Ärger macht.
    Ich habe an der Encoder-Routine mal hinten die 1 auf 0 geändert, weil ich ja das Prog ja weiter laufen lassen will. Mit 1 stoppt es hier wohl.

    Wie bekomme ich es hin dass rot und grün wieder ausgehen?
    Uind eben das Grundproblem - wie bekomme ich schnelleren/langsameren Takt an D2/Led_Gelb aufgrund Links/Rechtsdrehung hin?

    Vielen Dank für Eure Anregungen!
    Geändert von MrMiffy08 (16.10.2012 um 22:19 Uhr) Grund: paar Fehlerchen

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    die LEDs gehen nicht aus weil Du sie nur einschaltest wenn > oder < ... einfach noch ne bedingung mit dazu schreiben die ausschaltet wenn > oder < jeweils dazu. leider wenig zeit grade...

    EDIT: Kann es sein, das unter jedes IF auch ein END IF muss?
    Geändert von HeXPloreR (17.10.2012 um 16:47 Uhr)

Seite 1 von 5 123 ... LetzteLetzte

Ähnliche Themen

  1. Schrittmotorsteuerung LB1845 und atmega48 in BASCOM
    Von chris155 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 09.05.2010, 18:41
  2. Wie Drehencoder anschließen ?
    Von Blamaster im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 07.09.2009, 19:01
  3. Menüsteuerung mit Drehencoder ?
    Von Blamaster im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 25
    Letzter Beitrag: 30.06.2009, 22:34
  4. Drehencoder auswerten
    Von MartinFunk im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 16.05.2007, 16:05
  5. Drehencoder Panasonic
    Von Mr-400-Volt im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 04.02.2007, 20:47

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad