Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсач МОЙ.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.14 Mб
Скачать

Практическая часть

Разработка кода:

Основной код алгоритма работы, реализующий нечеткий ПИД - регулятор

//фазификация входных параметров

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тек = [°С]

Управление основными двигателями системы происходит благодаря дефаззификации, это происходит следующим образом:

Имеются две лингвистические переменные, одна отвечает за обороты вентилятора - "высокие", другая за подачу топлива - "средняя" и эти две переменные преобразуются в значение скважности т.е. в значение ШИМ, которая непосредственно управляет двигателем, который изменяет физический процесс в топке, т.е. физически на нее воздействуют, тем самым на выходе меняется температура, и датчик температуры изменяет свои значения.