AutoPID библиотека

Vasilisk
Offline
Зарегистрирован: 22.09.2017

Поставил библиотеку https://github.com/r-downing/AutoPID . При температуре 50 градусов, работает нормально, +/- 1 градус. (я так понимаю, что при использовании max6675, лучших результатов не добиться) . Но при 195 градусах, температура поднялась до 230. Если поставить верхний придел 199, то поднимается до 202 и после, при нижнем пределе 191, опускается до 190. И так на протяжении часа. Прошу помочь разобраться.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ошибка в строке №43.

nik182
Offline
Зарегистрирован: 04.05.2015
Vasilisk
Offline
Зарегистрирован: 22.09.2017

Уровень у меня не тот, что бы такие намеки понимать. Вы имеете ввиду, что ошибка в библиотеке? Можно конкретнее, а лучше с исправлением.

sadman41
Offline
Зарегистрирован: 19.10.2016

А еще лучше - приехать на дом и всё запустить, как возжелает заказчик?

b707
Offline
Зарегистрирован: 26.05.2017

Vasilisk пишет:

Уровень у меня не тот, что бы такие намеки понимать. Вы имеете ввиду, что ошибка в библиотеке? Можно конкретнее, а лучше с исправлением.

это намек на то, что вашего кода никто не видел. Выкладывайте

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Vasilisk пишет:

Уровень у меня не тот, что бы такие намеки понимать. 

У Вас не тот уровень, чтобы понять, что не видя программы ничего сказать нельзя?

b707 пишет:
а лучше с исправлением.
Исправлением чего?

Кстати, встречная просьба: вот тут у меня машина как-то не так гудит, завожу, вроде ничего, а потом звук какой-то не тот. Можете помочь её починить?

Vasilisk
Offline
Зарегистрирован: 22.09.2017

Хм. Но там столько говнокода... Я его еще не чистил. Чисто что бы заработало, а потом уже нормально переписать.

#include <AutoPID.h>


#include <AccelStepper.h>
#include <max6675.h>
#include <Nextion.h>

Nextion myNextion(Serial1, 115200);
MAX6675 thermocouple(30, 32, 31);

// Двигатель каретки
AccelStepper Stepper1(1,25,24);

// Двигатель экструзии
AccelStepper Stepper2(1,22,23);

// Двигатель протяжки
AccelStepper Stepper3(1,27,26);

// Двигатель намотки
AccelStepper Stepper4(1,51,50);


int debugMessage = 0;

int pot = A0;
int on = 0;
int onn = 0;
int ont = 0;
int onb = 0;
int onp = 0;
int hol1 = 0;
int hol2 = 0;
double dMin = 1.46;
double dMax = 1.48;
int progress = 0;
int stepperKatFlag = 0;
int namotka = 0;
int calibration_1 = 0;
int calibration_2 = 0;
const int buttonPin = 33;
const int rele = 40;
long interval = 20;
long intervalmax6675 = 500;
long previousMillis = 500; ///////////////////////////////////////////////////////////Разобраться с интервалами!
long previousMillis2 = 500;
unsigned long currentMillis = 0;

int f = 0;
int calibrationR = 2600; // Расстояние калибровки
long shagN = 6400; // Оборот катушки
long StepperTime = 0; // Счетчик шагов катушки
int KatR = 1; // Счетчик оборотов катушки
int shag = 350; // Количество шагов каретки на толщину нити
int full = 26; // Количество диаметров нити на полную катушку
int shagKol = 31; // Количество диаметров нити на ширину катушки - шагов каретки
double tempn = 0;
double temp = 195;
double output = 0;
int spe = 300;
int spen = 0;
int spep = 80;
int page = 0;
int stepperKat = 0;

int FlagN = 0;
int shagK = 0;

int dir = -1;
int dir2 = 1;

#define OUTPUT_MIN 0
#define OUTPUT_MAX 255
#define KP .12
#define KI .0003
#define KD .0

AutoPID myPID(&tempn, &temp, &output, OUTPUT_MIN, OUTPUT_MAX, KP, KI, KD);

void setup() {
  pinMode(2, OUTPUT);
  myPID.setBangBang(4);

  
  noInterrupts (); // отключить все прерывания
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  OCR1A = 125; // сравнить регистр 16 МГц / 256/500 Гц (2ms=125)
  TCCR1B |= (1 << WGM12); // Режим СТС
  TCCR1B |= (1 << CS12); // 256 делитель
  TIMSK1 |= (1 << OCIE1A ); // включить таймер сравнить прерываний
  interrupts(); // включить все прерывания

  Serial.begin(9600);
  Serial1.begin(9600);
  myNextion.init();
  myNextion.sendCommand("baud=115200");
  Serial1.end(); // закрытие порта
  Serial1.begin(115200); // открытие порта на новой скорости
  myNextion.sendCommand("baud=115200");

  pinMode(pot, INPUT);
  pinMode(buttonPin, INPUT);
  pinMode(rele, OUTPUT);
  Stepper1.setMaxSpeed (2000);
  Stepper1.setAcceleration(2000);
  Stepper2.setMaxSpeed(2000);
  Stepper3.setMaxSpeed(2000);  
  Stepper4.setMaxSpeed(2000);
  Stepper4.setAcceleration(2000);
}

ISR (TIMER1_COMPA_vect) // Функция прерывания таймера
{
  if(digitalRead(buttonPin)==1){
    calibration_1 = 1;
  }
  
  Stepper1.run();
  
  if (onb == 1){
    Stepper2.runSpeed();
  }
  
  if (onp == 1){
    Stepper3.runSpeed();
  }
  Stepper4.move(1);
  Stepper4.setSpeed(spen);

  if (onn == 1 && spen > 0){
    Stepper4.run();
  }

}

void loop() {

hol1 = analogRead(3);
hol2 = analogRead(4);

double d = (hol1 - hol2 - (564 - 607)) * (dMin / (675 - 531 - (564 - 607))) + dMax;


  
// Калибровка каретки направляющей нити намотки
  if  (calibration_1 == 0 && on == 1){
    Stepper1.move(100*dir);
  }
  if  (calibration_1 == 1 && calibration_2 == 0){
    calibration_2 = 1;
    dir=1;
    Stepper1.move(calibrationR*dir);
  }


// Намотка нити
  if(Stepper4.targetPosition()>=StepperTime+shagN){
      StepperTime = StepperTime+shagN;
      KatR++;
      // Работа каретки направляющий нити намотки
      Stepper1.move(shag*dir2);
      shagK++;
      if (shagK >= shagKol){
        Stepper1.move(shag*dir2*2);
        shagK = 0;
        dir2 = dir2*-1;
      } 
    }
  

  // Установка скорости экструзии
  Stepper2.setSpeed(spe);


  // Установка скорости протяжки
  Stepper3.setSpeed(spep);


  // Управление скоростью намотки
  if (analogRead(pot)>850){
    spen = (173-(1023-analogRead(pot)))*3.46;
  }
  else{
    spen = 0;
  }


  // Управление температурой


  myPID.run();
  analogWrite(2, output);
  


  // Прогресс намотки
  progress = round(Stepper4.targetPosition()/(full*shagN)*100);

  // Окончание работы станка
  if(Stepper4.targetPosition() >= full*shagN){
    on = 0;
    onn = 0;
    ont = 0;
    onb = 0;
    onp = 0;
    
  }

  // Работа с экраном

  String message = myNextion.listen(); //check for message
  // Запуск станка
  if(message == "65 0 2 1 ffff ffff ffff"){ // if a message is received...
    on = 1;
    ont = 1;
    page = 1;
  }
  // Настройки температуры и скорости экструзии
  else if(message == "65 1 4 1 ffff ffff ffff"){ // if a message is received...
    page = 2;
  }
  // Выход из настроек температуры и скорости экструзии
  else if(message == "65 2 6 1 ffff ffff ffff"){ // if a message is received...
    page = 1;
  }
    // Кнопка назад, из настроек скорости протяжки
  else if(message == "65 3 6 1 ffff ffff ffff"){ // if a message is received...
    page = 1;
  }
      // Кнопка назад, из прогресса
  else if(message == "65 4 4 1 ffff ffff ffff"){ // if a message is received...
    page = 3;
  }
  // Запуск экструзии
  else if(message == "65 1 3 1 ffff ffff ffff" && calibration_2 == 1 && tempn>=temp){ // if a message is received...
    onb=1;
  }
  // Температура +1
  else if(message == "65 2 2 1 ffff ffff ffff"){ // if a message is received...
    temp = temp - 1;
  }
  // Температура -1
  else if(message == "65 2 4 1 ffff ffff ffff"){ // if a message is received...
    temp = temp + 1;
  }
  // Скорость экструзии +
  else if(message == "65 2 3 1 ffff ffff ffff"){ // if a message is received...
    spe = spe - 50;
  }
  // Скорость экструзии -
  else if(message == "65 2 5 1 ffff ffff ffff"){ // if a message is received...
    spe = spe + 50;
  }
  // Настройка скорости прокатки
  else if(message == "65 1 5 1 ffff ffff ffff"){ // if a message is received...
    page = 3;
    onp = 1;
  }
  // Скорость прокатки + 1
  else if(message == "65 3 3 1 ffff ffff ffff"){ // if a message is received...
    spep = spep + 1;
  }
  // Скорость прокатки - 1
  else if(message == "65 3 2 1 ffff ffff ffff"){ // if a message is received...
    spep = spep - 1;
  }
  // Страница прогресса
  else if(message == "65 3 4 1 ffff ffff ffff"){ // if a message is received...
    onn = 1;
    page = 4;
  }
  else if(message == "65 4 2 1 ffff ffff ffff"){
    
  }
  //
  //
  if(message != "" && debugMessage == 1){ // if a message is received...
    Serial.println(message); //...print it out
  }

  
  currentMillis = millis();
 
  if (currentMillis - previousMillis2 > intervalmax6675){ 
    previousMillis2 = currentMillis; 
    tempn = thermocouple.readCelsius();
          //Serial.println(Stepper4.targetPosition());
          //Serial.println(hol1);
          //Serial.println(hol2);
          Serial.println(tempn);
  }
      
    
  if(currentMillis - previousMillis > interval) {
    if (debugMessage == 1){
      Serial.println(page); 
    }
    previousMillis = currentMillis;
    if (FlagN == 0){
      if (page == 1){
        myNextion.setComponentText("t0", String(tempn));
        Serial.println(tempn); //...print it out
      }
    FlagN = 1;
    }
    else if (FlagN == 1){
      if (page == 2){
        myNextion.setComponentText("t1", String(temp));
      }
    FlagN = 2;
    }
    else if (FlagN == 2){
      if (page == 2){
        myNextion.setComponentText("t2", String(spe));
      }
    FlagN = 3;
    }
    else if (FlagN == 3){
      if (page == 3){
        myNextion.setComponentText("t3", String(spep));
      }
    FlagN = 4;
    }
    else if (FlagN == 4){
      if (page == 4){
        myNextion.setComponentText("t4", String(progress));
      }
    FlagN = 5;
    }
    else if (FlagN == 5){
      if (page == 3){
        myNextion.setComponentText("t0", String(d));
      }
    FlagN = 0;
    }
  }
}

 

Vasilisk
Offline
Зарегистрирован: 22.09.2017

сайт баганул

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

Кстати, встречная просьба: вот тут у меня машина как-то не так гудит, завожу, вроде ничего, а потом звук какой-то не тот. Можете помочь её починить?

Только без болтовни, а конкретно, с исправлениями!

kalapanga
Онлайн
Зарегистрирован: 23.10.2016

Вот у Вас не работает конкретно регулировка температуры. Выкинте из Вашего скетча всё, что не относится к температуре. Или возьмите пример от библиотеки AutoPID про регулировку температуры. И на нём проверяйте работу - будет регулировать или нет? Для регулятора коэффициенты подбирать вобще-то нужно. В сообщении #2 пример на эту тему был.

b707
Offline
Зарегистрирован: 26.05.2017

Vasilisk, советую вам написать коротенький код, который только регулирует температуры. И на нем добиться. чтобы библиотека PID работала как надо. Когда получится - вставите кусок в основной скетч.

Вообще, таким принципом модульной отладки нужно пользоваться всегда, когда вы сочиняете что-то сложнее блинк.

 

PS - Stepper внутри прерывания - это сильно. Неужели работает? :)

Vasilisk
Offline
Зарегистрирован: 22.09.2017

Дело говорите. Так и попробую, когда дома буду. По поводу подборки коэффициентов, эта библиотека должна сама их подбирать. В этом и суть. Есть еще другая с автоподборкой, но в ней я не разобрался. 

П.С. Stepper работает. Но переписывать надо. Дело в том, что они друг другу мешают и каша получается, и скорости не хватает. Потом буду разбираться и на потоки разбивать, мне сейчас главное, что бы все заработало.

kalapanga
Онлайн
Зарегистрирован: 23.10.2016

Vasilisk пишет:

По поводу подборки коэффициентов, эта библиотека должна сама их подбирать. В этом и суть.

Что, правда? Может я туплю, но нигде этого не вижу. Ни в описании, ни в коде. Что задали в конструкторе, то и используется.

nik182
Offline
Зарегистрирован: 04.05.2015

В этой библиотеке нет метода подбора коэффициентов. Так что слово авто в названии просто приманка для лохов. Оно подразумевает автоматическое применение результатов расчёта регулятора без дополнительной обработки, а не подбор коэффициентов.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Вот мой ПИД, но в нем тоже коэффициенты подгонять надо.

Сначала П увеличивать понемногу, пока ошибка регулирования не станет минимальной, затем И потихоньку.

Vasilisk
Offline
Зарегистрирован: 22.09.2017

Я так понял, что при изменении температуры на 100 градусов, коэффициенты придется менять. Пока настроил по этой методике, вручную: https://docplayer.ru/78150696-Metodika-nastroyki-cifrovogo-pid-regulyatora.html Позже что-то свое для автонастройки напишу.

Спасибо всем, кто откликнулся!