применение ПИД и ФИМ

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
shtorm
Нашел транзистор. Понюхал.
Сообщения: 185
Зарегистрирован: Чт янв 22, 2009 14:03:25
Контактная информация:

применение ПИД и ФИМ

Сообщение shtorm »

всем привет, собственно цель построить систему контроля температуры. Нагреватели (3шт) керамика по 500Вт, датчик термопара. управление симисторы+оптопара. контроллер атмега16, среда разработки CVAVR.
имеется код с ПИД контролем, и ФИМ упралением, только вот неправильно както работает. расчет ПИД (взят тут на форуме с проекта HASS, за что ему спасибо):

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

read_adc(3);            //Считываем данные АЦП нагревателя
            TempADC=(20+(ADCW/2));             //Макс значению 1024 соответствует 512 градусов + 22
            Error=TempSET-TempADC;
            if ((MaxPower>Power)&(Power>MinPower)) Integral=Integral+Error;   //Чтоб ошибка не увеличивалась
            P=(long)Kp*Error;
            P=P/10;
            In=(long)Ki*Integral;
            In=In/10;
            D=(long)Kd*(Error-pre_err);
            D=D/100;
            TempPower=P+In+D;
           
            if (TempPower>MaxPower) Power=MaxPower;                 //Задаем предел мощности
            if (TempPower<MinPower) Power=MinPower;                 //
            if ((MaxPower>TempPower)&(TempPower>MinPower)) Power=(int)TempPower;  //Если предел не достигнут
            pr=Power;


этот расчет запускается на каждом периоде, в итоге имеем плавное управление, только вот нагреватели аж свистят. Если посмотреть на китайскую термовоздушку, то она не овсем плавно регулирует а заметными миганиями, тоже самое и на оборудовании "термопро". как сделать также?
Andriy
Родился
Сообщения: 9
Зарегистрирован: Ср янв 07, 2009 20:57:45
Откуда: Ростов-на-Дону

Re: применение ПИД и ФИМ

Сообщение Andriy »

А с какой частотой у вас, нагрузка включается? Хотелось бы глянуть весь исходник.
У меня, когда я химичил с ШИМ и дальним светом на машину, вся машина пела, с частотой ШИМ.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: применение ПИД и ФИМ

Сообщение uk8amk »

Откажитесь от ФИМ и включайте нагрузку на целое число полупериодов сети. Ни свиста, ни сильных коммутационных помех не будет. Для упрощения схемотехники и программы можно использовать оптопары или оптотиристоры с встроенным детектором перехода через ноль.
Аватара пользователя
shtorm
Нашел транзистор. Понюхал.
Сообщения: 185
Зарегистрирован: Чт янв 22, 2009 14:03:25
Контактная информация:

Re: применение ПИД и ФИМ

Сообщение shtorm »

Andriy с частотой 50 Гц соответственно, в коде бардак и нет коментов, приведу в порядок покажу, смысл то в принципе простой, от полного периода отсчитываем нужный процент включения и включаем нагрузку, например если надо 50% то пол периода пропускаем и вкл нагрузку.

uk8amk
согласен отказаться, вот только не совсем понятен алгоритм, например при выходе с подсчета пид получаем процентное показание работы нагревателей, как получить из этого кол-во полу периодов, и как часто необходимо вести подсчет пид?
eufs
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Re: применение ПИД и ФИМ

Сообщение eufs »

Пересчетчик периодов сети, сравнение с заданием от ПИД регулятора, если номер периода меньше чем задание - нагреватель включен. Получится этакий низкочастотный ШИМ, с дискретностью один период сети. Период ШИМ при этом будет, при байтовом задании 256*0,02 = 5,12 сек. Если это сильно много по времени, вполне возможен (а может и более правильный) вариант не 8 бит задания а, меньше. С достаточной точностью будет работать и 4-5 бит. Это позволит уменьшить период ШИМ и, соответственно, время реакции.
C0FFEE=‭12648430‬
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: применение ПИД и ФИМ

Сообщение clawham »

это называется алгоритм брезенхема
вот код

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

typedef struct
{
    signed char Ena;
    signed char MAXPOWER;
    signed char Delta;
    signed char Target;
    signed char Phase_number;
    signed char Out;
    unsigned int curr_Step;
    unsigned int Divider;
} brez;

brez b[maxBrez];

void UpdPhase()
{
    char n=0;
    for(n=0;n<maxBrez;n++)
    {
        if(b[n].Ena==1)
        {
            // текущий брезенхем включен - считаем надо ли его включить
            if(++b[n].curr_Step>b[n].Divider)
            {
                b[n].curr_Step=0;
                b[n].Delta+=b[n].Target;
                if(b[n].Delta>0)
                {
                    b[n].Delta -= b[n].MAXPOWER;
                    b[n].Out    = 1;
                }
                else
                    b[n].Out    = 0;
               
                if(--b[n].Phase_number==0)
                {
                   b[n].Phase_number    = b[n].MAXPOWER;
                   b[n].Delta           = (-(b[n].MAXPOWER/2));
                }
            }       
        }
    }
}

void brezinit()
{   
    char n=0;
    for(n=0;n<maxBrez;n++)
    {
       b[n].Ena             = 1;
       b[n].MAXPOWER        = 100;
       b[n].Phase_number    = 100; 
       b[n].Delta           = -50;
       b[n].Out             = 0;
       b[n].Target          = 0;
       b[n].curr_Step       = 0;
       b[n].Divider         = 0;
       if(n==2)
        b[n].Divider         = 50;
         
    }
}


в переменной Delta должно лежать константное значение -1*(МаксЗадача/2)

для 100 шагов получается -5

если надо меньшая дискретность - уменьшаем соответствующие переменные:
b[n].Ena = 1;
b[n].MAXPOWER = 50;
b[n].Phase_number = 50;
b[n].Delta = -25;

в Target заносим требуемое значение 0...MAXPOWER

функцию UpdPhase() надо вызывать один раз на положительной полуволне, в структуры передавать задачу(0...100 в приведенном мной примере) результат (надо включить или не надо) складывается в Out структуры...
я на 103-й меге делал 10-тиканальный регулятор для духовки на 10 тенов 10 киловатт...нагрузку от 5-ти киловаттлучше клацать пореже чем 25 герц(при 50% задачи мощности) - лампочки моргают противно - я ввёл для этого делитель - если делитель равен 50-ти то получается минимальная длительность работы нагревателя 1 секунда и 99 секунд простой(1% мощности) или например 1 секунда включен вторая выключен третья включен - это 50% задача :)
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
eufs
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Re: применение ПИД и ФИМ

Сообщение eufs »

Хороший язык Си...

Настраиваем прерывание от вывода и по фронту. Можно дополнительно отфильтровать помехи.
В обработчике пишем

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

int0_req:
   push temp
   mov temp,sreg
   push temp
   inc phase      ;увеличив счетчик
   andi phase,$0f   ;ограничиваем до 4 бит 
   mov temp,zad   
   cp phase,temp   ;сравнение
   brcs on_               ;если задание больше, включаем
   cbi portb,upravl
   rjmp _00
on_:
   sbi portb,upravl      ;иначе выключаем
_00:
  pop temp                ;восстанавливаем регистры
  mov sreg,temp
  pop temp
  reti

Все. Задание в диапазоне пересчетчика+1 0 - 0х10
C0FFEE=‭12648430‬
Andriy
Родился
Сообщения: 9
Зарегистрирован: Ср янв 07, 2009 20:57:45
Откуда: Ростов-на-Дону

Re: применение ПИД и ФИМ

Сообщение Andriy »

Как вариант, загасить звон снаберами. Так как включение симистора происходит не в нуле, в момент включения, в сеть и на нагрузку идет сильная импульсная помеха. Включить снабер параллельно нагрузке, можно еще последовательно включить дроссель, он тоже будет гасить импульсную помеху.
Рекомендую посмотреть схемы сварочных инверторов, как там решают эту проблему.
Например включить параллельно нагрузке цепочку конденсатор 2200пФ*1000в резистор 10 Ом 10Вт
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: применение ПИД и ФИМ

Сообщение clawham »

симистор сам по себе будет шуметь при включении.....эт всё ерунда с фазовым управлением...не у вас так в соседней комнате будут все трансы свистеть , микроволновка не запускает магнитром пол минуты!!! и так далее

я привёл на сях алгоритм Брезенхема - он стремится к минимально-возможным длинам импульсов и промежутков при заданном уровне выхода и максимальных значениях, при этом многоканальность .... собственно устройство собрано и фунциклирует :) при этом только лампочки в пекарне моргали 25-герцами когда 5-тикиловаттный тен клацал потому ввел ему делитель на 50 - в таком виде оно не замечается
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
shtorm
Нашел транзистор. Понюхал.
Сообщения: 185
Зарегистрирован: Чт янв 22, 2009 14:03:25
Контактная информация:

Re: применение ПИД и ФИМ

Сообщение shtorm »

спасибо, столько информации, алгоритм брезенхема понравился, правда не все понятно, буду разбираться и пробовать
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1004
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

Re: применение ПИД и ФИМ

Сообщение Хатуль_мадан »

shtorm писал(а): не совсем понятен алгоритм, например при выходе с подсчета пид получаем процентное показание работы нагревателей, как получить из этого кол-во полу периодов, и как часто необходимо вести подсчет пид?

Часть советов уже дали, но как реализовать окончательно, решать Вам. На мой взгляд, все зависит от нагревателя, если его мощность более кВт, то значит он достаточно инерционен и менять температуру будет медленно, т.е. импульсное управление можно расчитать на единицы секунд. К тому же использовать переключение симисторов в начале полупериодов избавит от громадного количества помех, от которых избавиться практически невозможно, не стоит применять фазовое регулирование при больших токах.
Если на выходе имеем процентное соотношение, то и время включения должно соответствовать проценту мощности. Например, 27% это 27*10=270 мСек нагреватель включен (27 полупериодов по 10мС каждый при 50Гц), а 730 мСек выключен, при этом каждую секунду можно изменить процент регулировки. Единственное неудобство, необходимость заводить в МК импульсы контроля перехода через ноль (их подсчет и момент открытия симистора в каждом положительном и отрицательном полупериоде), или применять оптопары с таким контролем, но тогда интервалы отсчета по 10 мС должны быть очень точны и стабильны, чтобы не сбивался процент нагрева тена.
Если задатчик в виде одного байта (256 ступеней регулировки), то реализовать можно еще проще, без математических вычислений, включаем нагрев и с каждым полупериодом уменьшаем этот байт на 1, при нулевом значении выключаем нагрев, но продолжаем подсчет полупериодов до 256 значения, далее все повторяется. Время цикла нагрева получится 2,56 Сек. Реализовать проще на любом 8-и разрядном таймере, или в прерываниях по 10 мС или от импульсов контроля перехода через ноль, чтобы у МК оставалось время для основной программы. Вот как-то так.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: применение ПИД и ФИМ

Сообщение clawham »

вот только не надо говорить слово ПОЛУ период !!!
подмагничивание сердечников трансов и прочие прелести -кувырки со счетчиками это тоже последствия того что некоторые полупериоды нагружены а некоторые нет

ПОЛНЫЙ период надо брать....и положительную полуволну и отрицательную --- тогда не будет морганий шумов свистов и прочих спецэфектов
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1004
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

Re: применение ПИД и ФИМ

Сообщение Хатуль_мадан »

clawham писал(а):вот только не надо говорить слово ПОЛУ период !!!
ПОЛНЫЙ период надо брать...

А в чем проблема то? Можно и полный период, вообще нет сложностей. Я не думаю, что стабилизация температуры будет на пределе 1% или 1/256 цикла, чаще всего это значительно больше 50% (иначе расчет всей системы регулирования не верен), а там уж точно не один десяток полных периодов будет, так разницы нет, полупериодом больше/меньше роли не играет, никто же не делает коммутацию нагрузки симистором с обязательным учетом целых периодов тока.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: применение ПИД и ФИМ

Сообщение clawham »

я вот делал полупериодами и очень регулярно звенело

нагрузка 9 1 киловаттных тенов + 5-тикиловаттный основной...рабочее состояние 60-80-%
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
eufs
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Re: применение ПИД и ФИМ

Сообщение eufs »

Упрощенный ПИ (пропорционально-интегральный) регулятор:
1. Находим разность между заданым и фактическим параметром объекта регулирования в абсолютной величине со знаком - это у нас будет переменная d
2. Определяем новое значение в интеграторе X=Xстар+d/ki , где ki - постоянная времени интегратора
при этом не забываем об возможных переполнениях или заемах. Этого быть не должно. Если переменная интегратора переполняется при очередном суммировании - оставляем максимальное значение, а если происходит заем - минимальное.
Например: задано 40 градусов, имеем 60. 40-60 = -20. От интегратора нужно вычесть 20/ki.
Если задано 40, фактическое 30, то 40-30=10. В интегратор добавляем 10/ki
Надо чтобы переменная Х, которая хранит значение интегратора, была хотя бы на два порядка больше, чем задания. Если задание определяется байтовой переменной, то интегратор нужен двухбайтовый.
Еще момент. Если на объект внешних воздействий мало, то можно прибавлять или отнимать по единичке в соответствии со знаком. Это увеличит постоянную времени что приведет к большой инерционности системы. Это не всегда хорошо и приемлемо, но позволит отказаться от пропорциональной части в регуляторе.
В других случаях, с малой постоянной времени, без пропорциональной части не обойтись, потому что без него система регулирования может возбудится.
3. Определяем значение пропорциональной части W=d/ku (или d*ku, если объект регулирования без коэффициента усиления)
4. Определяем значение на выходе регулятора как сумму пропорциональной и интегральной части X+W. Не забываем про знаки.
5. Полученное значение и есть, в данном случае, значение мощности нагревателей, но его, возможно, потребуется промасштабировать применительно к регулятору мощности. В асме брал нужное количество старших битов результата. Значение в интеграторе после преобразования и масштабирования будут сглаженными показаниями фактического значения параметра объекта.
Коэффициенты ki и ku проще подобрать по минимальному времени установления и перерегулирования, но можно и рассчитать. Это сложнее.
C0FFEE=‭12648430‬
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1004
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

Re: применение ПИД и ФИМ

Сообщение Хатуль_мадан »

clawham так в Вашем случае вообще можно снизить уровень помех до минимума при таком количестве тенов, обьединив их в группы и включать нужное число. Все равно 14 кВт одним симистором коммутировать не будешь. Увеличивая число симисторов, дополнительные затраты на это, зато и от помех избавляемся.
eufs вроде просто описано, но все равно немного не понятно, с какого момента нужно включать регулятор на ограничение мощности? Или предлагаете во всем диапазоне сразу регулировать? Вроде не хватает еще одной переменной. Вот например, нужно нагреть воду с комнатной температуры до 95 градусов, быстро, но не перегреть. Скакой температуры нужно начинать ограничивать мощность нагревателя? Это же надо учитывать скорость нагрева, или вводить дополнительную величину, в пределах которой начинается работа регулятора, в остальных случаяй нагрев максимальный или отключен вовсе. Это не наезд, просто хочу понять...
и еще:
eufs писал(а):Например: задано 40 градусов, имеем 60. 40-60 = -20. От интегратора нужно вычесть 20/ki.
Если задано 40, фактическое 30, то 40-30=10. В интегратор добавляем 10/ki

А тут случаем не ошибка? Ведь, если задано 40, а мы имеем уже 60, то нагрев выключаем полностью, уже и так большой перегрев вышел, а Вы предлагаете только уменьшить регулировку нагрева, тоже не понятно...
Последний раз редактировалось Хатуль_мадан Чт фев 02, 2012 10:52:57, всего редактировалось 1 раз.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: применение ПИД и ФИМ

Сообщение clawham »

Собственно так я и делал
9 каналов по 12 ампер и один канал симистор на 24 ампера

все каналы мелкие - это подогрев боков верхов и дверок - технологическая тайна - они были выведены на переменники задающие температуру

они все с собой синхронизировались и имели смещение - тоесть никогда не возникало ситуации когда либо все одновременно выключены либо все одновременно включены(хотя мощность задана ниже 100 и ниже 50%) - пропускал 1-2 периода чтоб не накладывались....результат - свет притухает как при фазоимпульсном режиме а спецэффектов нет как класса - тишина и спокойствие....только в самом блоке симисторов в полной тишине(утром) когда ставиш на разогрев 50% мощному тену и 100 % всем остальным слышно поцокивание самого симистора ели слышное...ито это когда он холодный...прогревается и это тож исчезает...видимо тэн в холодном состоянии берет больше положенных 5-ти киловатт...
и кстати о нагреве - симисторы поставлены на кулер от 2500-го бартона + вентилятор + дс-ка для контроля перегрева - даже с вентилятором и 30-ти градусах вокруг радиатор накаляется до 65 градусов...на 80-ти градусах я нагрузку снимаю и даю тревогу перегрев силовой :)
утром люди возле этого блока руки греют...у нас сичас -20 за окном и 95% влажности....по ощущениям очень холодно...


А по нагреву воды
ну...вы ж не протоковые нагреватели проектирутее так? у вас Ёмкость..и наверняка приличная....учитывая что вы не за 10 минут её нагреть сможете на 10 градусов то это признак очень инерционной тепловой нагрузки - как результат - дифференциальная составляющая вам и не нужна...ну перелетите на 0.1 градус...что тут такого? всёравно сам тен будет кипеть(или вы применяете солёную воду и принудительную её циркуляцию под давлением?
95 градусов очень коварная температура!!
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1004
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

Re: применение ПИД и ФИМ

Сообщение Хатуль_мадан »

clawham писал(а):А по нагреву воды ну...вы ж не протоковые нагреватели проектирутее так?
... 95 градусов очень коварная температура!!

Да я про воду к примеру сказал, типа, как сделать нагрев в диспенсере и не допустить кипения, обьем маленький, нагреватель мощный, но и тут такой регулятор лишний.
А в реальности были проблемы с печью в 75кВт и нагрев до 230 градусов, размеры внушительные, а выход на режим быстрый (20 минут), но без превышения заданной температуры. Тены с обдувом, питались группами от 3-х фазной сети, управлялись симисторами MAC224 на радиаторах, через оптопары с контролем перехода через ноль. Так вот, тоже без ПИД регулятора не обошлось, настроечные коэффициенты и прочее. Хочется что-то подобное, но упростить математику под бытовые задачи, вот и интересно стало, как проще это реализовать (делал электронику, а вот программирование начал изучать с недавних пор).
Последний раз редактировалось Хатуль_мадан Чт фев 02, 2012 12:38:02, всего редактировалось 1 раз.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: применение ПИД и ФИМ

Сообщение clawham »

вообще настройка ПИДа это очень непростое занятие граничащее с дурдомом....ибо иногда это просто невозможно сделать...ибо меняются какие-то условия и все коэффициенты летят

хотя можно попробывать приблизиться к идеальному варианту и учитывать инерцию нагревателя..

тут никто ничего не подскажет - только пробы и ошибки и какой-нить самописец 3-4 канальный :)
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
Хатуль_мадан
Электрический кот
Сообщения: 1004
Зарегистрирован: Ср мар 03, 2010 11:48:00
Откуда: Уфа

Re: применение ПИД и ФИМ

Сообщение Хатуль_мадан »

Да это все понятно, но вот сообразительные китайские специалисты решают все просто. Пришел нам термошкаф и к нему блок управления, очень понравилось решение ими вопроса термостабилизации. Может конечно там все расчитано, и масса, и мощности нагревателей, и прочие условия, но работает отлично. При включении идет непрерывный нагрев с обдувом тенов. За последние пару градусов, до того, как достигнет температура установленного значения, включается пропорциональное регулирование (мне так кажется). По мере приближения реальной температуры к установленной, меняется соотношение включенного и выключенного состояния тенов, около 50% в момент равенства. Это видно по контрольному светодиоду, который начинает моргать каждые 2 секунды. Все достаточно быстро и стабильно. Прошивку считать невозможно, а повторить такой регулятор желание есть.
Закрыто

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