Библиотека PID_v1: изменение установленной температуры в процессе работы.

wenom86
Offline
Зарегистрирован: 04.11.2012

Здравствуйте. Имеется проблема с процедурой пид-регулирования. Вот есть код из библиотеки:

#include <PID_v1.h>

#define PIN_INPUT 0
#define PIN_OUTPUT 3

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Define the aggressive and conservative Tuning Parameters
double aggKp=4, aggKi=0.2, aggKd=1;
double consKp=1, consKi=0.05, consKd=0.25;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  Input = analogRead(PIN_INPUT);
  Setpoint = 100;

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Input = analogRead(PIN_INPUT);

  double gap = abs(Setpoint-Input); //distance away from setpoint
  if (gap < 10)
  {  //we're close to setpoint, use conservative tuning parameters
    myPID.SetTunings(consKp, consKi, consKd);
  }
  else
  {
     //we're far from setpoint, use aggressive tuning parameters
     myPID.SetTunings(aggKp, aggKi, aggKd);
  }

  myPID.Compute();
  analogWrite(PIN_OUTPUT, Output);
}
 
Он работает без нареканий. Затем я сделал, чтобы информация о требуемой температуре Setpoint получалась из некоей переменной "M", в которой стоит значение, допустим 40. Все работает и  так. Но, допустим, мне потребовалось поменять в процессе работы программы значение переменной с 40 на 50. Само значение меняется, здесь все четко, а процедура пид-регулирования, как я понимаю. уже получила иначение 40, и на установку новой температуры не реагирует. Каким образом можно сообщить ей эту новую температуру, под которую она должна подстраиваться? Может как-то останавливать-запускать что-то.?
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Можно сделать просто, но плохо:

Залезьте в .h файл библиотеки и после строки со словом public: (у меня это 8-ая строка) встаьте строку

 void ChangeSetPoint(const double *Setpoint) { mySetpoint = Setpoint; }

После этого, если надо поменять температуру, просто пишите

myPID.ChangeSetPoint(<новая температура>);

Но это плохо, т.к. она уже накопила интеграл. Лучше переинициализировать myPID полностью.

wenom86
Offline
Зарегистрирован: 04.11.2012

ок. я сделал через сохранение переменной в еепром. Правда приходится перезагрузить ардуину после этого, но мне это не критично. Заодно скажите пожалуйста, пожно-ли оспользовать сразу 2-3 пида в одной программе? Позволяет-ли это ардуина мега 2560?

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

Да, пожалуйста. В самой библиотеке нкаких ограничений нет. Ресурсов она занимает немного. Ради Бога.

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

Ой, простите, что-то я только сейчас заметил. Вы же указатель передаёте на Setpoint. Значит она и так (без всяких добавлений) должна нормально меняться. Просто той же переменной Setpoint, что у Вас была, присваивайте новое значение и всё. Не надо добавлять функцию, как я Вам советовал (но это не отменяет замечания, про уже набранную статистику)

maxvalin
Offline
Зарегистрирован: 22.02.2016

Евгений, данной библиотекой можно контролировать например не температуру а ток в контуре(0- 10А). Допустим снимаю показания тока при помощи acs718 и тут же подкручиваю IRL. Гистерезис в 100-150 мА не критичен . К примеру в цепи ЗУ для аккумуляторов.
Или есть болие гуманный способ? Что-то не могу найти подобного решения((