AutoPID библиотека
- Войдите на сайт для отправки комментариев
Пт, 07/12/2018 - 07:29
Поставил библиотеку https://github.com/r-downing/AutoPID . При температуре 50 градусов, работает нормально, +/- 1 градус. (я так понимаю, что при использовании max6675, лучших результатов не добиться) . Но при 195 градусах, температура поднялась до 230. Если поставить верхний придел 199, то поднимается до 202 и после, при нижнем пределе 191, опускается до 190. И так на протяжении часа. Прошу помочь разобраться.
Ошибка в строке №43.
http://www.termodat.ru/pdf/pid.pdf
Уровень у меня не тот, что бы такие намеки понимать. Вы имеете ввиду, что ошибка в библиотеке? Можно конкретнее, а лучше с исправлением.
А еще лучше - приехать на дом и всё запустить, как возжелает заказчик?
Уровень у меня не тот, что бы такие намеки понимать. Вы имеете ввиду, что ошибка в библиотеке? Можно конкретнее, а лучше с исправлением.
это намек на то, что вашего кода никто не видел. Выкладывайте
Уровень у меня не тот, что бы такие намеки понимать.
У Вас не тот уровень, чтобы понять, что не видя программы ничего сказать нельзя?
Кстати, встречная просьба: вот тут у меня машина как-то не так гудит, завожу, вроде ничего, а потом звук какой-то не тот. Можете помочь её починить?
Хм. Но там столько говнокода... Я его еще не чистил. Чисто что бы заработало, а потом уже нормально переписать.
#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; } } }сайт баганул
Кстати, встречная просьба: вот тут у меня машина как-то не так гудит, завожу, вроде ничего, а потом звук какой-то не тот. Можете помочь её починить?
Только без болтовни, а конкретно, с исправлениями!
Вот у Вас не работает конкретно регулировка температуры. Выкинте из Вашего скетча всё, что не относится к температуре. Или возьмите пример от библиотеки AutoPID про регулировку температуры. И на нём проверяйте работу - будет регулировать или нет? Для регулятора коэффициенты подбирать вобще-то нужно. В сообщении #2 пример на эту тему был.
Vasilisk, советую вам написать коротенький код, который только регулирует температуры. И на нем добиться. чтобы библиотека PID работала как надо. Когда получится - вставите кусок в основной скетч.
Вообще, таким принципом модульной отладки нужно пользоваться всегда, когда вы сочиняете что-то сложнее блинк.
PS - Stepper внутри прерывания - это сильно. Неужели работает? :)
Дело говорите. Так и попробую, когда дома буду. По поводу подборки коэффициентов, эта библиотека должна сама их подбирать. В этом и суть. Есть еще другая с автоподборкой, но в ней я не разобрался.
П.С. Stepper работает. Но переписывать надо. Дело в том, что они друг другу мешают и каша получается, и скорости не хватает. Потом буду разбираться и на потоки разбивать, мне сейчас главное, что бы все заработало.
По поводу подборки коэффициентов, эта библиотека должна сама их подбирать. В этом и суть.
Что, правда? Может я туплю, но нигде этого не вижу. Ни в описании, ни в коде. Что задали в конструкторе, то и используется.
В этой библиотеке нет метода подбора коэффициентов. Так что слово авто в названии просто приманка для лохов. Оно подразумевает автоматическое применение результатов расчёта регулятора без дополнительной обработки, а не подбор коэффициентов.
Вот мой ПИД, но в нем тоже коэффициенты подгонять надо.
Сначала П увеличивать понемногу, пока ошибка регулирования не станет минимальной, затем И потихоньку.
Я так понял, что при изменении температуры на 100 градусов, коэффициенты придется менять. Пока настроил по этой методике, вручную: https://docplayer.ru/78150696-Metodika-nastroyki-cifrovogo-pid-regulyatora.html Позже что-то свое для автонастройки напишу.
Спасибо всем, кто откликнулся!