ПИ регулятор

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Аватара пользователя
Сообщения: 76
Зарегистрирован: Сб дек 12, 2009 00:49:45
Откуда: Украина, г. Житомир

Сообщение Игорь Владимирович »

Помогите пожалуйста програмной реализацией алгоритма ПИ регулирования трехходового клапана системы отопления.

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

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

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

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

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

Примеры желательно на С
Заранее благодарен
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула

Сообщение IfoR »

По вашему сообщению так вы запрашиваете не программную реализацию а всё устройство в целом.
Можно немного конкретнее?
Какая принципиальная схема этого чуда?
И что собственно нужно написать? Функцию выставления коэффициентов открытости клапанов при заданных температурах и реализацию подачи импульсов?

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

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

OS: openSUSE 13.2 (x86_64)
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 76
Зарегистрирован: Сб дек 12, 2009 00:49:45
Откуда: Украина, г. Житомир

Сообщение Игорь Владимирович »

Нужен просто рабочий или проверенный алгоритм ПИ регулирования, а в инете куча теории которая в принципе понятна.
Нужен лишь алгоритм, а описание устройства я подал для общего понимания сути.

Например имеем переменную измеренной температуры и нужной температуры, а на выходе должны получить сигнал на открытие или закрытие задвижки (неважно на каком порту сидят управляющие реле или симисторы)
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

Есть в наличии код ПИД регулятора под CodeVisionAVR C не очень оптимальный не очень быстрый и т.д. рабоатет на флоатах, результатом работы является число 1(минимум) и 2(максимум) ну и промежутки между ними, входной параметр тоже флоат от 1 до 2 регулятор пытается поддерживать 1.5 на входе...преобразование входного параметра который нужно поддержать нужно приводить к 1.5, выход аналогично нужно будет(например для ШИМа или интервала "открыто-закрыто") приводить в нужные числа - если на входе больше 1.5 рано или поздно он выход убьёт к единице, если на входе меньше полтора - он будет стремиться к 2 на выходе плавно к ней приходя.
Очень прост и прямолинеен, легко отключать любые из 3-х составляющих...настройка и пр - дело ваше :) Я чисто экспериментальным путем подбирал коэфициенты чтоб он в крайности перестал биться :)
При желании можно избежать флоатов взяв инты или даблы но...чесно сказать смысла не вижу ибо на 16-ти мегагерцах на него тратится 2% времени при 100 герцах вызовов...
Единственное НО - сам код выложить могу только вечером....ибо в данный момент на работе
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Поищите книгу А.В. Фрунзе Микроконтроллеры? Это же просто! том 4 в нем описание ПИД - регулятора, удалите дифферецирование ипользуйте.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение 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);
}
Вот примерно простейший кодик
В прикрепленке кусок старого проекта для нагревателя - помоему работало но надо вылизывать :)) - идекя должна быть понятной
Вложения
pid.c
Собственно либка
(6.35 КБ) 557 скачиваний
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»