Autor Thema: Unipolarer Stepper  (Gelesen 11004 mal)

Offline radar17892

  • Sr. Member
  • ****
  • Beiträge: 788
  • Think easy!
    • mollgruppe
Unipolarer Stepper
« am: Juni 16, 2018, 23:32:46 Nachmittag »
Hallo Leute,

zum Basteln hatte ich mir letztens Schrittmotoren für meinen Raspi zugelegt. (Elegoo Schrittmotor 5V 28BYJ-48 und Treiberplatine ULN2003 für Arduino)
Dabei kam ich auch auf die Idee das mit meiner SPS umzusetzten. Python-Scripte und ST unterscheiden sich nicht sehr, deshalb war ein kleiner FB zum testen relativ schnell geschrieben.
Man gibt dem FB eine Geschwindigkeit, Drehrichtung und Freigabe. Der FB liefert eine Halbschrittzahl (Incremente) zurück. Ist das Fahrziehl erreicht, nimmt man einfach die Freigabe weg.

Da die Treiberplatine nur 5V Eingänge hat, drücke ich die 24V von den SPS Ausgängen einfach über Spannungsteiler runter.
Durch die höhere Zykluszeit einer SPS gegenüber dem Scriptablauf auf dem Raspi ist die max Geschwindigkeit hier natürlich geringer.

FUNCTION_BLOCK Stepper
(*
##############################################################
Programmbeschreibung:
Entwurf  Ansteuerung für einen unipolaren Schrittmotor mit 4 Spulen.
Zwischen dem Weiterschalten der Spulen wird je nach Speedwert n Zyklen gewartet
Bei Testantrieb mit 1/64 Getriebe sind Speedwerte erst ab 240 sinnvoll
Bei 10ms Zykluszeit -> max 0,2U/s
getestet: nur in der Simulation, aber OK
##############################################################
Änderungsindex
Name:TL Version:0.1 Datum: 06.06.2018 Grund: neu

##############################################################
*)
VAR_INPUT
Frg: BOOL; (*Freigabe*)
dir: BOOL; (*Drehrichtung  0=cw 1=acw*)
speed: BYTE; (*Geschwindigkeitssollwert 0-255*)
mode: BOOL; (*Halb / Vollschritt*)
END_VAR
VAR_OUTPUT
coil: BYTE; (*Bit 0-3 Steuerausgang Spulen*)
C1: BOOL; (*Spule1*)
C2: BOOL; (*Spule2*)
C3: BOOL; (*Spule3*)
C4: BOOL; (*Spule4*)
END_VAR
VAR_IN_OUT
steps: DINT; (*Incrementaler Fahrweg in Halbschritten*)
END_VAR
VAR
Schritt: SINT; (*Interne Steps für eine Umdrehung*)
delay: BYTE; (*Zyklen Verzögerung bis nächster Schritt*)
Pause: INT; (*abgelaufene Verzögerung*)
END_VAR


delay:= NOT speed; (*Speedwert invertieren*)
IF Frg AND (Pause >= delay) THEN (*wenn Pause abgelaufen, dann*)
Pause := 0;
(*Halbschritte*)
CASE Schritt OF (*Spulen ansteuern*)
0: coil:=1;
1: coil:=3;
2: coil:=2;
3: coil:=6;
4: coil:=4;
5: coil:=12;
6: coil:=8;
7: coil:=9;
ELSE coil:=0;
END_CASE
IF NOT dir (*bei rechtslauf interne Schritte und Incremente hochzählen*)
THEN Schritt:= Schritt +1;
steps:= steps +1;
ELSIF dir (*bei linkslauf interne Schritte und Incremente runterzählen*)
THEN Schritt:= Schritt -1;
steps:= steps -1;
END_IF
(*Rotation interne Schritte*)
IF Schritt <0 THEN Schritt :=7;
ELSIF Schritt > 7 THEN Schritt := 0;
END_IF
ELSE ;
END_IF
IF Frg THEN Pause := Pause +1; (*Pausenzeit hochzählen*)
END_IF
(*eventuell erst noch kurz Bremsstrom drauf lassen Testen!*)
IF NOT Frg THEN Coil :=0; (*ohne Freigabe Spulen abschalten*)
END_IF
(*Spulenausgänge beschreiben*)
C1:= coil.0;
C2:= coil.1;
C3:= coil.2;
C4:= coil.3;

Viel Spaß beim Einstig in die Schrittmotortechnik

Gruß Thomas
Weil Einfach einfach Einfach ist!