不久前,我担心如何在采集器电机上驱动CNC系统的驱动器,甚至在有反馈的情况下,该问题也适用于Modbus RTU。
我可以使用Arduino UNO,用于L298N的驱动器,来自AEG汽车座椅驱动器的集线器电机(用于12V),带槽的光电断路器2个。
从一开始,我就按照这个方案将一条围巾和2个光电断路器连接在一起。

最终形式如下:

这件丑陋事情的本质是:一根火柴从头穿过第一个断路器,然后从第二个穿过,因此微控制器可以理解电动机的旋转方向。
所有连接看起来像这样:
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,以使其全部免费移动。 所以-这就是飞毛腿设置的外观。



界面如下所示:

结果,我们将引擎从属于飞毛腿中的滑块,平稳地加速和制动了引擎,如果您手动滚动电动机锚,则不允许这样做,然后返回。 谢谢您的关注。 这是混乱的总体视图。
