Vor nicht allzu langer Zeit war ich besorgt über die Frage, wie ein Antrieb für CNC-Systeme auf einem Kollektormotor und sogar mit Rückmeldung hergestellt werden kann, und das würde auf Modbus RTU funktionieren.
Ich hatte Arduino UNO, Treiber für L298N, einen Kollektormotor von einem AEG-Autositzantrieb für 12 V, 2-Spalt-Fotounterbrecher zur Verfügung.
Von Anfang an habe ich einen Schal mit 2 Fotounterbrechern nach diesem Schema gelötet.

In fertiger Form sieht alles so aus:

Die Essenz dieser hässlichen Sache - ein Streichholz kreuzt den ersten Unterbrecher von Anfang an, dann den zweiten, sodass der Mikrocontroller versteht, in welche Richtung sich der Motor dreht.
Alle Verbindungen sehen folgendermaßen aus:
d2 ist der erste Fotounterbrecher;
d3 ist der zweite Fotounterbrecher;
d5 - PWM-Ausgang zur Drehung nach links;
d6 - PWM-Ausgang zur Drehung nach rechts;
Alles war miteinander verbunden und ich setzte mich, um Code zu schreiben. Am Ende meiner Qual brachte ich Folgendes hervor:
#include <ModbusRtu.h> #define ID 1 // , , TX Modbus slave(ID, 0, 0); int8_t state = 0; // uint16_t au16data[11];// modbus #include <PID_v1.h> // double Setpoint1, Input1, Output1; double Setpoint2, Input2, Output2; double Kp = 1, Ki = 2.5, Kd = 0.5; PID myPID1(&Input1, &Output1, &Setpoint1, Kp, Ki, Kd, DIRECT); //1- PID myPID2(&Input2, &Output2, &Setpoint2, Kp, Ki, Kd, REVERSE); //2- int LeftPWM = 5; // int RightPWM = 6; // volatile byte EncA, EncB = 0; // volatile int Position = 0; // int SetPosition = 0; // void setup() { slave.begin(9600); pinMode (LeftPWM, OUTPUT); pinMode (RightPWM, OUTPUT); attachInterrupt(0, ChangePosition1, FALLING); // 0-(pin2) ChangePosition1() attachInterrupt(1, ChangePosition2, FALLING); // 1-(pin3) ChangePosition2() Setpoint1 = 0; Setpoint2 = 0; digitalWrite (LeftPWM, LOW); digitalWrite (RightPWM, LOW); } // 0 void ChangePosition1() // ! { EncA = 1; if (EncA == 1 && EncB == 1) { EncA = 0; EncB = 0; Position++; } } // 1 void ChangePosition2() { EncB = 1; if (EncA == 1 && EncB == 1) { EncA = 0; EncB = 0; Position--; } } void loop() { // ModBus // state = slave.poll(au16data, 11); // au16data[2] = Position;// // SetPosition = au16data[3];// // au16data[8] = slave.getInCnt(); // au16data[9] = slave.getOutCnt(); // au16data[10] = slave.getErrCnt();// if (SetPosition == Position) // { myPID1.SetMode(MANUAL); myPID2.SetMode(MANUAL); Output1 = 0; Output2 = 0; digitalWrite (LeftPWM, LOW); digitalWrite (RightPWM, LOW); } if (SetPosition < Position) { myPID2.SetMode(AUTOMATIC); Setpoint2 = SetPosition; Input2 = Position; myPID2.Compute(); analogWrite (LeftPWM, Output2); digitalWrite (RightPWM, LOW); } if (SetPosition > Position) { myPID1.SetMode(AUTOMATIC); Setpoint1 = SetPosition; Input1 = Position; myPID1.Compute(); analogWrite (RightPWM, Output1); digitalWrite (LeftPWM, LOW); } }
Und jetzt ist es Teil für Teil auf dem Computer. SinplLight SCADA wurde von den Jungs ausgewählt, damit sich alles kostenlos bewegt. Also - so sehen die Einstellungen im Scud aus.



Die Schnittstelle wurde wie folgt erstellt:

Infolgedessen haben wir den Motor dem Schieberegler im Scud untergeordnet, beschleunigen und bremsen den Motor reibungslos. Wenn Sie den Motoranker manuell scrollen, lässt dies dies nicht zu und kehrt zurück. Vielen Dank für Ihre Aufmerksamkeit. Und hier ist eine allgemeine Ansicht des Chaos.
