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

ПИ регулятор

Добавлено: Сб дек 12, 2009 19:15:31
Игорь Владимирович
Помогите пожалуйста програмной реализацией алгоритма ПИ регулирования трехходового клапана системы отопления.

Вкратце о трехходовом клапане:
Это устройство, в первичный контур которого подается горячий теплоноситель Т1, а на выходе этот горячий теплоноситель подмешивается с холодным Т2 (обратка) и в зависимости от его положения меняется температура на выходе.
Управляется он от сервопривода - открыть/закрыть. Датчика положения нету.

Основная идея такова:
МК какой нибудь АВР-ровский (м16,32 - будет еще куча наворотов типа регулирование по времени, летние режимы, антизамерзание и т.д.)

Система меряет температуру на улице (погодное регулирование) DS18B20 либо термосопротивление, неважно.
На устройстве выставляется нужная температура помещения.
Устройство вычисляет нужную температуру теплоносителя по графику в зависимости от смещения и наклона отопительной кривой (это уже своя проблема)
В результате получаем нужную температуру, и меряем реальную температуру на выходе.
В зависимости от этих двух параметром нужно выставлять положение заслонки 3-ходового клапана.

Примечание:
Никакого датчика положения заслонки нету, управляем просто открыванием или закрыванием заслонки через реле. (Частота и длительность подачи упр. импульсов на открытие или закрытие)

Система довольно инерционная, изменения на выходе происходят не сразу

Примеры желательно на С
Заранее благодарен

Добавлено: Вс дек 13, 2009 18:05:22
IfoR
По вашему сообщению так вы запрашиваете не программную реализацию а всё устройство в целом.
Можно немного конкретнее?
Какая принципиальная схема этого чуда?
И что собственно нужно написать? Функцию выставления коэффициентов открытости клапанов при заданных температурах и реализацию подачи импульсов?

Имхо. без одной лишь принципиальной схемы тут сложно что сказать.
Выкладывайте схему, либо подробно опишите характер входных\выходных сигналов и к каким ножкам они идут. Опишите по какому принципу что должно работать. А там уж, если всё будет понятно, что вы от нас хотите, то может поможем.

А если вы хотите реализацию всего устройства целиком, то уж хотя бы поищите схемы в интернете.

Добавлено: Вс дек 13, 2009 18:40:04
Игорь Владимирович
Нужен просто рабочий или проверенный алгоритм ПИ регулирования, а в инете куча теории которая в принципе понятна.
Нужен лишь алгоритм, а описание устройства я подал для общего понимания сути.

Например имеем переменную измеренной температуры и нужной температуры, а на выходе должны получить сигнал на открытие или закрытие задвижки (неважно на каком порту сидят управляющие реле или симисторы)

Добавлено: Вт дек 22, 2009 15:43:10
clawham
Есть в наличии код ПИД регулятора под CodeVisionAVR C не очень оптимальный не очень быстрый и т.д. рабоатет на флоатах, результатом работы является число 1(минимум) и 2(максимум) ну и промежутки между ними, входной параметр тоже флоат от 1 до 2 регулятор пытается поддерживать 1.5 на входе...преобразование входного параметра который нужно поддержать нужно приводить к 1.5, выход аналогично нужно будет(например для ШИМа или интервала "открыто-закрыто") приводить в нужные числа - если на входе больше 1.5 рано или поздно он выход убьёт к единице, если на входе меньше полтора - он будет стремиться к 2 на выходе плавно к ней приходя.
Очень прост и прямолинеен, легко отключать любые из 3-х составляющих...настройка и пр - дело ваше :) Я чисто экспериментальным путем подбирал коэфициенты чтоб он в крайности перестал биться :)
При желании можно избежать флоатов взяв инты или даблы но...чесно сказать смысла не вижу ибо на 16-ти мегагерцах на него тратится 2% времени при 100 герцах вызовов...
Единственное НО - сам код выложить могу только вечером....ибо в данный момент на работе

Добавлено: Вт дек 22, 2009 19:23:40
Meteor
Поищите книгу А.В. Фрунзе Микроконтроллеры? Это же просто! том 4 в нем описание ПИД - регулятора, удалите дифферецирование ипользуйте.

Добавлено: Вт дек 22, 2009 20:18:47
clawham

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

void PID_Temperature(float Temper)
{
    /* преобразуем результат АЦП к диапазону 1.0 - 2.023
    поддерживаться регулятором будет значение CMNDVX = 1.5
    */
    ADRCX = 1.5/CurrTargTemp*Temper;

    if(ADRCX<1>2.02)
        ADRCX=2.02;

    /* вычислить требуемое управляющее воздействие NEWDTY */

       /* вычисление текущего знчения ошибки */
    ERRX = (CMNDVX - ADRCX); /* calculate current error */

    /* ======  вычисление управляющего воздействия ====== */
    NEWDTY =    OLDDTY                                  // к прошлому значению управл. возд. добавить
              + KP*(ERRX)                               // значение пропорциональное текущей ошибке
              + KI*PERDT*(CMNDVX - (ADRCX + ADRCXM1)/2)
              + (KD/(6*PERDT))*((ERRX - ERRM3X)
              + 3*(ERRM1X - ERRM2X));

    printf("PIDcontrol: KP=&i, KI=&i, KD=&I, ERRX=&i, OLDDTY=&i, NEWDTY=&i, ", KP, KI, KD, ERRX, OLDDTY, NEWDTY);
    //puts(a2);

    if (NEWDTY > 1.99609) /* test for result being in usable */
            {
                NEWDTY = 1.99609; /* limits and set PWM duty cycle if */
            }
    else if (NEWDTY < 1.0) /* beyond saturation */
            {
                NEWDTY = 1.0;
            }

    ADRCXM1 = ADRCX; /* update A/D result for next cycle */


    ERRM3X = ERRM2X; /* update error pipeline */
    ERRM2X = ERRM1X;
    ERRM1X = ERRX;

    OLDDTY = NEWDTY;
    /* update old duty cycle for next
    calculation period */


    /* Вычисление ШИМ из расчитаного NEWDTY */
    pwm_val = ((int)(NEWDTY * 100.0)) - 100;
    printf("pwm_val=&i, \n\r", pwm_val);
}
Вот примерно простейший кодик
В прикрепленке кусок старого проекта для нагревателя - помоему работало но надо вылизывать :)) - идекя должна быть понятной