Belum lama ini, saya khawatir tentang pertanyaan tentang bagaimana membuat drive untuk sistem CNC pada motor kolektor, dan bahkan dengan umpan balik, dan itu akan bekerja pada Modbus RTU.
Yang saya miliki, Arduino UNO, Driver untuk L298N, motor pengumpul dari drive kursi mobil AEG untuk interrupter foto 2-celah 12V.
Sejak awal, saya menyolder syal dengan 2 pengganggu foto, sesuai dengan skema ini.

Dalam bentuk selesai, semuanya terlihat seperti ini:

Inti dari hal yang jelek ini - sebuah pertandingan melintasi pemutus pertama dari awal, kemudian yang kedua, sehingga mikrokontroler memahami ke arah mana motor berputar.
Semua koneksi terlihat seperti ini:
d2 adalah pengganggu foto pertama;
d3 adalah pengganggu foto kedua;
d5 - output PWM untuk rotasi ke kiri;
d6 - output PWM untuk rotasi ke kanan;
Semuanya terhubung dan saya duduk untuk menulis kode, pada akhirnya siksaan saya melahirkan yang berikut:
#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); } }
Dan sekarang bagian demi bagian di komputer. SinplLight SCADA dipilih oleh orang-orang untuk membuat semuanya bergerak gratis. Jadi - ini adalah bagaimana pengaturan dalam tampilan scud.



Antarmuka dibuat seperti ini:

Alhasil, kami mendapatkan mesin di bawah penggeser slider, mempercepat dan mengerem mesin dengan lancar, jika Anda secara manual menggulir jangkar motor, itu tidak memungkinkan, dan kembali. Terima kasih atas perhatian anda Dan inilah pandangan umum tentang kekacauan itu.
