ما الذي يكلفنا بنا بناء محرك CNC

منذ وقت ليس ببعيد ، كنت قلقًا بشأن مسألة كيفية إجراء محرك لأنظمة CNC على محرك تجميع ، وحتى مع التعليقات ، وهذا من شأنه أن يعمل على Modbus RTU.

كان لدي تحت تصرفي ، Arduino UNO ، سائق لـ L298N ، وهو محرك تجميع من محرك مقعد سيارة AEG لمحرك صور بجهد 12 فولت ذو فجوتين.

منذ البداية ، قمت بلحام وشاح به قاطعتان للصور ، وفقًا لهذا المخطط.



في الشكل النهائي ، يبدو كل هذا كما يلي:

الصورة

جوهر هذا الشيء القبيح - تتقاطع المباراة مع الكسارة الأولى من البداية ، ثم الثانية ، بحيث يفهم المتحكم الدقيق في أي اتجاه يدور المحرك.

تبدو جميع الاتصالات كما يلي:

d2 هي أول قاطع للصور ؛
d3 هي قاطع الصور الثاني ؛
d5 - خرج PWM للتدوير إلى اليسار ؛
d6 - خرج PWM للتدوير إلى اليمين ؛

كان كل شيء مرتبطًا وجلست لكتابة الرمز ، في نهاية عذابي ولدت ما يلي:

#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); } } 

والآن أصبح جزءًا منه جزءًا على الكمبيوتر. تم اختيار SinplLight SCADA من قبل الرجال لجعل كل شيء يتحرك مجانًا. لذلك - هذه هي الطريقة التي تبدو بها الإعدادات في سكود.

الصورة

الصورة

الصورة

تم إنشاء الواجهة على النحو التالي:

الصورة

ونتيجة لذلك ، حصلنا على المحرك تابعًا لشريط التمرير في سكود ، وسرع المحرك وفرامله بسلاسة ، إذا قمت بتمرير مرساة المحرك يدويًا ، فلن يسمح بذلك ، ويعود. شكرا لكم على اهتمامكم. وهنا نظرة عامة على الفوضى.

الصورة

Source: https://habr.com/ru/post/ar410931/


All Articles