Schrittmotoransprache über stm32f103 und DM422C

timbo_2023

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
- Dies ist mein erster Forenbeitrag -



Es soll ein Signal auf den PUL-Eingang (PA2) einer Schrittmotorsteuerung gesandt werden.

Dies mit folgendem Programmieransatz, um ein erstes Verfahren zu gewährleisten:


C++:
    RCC->APB2ENR |= 0xFC;


    // PA2, PA3 müssen wir als Output deklarieren und "freischalten"

    GPIOA->CRL = 0x44443344; // Pin-Konfiguration setzen

    GPIOA->ODR |= (1<<4);    // ENA auf "high" setzen


    delay_ms(500);


    GPIOA->ODR |= (1<<3);     // Richtungswahl DIR


while (1)

  {

          GPIOA->ODR = (1<<2);


          delay_ms(500);


          GPIOA->ODR = (0<<2);


          delay_ms(500);

  }



Leider steht der Schrittmotor nach wie vor "fest".



Meine Fragen also:

(1)
Kann man diese Aufgabe grundsätzlich durch ein Umschalten (engl. toggle) realisieren?

(2)
Wie schicke ich über PA2 einer stm32f103 eine Sequenz (beispielsweise eine 4-Schrittsequenz) an selbigen Pin?
 
Zuletzt bearbeitet:
Bis Du Dir bewusst, dass Du mit den Befehlen in der while-Schleife die vorher gesetzten Bits (z. B. ENA oder DIR) wieder mit Null überschreibst?
 
Jetzt denk doch bitte mal nach.
Du musst dafür sorgen dass nur das PUL-Bit wackelt, und die anderen Bits ihren Zustand behalten.
Das geht mit passenden Bit-Operationen |= oder &=
 
Mit der Aussage gehe ich schon wieder nicht ganz mit.
Ich muss dafür sorgen, dass eine 4- oder 8-Schrittfrequenz definiert über einen Pin geht ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...Ich muss dafür sorgen, dass eine 4- oder 8-Schrittfrequenz definiert über einen Pin geht ...
Nein.
Die Ansteuerung der Spulen des Motors macht der DM422C selbst.
Du musst nur die Richtung über DIR vorgeben, den ENA setzen und auf PUL pulsen.
Wenn Du die Pinkonfiguration und den DM422C richtig konfiguriert hast und alles richtig verdrahtet hast, dreht sich dann der Motor.
 
Reines Kopieren, hilft nicht immer.....
Was meinst du mit 4- oder 8-Schrittfrequenz?
Soweit mir bekannt ist werden die Microsteps am DM422C über DIP eingestellt.
Falls du jedoch nur 4 Zyklen oder 8 Zyklen pulsen möchtest, denke an Zählende schleifen.


Code:
    RCC->APB2ENR |= 0xFC;
    // PA2, PA3 müssen wir als Output deklarieren und "freischalten"
    GPIOA->CRL = 0x44443344; // Pin-Konfiguration setzen
    GPIOA->ODR |= (1<<4);    // ENA auf "high" setzen
    delay_ms(500);
    GPIOA->ODR |= (1<<3);     // Richtungswahl DIR

while (1)
{
          GPIOA->ODR |=1<<2;  //setzt das PUL, ENA und DIR werden beibehalten
          delay_ms(500);
          GPIOA->ODR &=1<<3|1<<4; // ENA  und DIR beibehalten, Rest(PUL) ablöschen
          delay_ms(500);
}
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Morgen könnte ich einmal ein Bild von dem Versuchsaufbau hier veröffentlichen.

Anbei einmal die Datenblatt-Vorgaben für das Signal, das jeweils auf den PUL- und DIR-Eingang des DM422C kommen muss.

(1)
Meiner Meinung nach reichen eigentlich PUL und DIR doch aus, sowohl verkabelt als auch angesprochen.

(2)
Könntest Du mir eventuell einmal den "single" oder "double pulse mode" hieraus kurz in zwei, drei Sätzen erklären?



Bildschirmfoto vom 2023-11-06 15-59-13.png
 
Hi,

(2)
single pulse: es wird nur der Eingang PUL gepulst, reagiert entweder auf Flanke 0->1 oder auf 1->0 (einstellbar), über den Eingang DIR wird die Drehrichtung festgelegt, ist er 0 dreht er bei Pulse über PUL in die eine Richtung und bei 1 in die andere
pulse pulse: es werden beide Eingänge gepulst aber nur einer zur Zeit. Über PUL dreht er in die eine Richtung über DIR in die andere.

(1) ist also richtig/möglich, kommt auf darauf an wie die Schrittmotorsteuerung konfiguriert ist. Dazu kommt. ob die Eingänge richtig angeschlossen sind, also OPTO mit VCC und die anderen Eingänge vom MC auf GND gezogen werden.

In Deinem Programm machst Du den Fehler in der WHILE Schleife das Du mit
Code:
GPIOA->ODR = (1<<2);
nur einen Ausgang (0000 0100) auf 1 setzt da Du nur eine einfache Zuweisung machst. Das ENA wird also wieder gelöscht. Sieh Dir mal die Anweisung daran. Da wird der Ausgang für ENA zusätzlich zu bereits bestehenden Bits gesetzt.
Code:
GPIOA->ODR = (0<<2);
ist Blödsinn, da Du dort den Wert 0 um 2 Stellen nach links verschiebst, und das ist immer noch 0.

Code:
          GPIOA->ODR |= (1<<2);  //setzt das PUL, ENA und DIR werden beibehalten
          delay_ms(500);
          GPIOA->ODR &= !(1<<2); // PUL löschen (0000 0001 -> 0000 0100-> 1111 1011), ENA und DIR werden beibehalten
          delay_ms(500);
 
Anbei einmal ein Foto von meinem nicht funktionierenden Versuchsaufbau -

Gerne nehme ich Kritik zur Verkabelung entgegen -

Ist es seitens des Programms nicht sinnvoller mit dem BRR oder BSRR zu arbeiten?

IMG_20231108_145026_719_DIS-min.jpg
 
Auf dem ersten Blick sieht es gar nicht so schlecht aus. Die verwendeten Pins kann man natürlich schlecht erkennen.

Die Frage ist ob die richtig konfiguriert sind, die sollten mit dieser Verdrahtung als Open Drain konfiguriert werden.

Habe gerade gesehen das ich die falsche Negierung gewählt habe.

Code:
GPIOA->ODR &= ~(1<<2); // PUL löschen (0000 0001 -> 0000 0100-> 1111 1011), ENA und DIR werden beibehalten
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@ illi :
Mikrocontroller mit Puls-Ausgabe an DM422C (und dies seitens des Programms)

@ Thruser :
Das verwunderte mich schon, bisher funktioniert es dennoch nicht.
Aber aufbauend auf Ihrer Antwort, macht es einen Unterschied in diesem Falle über dem ODR oder BRR, BSRR (?!) zu "toggeln"?
Gibt es hier Erfahrungswerte oder Restriktionen oder, oder, oder...?
 
Zurück
Oben