Страница 1 из 1

Универсальный термометр/термостат

Добавлено: Ср мар 30, 2011 8:55 am
TechMike
Управление охлаждением(кулером) ПК или БП.
Задаются минимальная температура при которой вентилятор работает на минимальных оборотах, и максимальная температура, когда вентилятор работает на максимуме оборотов. Между этими пределами обороты вентилятора меняются линейно или как позволяет линейность ШИМ.
При запуске устройства вентилятор включается на максимум и при этом измеряем максимальные обороты вентилятора.
Управление вентиляторов осуществляется с помощью ШИМ, задание пределов и режима работы управления через RS232, путем ввода "AT" команд. Измерение частоты оборотов вентилятора по прерыванию от датчика вентилятора или только скважность ШИМа.
датчиком температуры служит DS18B20 или на крайняк термопара.

Управление холодильником.
Задается температура, при которой включается реле, которое управляет компрессором холодильника, и дельта температуры, при достижения которой реле выключается. Т.е. по сути термостат.

Re: Универсальный термометр/термостат

Добавлено: Ср сен 12, 2012 4:18 pm
TechMike
http://kazus.ru/forums/showthread.php?t ... id_control

Код: Выделить всё

signed int pid_control(signed char setpoint, signed char currentpoint) 
{ 
static signed int last_error; 
signed int P; 
signed int D; 
static signed int I; 
signed int PID; 
P = (setpoint - currentpoint); 
I = (I + (setpoint - currentpoint) * INTERVAL); 
D = (((setpoint - currentpoint) - last_error) / INTERVAL); 
last_error = setpoint - currentpoint; 
PID = (Kp * P) + (Ki * I) + (Kd * D); 
return (PID); 
} 
Где Kp, Кi, Kd - коэффициенты которые нужно подбирать под конкретную задачу или приблизительно вычислять. Не помню ссылку..но видел сайт с теорие по АСУ - там были все формулы и пояснения.
setpoint это сколько нужно выдать, а currentpoint текущее значение/
для измерения температуры, должно быть:
setpoint - сколько должно быть температуры
currentpoint - текущая температура/
PID вернет условную величину воздействия. ты сам должен по этому воздействию что-то сделать. как правило, если ты регулируешь температуру, то либо наревателем управляешь, либо холодильником, соответственно либо отрицательное значение функции не имеет смысла, либо положительное - просто заменяешь на 0. ну а делее - по обстоятельствам.

http://pidcontrol.narod.ru/
http://www.radiokot.ru/forum/viewtopic.php?f=20&t=43790

Код: Выделить всё

#define MAX      100
#define MIN      30 
#define INTERVAL  100 //количество тиков таймера при которых измеряется температура в currentpoint, можно сделать =1 для ускорения расчетов
signed int Kp=2,Ki=1,Kd=0; // для примера
static signed int last_error;
#define setpoint 40 // говорим что комфортная температура 40 градусов

signed int pid_control(signed char setpoint, signed char currentpoint)
{
signed int P;
signed int D;
static signed int I;
signed int PID;
P = (setpoint - currentpoint);
I = (I + (setpoint - currentpoint) * INTERVAL);
D = (((setpoint - currentpoint) - last_error) / INTERVAL);
last_error = setpoint - currentpoint;
PID = (Kp * P) + (Ki * I) + (Kd * D);

if(PID>MAX) PID=MAX;
else if(PID<MIN) PID=MIN;

return (PID);
}