GyverPID.h код для управления охлаждением при помощи шагового двигателя

bonez

✩✩✩✩✩✩✩
10 Апр 2024
1
0
Оформи код соответствующим тэгом, см. Правила
Добрый день.
необходимо сделать ПИД управление температурой при помощи шагового двигателя.
Имеем целевую температуру и замеряемую датчиком t.
Как написать код чтобы ПИД регулятор Гайвера выдавал абсолютное значение поворота Шагового двигателя (ШД) . если принять что при старте алгоритма ШД находится в нулевом положении (считаем что клапан закрыт).
Соотв логика работы: диапазон ПИДа 0-200 - это количество шагов от 0 (когда клапан закрыт) и 200 шагов мотора при котором клапан полностью открыт. ПИД на основании замеренной темп. выдает цыфру от 0- до 200. И ШД на нее повернется открывая клапан. по мере достижения целевой темп . ПИД начнет возвращаться к нулю - закрывая клапан.
Соотв. когда темп замеренная упадет ниже целевой . Пид Начинает себя неадекватно вести. Надо ставить условие если темп ниже целевой. просто не поворачивать клапан по условию? Жирным выделил это условие

Заранее спасибо.
Вот код:
#include <OneWire.h>
#include <DallasTemperature.h> // подключаем библиотеку датчиков Т
#include <Wire.h>
#define ONE_WIRE_BUS 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
uint8_t tsensor1[8] = { 0x28, 0x98, 0xCE, 0x43, 0xD4, 0x5E, 0x44, 0xED };
float twater = 30; // переменная для значения целевой темп
float twaterreal = 0; // переменная для реальной температуры
int pidresult = 0; // переменная для значения результата ПИД
unsigned long timing_t;
#include "GyverPID.h"
GyverPID regulator(0.1, 0.05, 0.01, 100); // коэф. П, коэф. И, коэф. Д, период дискретизации dt (мс)
void setup() {
regulator.setDirection(NORMAL); // направление регулирования (NORMAL/REVERSE). ПО УМОЛЧАНИЮ СТОИТ NORMAL
regulator.setLimits(0, 200); // пределы 0 - клапан закрыт (шаговик стоит на закрытом клапане) - 200 кол-во шагов на оборот - ШД полностью открыт
regulator.setpoint = 38; // сообщаем регулятору температуру, которую он должен поддерживать
// Запуск библиотеки датчиков
sensors.begin();
Serial.begin(9600);
}
void loop() {
checksensors(); // читаем температуры датчиков по mills
regulator.input = twaterreal; // сообщаем регулятору текущую температуру
pidresult = regulator.getResultTimer();
pidresult = round(pidresult);
if (twaterreal <= twater) {
pidresult = 0;
}


Serial.println(pidresult);
}
void checksensors() {
if (millis() - timing_t > 2000) {
timing_t = millis();
sensors.requestTemperatures();
twaterreal = sensors.getTempC(tsensor1);
}
}