Добрый день!
Контроллер крутит ролик протяжки шаговым двигателем, скорость получает по modbus
Попутно считает шаги и выcчиляет длину протянутого кабеля, и отправляет его обратно в modbus
Проблема в том, что иногда, абсолютно в разное время контроллер присылает в качестве метров левое число,
например было 100 метров, а следом приходит какое-нибудь 25218.
Проблема точно не в канале передачи данных, контроллер уверенно шлет дальше кривое значение стабильно вращая роликом как ни в чем не бывало.
Помогите, как вычислить и устранить глюк?
Контроллер крутит ролик протяжки шаговым двигателем, скорость получает по modbus
Попутно считает шаги и выcчиляет длину протянутого кабеля, и отправляет его обратно в modbus
Проблема в том, что иногда, абсолютно в разное время контроллер присылает в качестве метров левое число,
например было 100 метров, а следом приходит какое-нибудь 25218.
Проблема точно не в канале передачи данных, контроллер уверенно шлет дальше кривое значение стабильно вращая роликом как ни в чем не бывало.
Помогите, как вычислить и устранить глюк?
C++:
#include <ModbusRtu.h>
#include <GyverTimers.h>
bool s=0;
int modbus_array[3] = {4000, 0, 0}; //Готовим массив данных скорость и метраж, третье значение не исп
int ledState = LOW;
long LEDTimer, Steps = 0;
int Meters = 0;
Modbus bus(2,1,4); // this is slave @2 and RS-232 or USB-FTDI
void setup() {
pinMode(StepperEnb, OUTPUT);
pinMode(StepperDir, OUTPUT);
pinMode(StepperPul, OUTPUT);
digitalWrite(StepperEnb, LOW);
digitalWrite(StepperDir, LOW);
bus.begin( 19200 ); // baud-rate at 19200
Timer2.setFrequency(4000); //частота таймера
Timer2.enableISR(CHANNEL_A); // Подключить прерывание таймера 2, канал A
Serial.begin(19200);
}
ISR(TIMER2_A) { //прерывание по таймеру 2А
s = not(s);
digitalWrite(StepperPul, s);
Steps++;
}
void loop() {
bus.poll(modbus_array,sizeof(modbus_array)/sizeof(modbus_array[0])); //Used to receive or write value from Master
Meters = Steps/6400*3.1415*0.0420;
modbus_array[1] = Meters;
if (modbus_array[0] == 0) {
Timer2.pause();
} else {
Timer2.setFrequency(modbus_array[0]); //обновляем скорость
}
if(millis() - LEDTimer > 500) {
Serial.println(Meters);
LEDTimer = millis();
ledState = !ledState;
digitalWrite(ledPin, ledState); //мигаем
}
}