ПИД-регулирование

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
ARM7
Встал на лапы
Сообщения: 85
Зарегистрирован: Пн мар 07, 2011 19:52:52

ПИД-регулирование

Сообщение ARM7 »

Задача у меня такая стоит-нужно сделать регулятор оборотов ДВС,привод-двигатель от стеклоочистителя будет крутить заслонку карбюратора,управа-МК AVR.Покажите какой-нибудь код на си с пид-регулированием.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: ПИД-регулирование

Сообщение clawham »

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


// переменные пида

#define P_Factor     4

#define I_Factor     3

#define D_Factor     3

signed long int error       =0;
signed long int SumError    =0;

long int temp               =0;
char i;

int lastProcessValue=0;

long int p_term     =0;
long int i_term     =0;
long int d_term     =0;

long int maxerror = (long int)(1024)<<PWMoutPresc;





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


                            error       = IsetInput-IInput;
                            if(error>1024)
                                error=1024;
                            if(error<-300)
                                error=-300;
                               
                            if(SumError>(maxerror))
                                SumError=(maxerror);
                           
                            if(SumError<(0-(maxerror)))
                                SumError=0-(maxerror);                                 
                           
                            SumError      += error;
                            //SumError    = temp;
                            if(SumError>maxerror*I_Factor)
                                SumError=maxerror*I_Factor;       
                           
                            i_term      = I_Factor * SumError;
                           
                            //i_term=i_term>>4;
                                         
                            p_term = P_Factor * error;
                           
                            d_term      = D_Factor * (lastProcessValue - IInput);
                               
                            lastProcessValue = IInput;

                            //PWMoutTemp  = (p_term + i_term + d_term);
                            temp = p_term + i_term + d_term;
                           
                            if(temp>(maxerror))
                                temp=(maxerror);
                            if(temp<(240<<PWMoutPresc))
                                temp=240<<PWMoutPresc;
                                                 
                            PWMoutTemp=temp;


Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: ПИД-регулирование

Сообщение clawham »

собственно исходный код регулятора тока двигателя через сигнал для сервопривода .... там в папке @Design@ есть апноут АВРовский

http://clawham.hopto.org/DriveD/PubD/67/31_moped.rar

если надо ПИД - разберетесь....только вот зачем Вам пид....для ДВСа достаточно и простого "перелет - уменьшаем / недолёт - увеличиваем"
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
ARM7
Встал на лапы
Сообщения: 85
Зарегистрирован: Пн мар 07, 2011 19:52:52

Re: ПИД-регулирование

Сообщение ARM7 »

clawham писал(а):для ДВСа достаточно и простого "перелет - уменьшаем / недолёт - увеличиваем"

Спасибо за код, наверно вы правы,достаточно будет наверно и простого алгоритма как вы написали.
Аватара пользователя
maglev
Потрогал лапой паяльник
Сообщения: 316
Зарегистрирован: Пт апр 17, 2009 22:45:42
Откуда: Minsk
Контактная информация:

Re: ПИД-регулирование

Сообщение maglev »

clawham писал(а):зачем Вам пид....для ДВСа достаточно и простого "перелет - уменьшаем / недолёт - увеличиваем"

Если уменьшаем/увеличиваем, то это не релейное управление, а вполне себе пропорциональное. Тот-же ПИД, с нулевыми И- и Д- составляющими. Работает.
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: ПИД-регулирование

Сообщение phanis »

Иногда достаточно изменить угол опережения зажигания. Но только если нагрузка на ДВС не сильно изменяется..
Аватара пользователя
ARM7
Встал на лапы
Сообщения: 85
Зарегистрирован: Пн мар 07, 2011 19:52:52

Re: ПИД-регулирование

Сообщение ARM7 »

Нагрузка меняется сильно-это для двигателя минитрактора.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: ПИД-регулирование

Сообщение demiurg301 »

Есть у меня код, но только для каллорифера. Впринципе ПИД регулирование вещь несложная, а вот подбор П, И, Д коэфициентов уже нетривиальная задача если нет модели или практически подобрать коэффициенты нельзя. Тогда придёться снимать модель ОУ.
Завтра выложу, там кода на 20 строчек то. Коэффициенты поменяете - может заработает.

И ещё а вы уверены что вам подойдёт ПИД регулятор? Есть куда более новые виды регуляторов для спец. задач.
Аватара пользователя
ARM7
Встал на лапы
Сообщения: 85
Зарегистрирован: Пн мар 07, 2011 19:52:52

Re: ПИД-регулирование

Сообщение ARM7 »

demiurg301 писал(а):если нет модели или практически подобрать коэффициенты нельзя.

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

Re: ПИД-регулирование

Сообщение clawham »

kbxyj я думаю что в первую очередь нужно озаботиться качественным фильтрованием и подготовной сигнал адля ПИД регулятора(не любит он помех и латентности) поэтому наверное сначала стоило бы погуглить альфа-бета фильтр....ну или калмана...там тож не сложно...
ну и система сбора данных...чем вы будете мерять обороты двигателя? скорее всего стоило бы выйти на высокие частоты - например насадить на вал мотора колёсико от мышки и оттуда же оптопару взять...получите очень много импульсов даже на минимальных оборотах...как следствие - минимальную погрешность(высокие частоты мерять проще) и очень низкую латентность...
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: ПИД-регулирование

Сообщение demiurg301 »

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


//ОБЯЗАТЕЛЬНО ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ:
float Tz=22; \\значение заданной температуры
float Tt;\\значение текущей температуры
float Tp=0;\\значение предидущего измерения температуры температуры
float Ui=0;\\значение интегральной составляющей
float Up=0;\\значение пропорциональной составляющей
float Ud=0;\\значение дифференциальной сосставляющей

// функция нормирования управляющей величины- нужна для того чтобы загнать упралвение в рамки 0-100%
// Может меняться в зависимости от используемых составляющих регулятора.
// Также в ней "обнуляется" интегратор.
unsigned char normalizer(float U)
{
unsigned char result;
if (U>100){result=100;Ui=100;}; //обрезаем по MAX управления
if (U<0){result=0;Ui=0;};//обрезаем по MIN управления
if ((U>=0)&&(U<=100)){result=(unsigned char)U;}; // не трогаем, значение в возможных пределах
return result;
};

//Функция ПИД регулятора


unsigned char PID(float Ttec,float Tzad)
{
float dT;
unsigned char result;
float reg;
float Kp=0.8;
float Ki=0.1;
float Kd=0.05;
dT=Tzad-Ttec;
if (fabs(dT)>0.1) //Гистерезис на 0.1*С
        {
        if (Tzad>Ttec)  { //определяем тип управления , либо греть, либо охлаждать(выключить нагреватель).
                        Ud=Kd*(Ttec-Tp);
                        Ui=Ui+Ki*dT;
                        Up=Kp*dT;
                        reg=Up+Ui+Ud;
                        result=normalizer(reg);
                        }
                        else
                        {
                        Ud=Kd*(Ttec-Tp);
                        Ui=Ui+Ki*dT;
                        Up=Kp*dT;
                        reg=Up+Ui+Ud;
                        result=normalizer(reg);
                        };
        }
        else
        {
        // Тут присваиваеться (N-1) значение управляющей величины если текущая температура не вышла за границу Tz+\-гистерезис
        result=PWM_LEVEL;//значение ШИМ.
        };       
Tp=Tz//сохранение текущего как предидущего для работы Д составляющей
return result; 
};


Думаю вы без особого труда сможете переделать код под другое управление и регулируемую величину. Может придёться ввести свои куски кода для активного изменения величны во всех ветвях. Для этого поменяйте функцию normalizer.
Аватара пользователя
ARM7
Встал на лапы
Сообщения: 85
Зарегистрирован: Пн мар 07, 2011 19:52:52

Re: ПИД-регулирование

Сообщение ARM7 »

clawham писал(а):ма сбора данных...чем вы будете мерять обороты двигателя? скорее всего стоило бы выйти на высокие частоты - например насадить на вал мотора колёсико от мышки

Хм,нежелательно допольнительное что то вешать-сигнал будет браться с датчика холла с трамблера,хотя ваши слова о высоких частотах меня вводят в размышление-так конечно лучше и точнее-но все таки хочется обойтись стандартными как говорится средствами-но время покажет.
demiurg301-спасибо-думаю без особого труда переделаю для управления реверсом двигателя,но конечно в любом случае как всегда надо будет пошевелить извилинами :)
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: ПИД-регулирование

Сообщение demiurg301 »

Не забудте, что период дискретности вашей САУ должен быть меньше постоянной времени переходного процесса вашего ОУ. Хотя бы раза в 3 . Иначе вместо регулирования получите автоколебательный процесс или вообще раскачаете СУ и сломаете чего нибудь. Для меня критично не было - переходные процессы по температуре длятся минуты-часы. Для сервоприводов,двигателей - это сотни миллисекунд - секунды.
Поэтому когда будете выбирать сервопривод для заслонки - смотрите на частотные характеристики. А если есть возможность снимите хотябы статику с двигателя, чтобы примерно прикинуть коэффициенты.

переделаю для управления реверсом двигателя


перечитал , может всётаки управления оборотами? К реверсу то как вы ПИД прицепите ?
Аватара пользователя
ARM7
Встал на лапы
Сообщения: 85
Зарегистрирован: Пн мар 07, 2011 19:52:52

Re: ПИД-регулирование

Сообщение ARM7 »

demiurg301 писал(а):может всётаки управления оборотами? К реверсу то как вы ПИД прицепите ?

result-это с какой скоростью крутить моторчик привода значит, а ещё нужно -в какую сторону крутить с такой скоростью, это имел ввиду.
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Re: ПИД-регулирование

Сообщение sachok »

demiurg301
можете разъяснить по коду.

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

result=PWM_LEVEL;//значение ШИМ.

я так понял что здесь мы читаем текущее значений ШИМ (например от 0 до 1023) или коэффициент заполнения (0-100%)???

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

return result;

здесь мы возвращаем результат функции ПИД от 0 до 100.

Не могу понять как связать результат работы ПИД с заполнением ШИМ.
Буду делать терморегулятор, диапазон температур 20 - 250 градусов, мерять температуру буду термопарой и оцифровывать с помощью ОУ и АЦП. В функции ПИД есть две переменные - заданная температура и текущая, что мне туда подставлять реальную температуру или результат АЦП?
Я не Сашок!!!
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: ПИД-регулирование

Сообщение demiurg301 »

sachok писал(а):demiurg301
можете разъяснить по коду.

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

result=PWM_LEVEL;//значение ШИМ.

я так понял что здесь мы читаем текущее значений ШИМ (например от 0 до 1023) или коэффициент заполнения (0-100%)???

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

return result;

здесь мы возвращаем результат функции ПИД от 0 до 100.



Да, там мы читаем старое значение потомучто текущее значение не вышло за пределы гистерезиса 0.1*С.

PWM_LEVEL и выход функции - это проценты 0-100.

Моя вина, не всю функцию выложил, звиняюсь:
Вот та часть которая у меня реализует сам шим.

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFh

#define PWM_OUT PORTB.0
unsigned int PWM_CNT=0;
unsigned int PWM_LEVEL=0;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
PWM_CNT++;
if (PWM_CNT==1000){PWM_CNT=0;PWM_OUT=1;};
if (PWM_CNT==(PWM_LEVEL*10)){PWM_OUT=0;};
//  тут период шим 1с - период таймера 1мс, множу значение  PWM_LEVEL на 10 - получаю число от 0 до 1000 , с которым сравнивается текущее значение счётчика, если совпало  - переводим в "0", если совпало с 1000 - переводим в "1".
TCNT0=131;
TCCR0=0x03;
}

тактовая 8MГц. Если хотите можете переделать под промиле, вместо процентов. Практика показывает для терморегулятора - нет смысла...

Не могу понять как связать результат работы ПИД с заполнением ШИМ.
Буду делать терморегулятор, диапазон температур 20 - 250 градусов, мерять температуру буду термопарой и оцифровывать с помощью ОУ и АЦП. В функции ПИД есть две переменные - заданная температура и текущая, что мне туда подставлять реальную температуру или результат АЦП?


Заполнение шим сверху. Выбираете период ШИМ, а потом приводите значения процентов или промиле к реальным физическим значениям тактов или счётчика.
Лучше всего в пид регулятор заводить температуры, учитывая что регулируемая величина( выходная температура) должна быть измерена минимум на полпорядка-порядок точнее, иначе получите "биения".
Термопару я бы вам рекомендовал заменить на PT500-PT1000, т.к. проще подобрать калибровочные коээфициенты - по таблице и магазину сопротивлений - 2-3 класа точности.
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Re: ПИД-регулирование

Сообщение sachok »

Спасибо! Теперь стало ясней)
Я не Сашок!!!
Закрыто

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