
- •Введение
- •Характеристика объекта управления
- •Электронные элементы горелки:
- •Структурная схема печатной платы
- •Принципиальная схема печатной платы
- •Сущность теории нечетких множеств
- •Нечеткие множества
- •Типы функций принадлежности нечетких множеств
- •Фаззификация
- •Динамические нечеткие регуляторы
- •Практическая часть
- •База правил
Практическая часть
Разработка кода:
Основной код алгоритма работы, реализующий нечеткий ПИД - регулятор
//фазификация входных параметров
uint8_t SZ_T = triangular_uF(eps, -8, -8, 0);
uint8_t ZR_T = triangular_uF(eps, -4, 0, 4);
uint8_t LO_T = triangular_uF(eps, 0, 2 << 4, 5 << 4);
uint8_t MI_T = triangular_uF(eps, 2 << 4, 5 << 4, 8 << 4);
uint8_t HI_T = triangular_uF(eps, 5 << 4, 8 << 4, 8 << 4);
//sprintf((char *) status_string, "%02d %02d %02d %02d %02d", SZ_T, ZR_T, LO_T, MI_T, HI_T);
//sprintf((char *) status_string,"%02d.%04d %01d.%04d", (eps >> 4), (eps & 0x0F) * 625, LO_T >> 6, (LO_T & 0x3F) * 152);
//sprintf((char *) status_string,"%02d.%04d %d", (eps >> 4), (eps & 0x0F) * 625, LO_T);
uint8_t SZ_DT = triangular_uF(df_eps, -5, -5, 0);
uint8_t ZR_DT = triangular_uF(df_eps, -2, 0, 2);
uint8_t MI_DT = triangular_uF(df_eps, 0, 1 << 4, 2 << 4);
uint8_t HI_DT = triangular_uF(df_eps, 1 << 4, 2 << 4, 2 << 4);
//sprintf((char *) status_string, "%02d %02d %02d %02d", SZ_DT, ZR_DT, MI_DT, HI_DT);
//sprintf((char *) status_string,"%02d.%04d %01d.%04d", (df_eps >> 4), (df_eps & 0x0F) * 625, MI_DT >> 6, (MI_DT & 0x3F) * 152);
//sprintf((char *) status_string,"%02d.%04d %d", (df_eps >> 4), (df_eps & 0x0F) * 625, MI_DT);
//sprintf((char *) status_string,"%d", df_eps);
//нечеткий вывод
uint8_t MX = 0, VHI = 0, HI = 0, MID = 0, LOW = 0, MI = 0;
//база правил
if (HI_T && HI_DT)
MX += (HI_T + HI_DT) >> 1;
if (HI_T && MI_DT)
MX += (HI_T + MI_DT) >> 1;
if (HI_T && ZR_DT)
MX += (HI_T + ZR_DT) >> 1;
if (HI_T && SZ_DT)
MX += (HI_T + SZ_DT) >> 1;
if (MI_T && HI_DT)
HI += (MI_T + HI_DT) >> 1;
if (MI_T && MI_DT)
VHI += (MI_T + MI_DT) >> 1;
if (MI_T && ZR_DT)
MX += (MI_T + ZR_DT) >> 1;
if (MI_T && SZ_DT)
MX += (MI_T + SZ_DT) >> 1;
if (LO_T && HI_DT)
LOW += (LO_T + HI_DT) >> 1;
if (LO_T && MI_DT)
MID += (LO_T + MI_DT) >> 1;
if (LO_T && ZR_DT)
HI += (LO_T + ZR_DT) >> 1;
if (LO_T && SZ_DT)
MX += (LO_T + SZ_DT) >> 1;
if (ZR_T && HI_DT)
MI += (ZR_T + HI_DT) >> 1;
if (ZR_T && MI_DT)
MI += (ZR_T + MI_DT) >> 1;
if (ZR_T && ZR_DT)
LOW += (ZR_T + ZR_DT) >> 1;
if (ZR_T && SZ_DT)
MID += (ZR_T + SZ_DT) >> 1;
if (SZ_T && HI_DT)
MI += (SZ_T + HI_DT) >> 1;
if (SZ_T && MI_DT)
MI += (SZ_T + MI_DT) >> 1;
if (SZ_T && ZR_DT)
MI += (SZ_T + ZR_DT) >> 1;
if (SZ_T && SZ_DT)
MI += (SZ_T + SZ_DT) >> 1;
if (MX > 64) MX = 64;
if (VHI > 64) VHI = 64;
if (HI > 64) HI = 64;
if (MID > 64) MID = 64;
if (LOW > 64) LOW = 64;
if (MI > 64) MI = 64;
//sprintf((char *) status_string, "%02d %02d %02d%02d %02d %02d", MX, VHI, HI, MID, LOW, MI);
//дефазификация
uint16_t sum = MX + VHI + HI + MID + LOW + MI;
if (fuel == 0) //лузга
{
hfan_speed = (uint16_t) (112 * MX + 105 * VHI + 100 * HI + 87 * MID + 75 * LOW + 62 * MI) / sum;
hwaittime = (uint16_t) (40 * MX + 60 * VHI + 70 * HI + 90 * MID + 120 * LOW + 160 * MI) / sum;
}
else //дерево и солома, т.к. для соломы измерений нет
{
hfan_speed = (uint16_t) (125 * MX + 112 * VHI + 97 * HI + 85 * MID + 67 * LOW + 55 * MI) / sum;
hwaittime = (uint16_t) (40 * MX + 60 * VHI + 80 * HI + 100 * MID + 180 * LOW + 300 * MI) / sum;
}
hwaittime *= 100;
//sprintf((char *) status_string, "FAN %3u WT %5u", (uint16_t) (hfan_speed * 100 / FANMAXSPEED), hwaittime);
//sprintf((char *) status_string, "FAN %3u %d %d", (uint16_t) (hfan_speed * 100 / FANMAXSPEED), eps, df_eps);
df_eps = eps;
task_add_delay(fuzzyPD_srv, 0, 1000);
Разработка МБУ:
Схема блока управления пелетной горелки
T - постоянная времени, 1 минута ==> ∆е' = [°С/мин]
∆е - рассогласование системы, ∆е = [°c ]; ∆е = tзад - tтек
tзад - заданное значение температуры, tзад = [°С]
tтек - текущая температура в системе (на входе в котел), tтек = [°С]
Управление основными двигателями системы происходит благодаря дефаззификации, это происходит следующим образом:
Имеются две лингвистические переменные, одна отвечает за обороты вентилятора - "высокие", другая за подачу топлива - "средняя" и эти две переменные преобразуются в значение скважности т.е. в значение ШИМ, которая непосредственно управляет двигателем, который изменяет физический процесс в топке, т.е. физически на нее воздействуют, тем самым на выходе меняется температура, и датчик температуры изменяет свои значения.