Чт июн 17, 2021 20:38:14
альбуцид писал(а): с шимом только та проблема что 100% заполнения не получится
Чт июн 17, 2021 20:45:10
Чт июн 17, 2021 20:47:21
Чт июн 17, 2021 21:00:13
Чт июн 17, 2021 21:14:38
Чт июн 17, 2021 22:13:47
Пт июн 18, 2021 20:02:51
Пт июн 18, 2021 21:35:11
Пт июн 18, 2021 22:39:05
Сб июн 19, 2021 00:46:50
Вт июн 29, 2021 08:51:02
Пт июл 09, 2021 17:07:22
Вт июл 13, 2021 16:43:40
Вт июл 13, 2021 17:18:44
Вт июл 13, 2021 19:01:02
Вт июл 13, 2021 19:31:27
у меня там один 8 битный на все... не дрожит
Вт июл 13, 2021 19:41:07
Вт июл 13, 2021 19:58:53
Сб авг 07, 2021 08:56:37
Вт авг 10, 2021 09:40:14
да и "хитрое" регулирование там написано кривоzinc писал(а):из бесполезных фич - отсутствие ПИД регулятора
//точность единицы градусов
u8 t_stab_proc(const s16 T_def, const s16 T)
{
static u8 pow; //мощность, 100% max
static bool tup_trg = true; //триггер включения бустерного нагрева
s16 T_err; //разница между заданной и имеющейся температурами, положительна если заданная выше имеющейся
s16 dT; //изменение температуры с прошлого обращения к функции, положительно если T выросла
static s16 T_prev; //предыдущая температура
static s16 dT_prev; //изменение температуры во время прошлого обращения к функции
//стабилизация температуры нагревателя
{
dT = T - T_prev; //положительное значение если t выросла
T_err = T_def - T; //отрицательное значение если t выше заданной и положительное если ниже
//бустерный нагрев отключается если температура превысила заданную на достаточную величину
if (tup_trg) {
if (T_err < -50) tup_trg = 0;
else pow = 100;
} else {
u8 tmp;
//температура нагревателя выше заданной
if (T_err < -5) {
//скорость падения температуры нагревателя не дотягивает до четвертой части имеющейся разницы
if (dT > T_err >> 2) {
tmp = pow >> 2;
if (tmp) pow -= tmp;
else if (pow) pow--;
}
//скорость падения температуры нагревателя за время между измерениями превышает четверть разницы
else if (dT < T_err >> 2) {
tmp = (100 - pow) >> 3;
if (tmp) pow += tmp;
else pow++;
}
}
//температура слишком мала, включаем бустерный нагрев
else if (T_err > 50) tup_trg = 1;
//температура нагревателя ниже заданной
else if (T_err > 5) {
//скорость набора температуры нагревателем недостаточна
if (dT < T_err >> 2) {
tmp = (100 - pow) >> 2;
if (tmp) pow += tmp;
else pow++;
}
//скорость набора температуры нагревателем избыточна
else if (dT > T_err >> 2) {
tmp = pow >> 3;
if (tmp) pow -= tmp;
else if (pow) pow--;
}
}
//температура вблизи заданной
else {
//температура выше заданной
if (T_err < 0) {
//и растёт
if (dT > 0)
if (pow) pow--;
}
//температура ниже заданной
else if (T_err > 0) {
//и не растёт
if (dT <= 0) pow++;
}
}
}
}
dT_prev = dT;
T_prev = T;
if (pow > 100) pow = 100;
return pow;
}
if (T_err < -5) {
//скорость падения температуры нагревателя не дотягивает до четвертой части имеющейся разницы
if (dT > T_err >> 2) {
tmp = pow >> 2;
if (tmp) pow -= tmp;
else if (pow) pow--;
}
//скорость падения температуры нагревателя за время между измерениями превышает четверть разницы
else if (dT < T_err >> 2) {
tmp = (100 - pow) >> 3;
if (tmp) pow += tmp;
else pow++;
}
}