Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ПИ - регулятор
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
DeXteR
Добрый день
Очень прошу поделиться исходниками маленького 16 разрядного пид (пи) регулятора на Си под атмел
может у кого есть ....
andrvisht
Цитата(DeXteR @ Dec 5 2005, 20:33) *
Добрый день
Очень прошу поделиться исходниками маленького 16 разрядного пид (пи) регулятора на Си под атмел
может у кого есть ....

Поищи поиском, где-то здесь выкладывали.
DeXteR
Цитата(&-rey @ Dec 5 2005, 20:40) *
Цитата(DeXteR @ Dec 5 2005, 20:33) *

Добрый день
Очень прошу поделиться исходниками маленького 16 разрядного пид (пи) регулятора на Си под атмел
может у кого есть ....

Поищи поиском, где-то здесь выкладывали.


Спасибо &-rey Поиском нашел толька литературу
ее у меня навалом + политех когдато закончил =)
Исходников под АВРку ненашел
Глючит сегодня все чегото

Если несложно исходники регулятора на ukrniisip@mail.ru

Зарание благодарю
andrvisht
Цитата(DeXteR @ Dec 5 2005, 21:19) *
Спасибо &-rey Поиском нашел толька литературу
ее у меня навалом + политех когдато закончил =)
Исходников под АВРку ненашел


А ссылка была
http://forum.electronix.ru/index.php?showtopic=8440
но теперь она не работает sad.gif
Возможно ввиду очень длинного текста её укоротили или переместили куда-то в другое место sad.gif

Просьба к модераторам и ко всем кто видел этот алгоритм помочь в этом вопросе.
к сожалению не помню автора но вот слово ПИД там было.
BVU
Цитата(&-rey @ Dec 6 2005, 13:15) *
Цитата(DeXteR @ Dec 5 2005, 21:19) *

Спасибо &-rey Поиском нашел толька литературу
ее у меня навалом + политех когдато закончил =)
Исходников под АВРку ненашел


А ссылка была
http://forum.electronix.ru/index.php?showtopic=8440
но теперь она не работает sad.gif

Не поленитесь сей факт довести до сведения админов (указав пример). Вещь как ссылка на форумные темы очень нужная, иногда просто необходимая.
subver
ПИ регулятор:

y+=(kp+ki*T)*e[0] - kp*e[1];

y - выход
e[0] - текущий отсчет ошибки
e[1] - предыдущий отсчет ошибки

kp - коэффициент усиления П-звена
ki - коэффициент усиления I-звена
T - период дискретизации.

Естественно, что (kp+ki*T) можно вычислить заранее.
Black Pahan
Вот правильная сцылка
http://electronix.ru/forum/index.php?showtopic=8440

сравните с неправильной
http://forum.electronix.ru/index.php?showtopic=8440

и догатайтесь что теперь нужно делать в таких случаях.
DeXteR
Молодец =)
Такие вещи знают на втором курсе любого политеха =)

Но работать небудет вот почему

Переполнения будут кругом

Писал дла TMS320F24xx

Там есть математика с насыщением
тоесть FFFF + A = FFFF

А в твоем случае наверна переполниться и в насыщение не войдет
subver
Ну так просил на С, я написал на с. А как там его компилятор откомпилирует, с насыщением или без, это уже другой вопрос.

Как ни странно работает, уже год.

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

Вот еще вариант:

err_i+=err;
sat(err_i);
y = err_i*Ki*T + err*Kp

sat(err_i) - насыщение интегратора.
DeXteR
Дело в том что изучаю
Си уже почти неделю

Может расскажеш как заставить считать твою строчку с насышением

Я пишу на EWAVR 4.11
DeXteR
Цитата(subver @ Dec 6 2005, 15:59) *
Ну так просил на С, я написал на с. А как там его компилятор откомпилирует, с насыщением или без, это уже другой вопрос.

Как ни странно работает, уже год.

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

Вот еще вариант:

err_i+=err;
sat(err_i);
y = err_i*Ki*T + err*Kp

sat(err_i) - насыщение интегратора.


Толька одним выходным значением необойдешся
При вычислении ошибки тоже может быть переполнение.
Дальше - когда err_i*Ki*T + err*Kp считаем - тоже

Входные величины нехочиться ограничивать

Неподскажет ли кто можно ли как нибудь реализовать
функцию сложения с насышением на Си
subver
Цитата
Неподскажет ли кто можно ли как нибудь реализовать
функцию сложения с насышением на Си


long result;
short int a,b;
short shortresult;
result = a+b;
if(result>32767) result = 32767;
if(result<-32768) result = -32768;
shortresult = result;

hint:

result - 32 разрядный,
a,b - 16 разрядные, так что при сложении
a и b и помещении результата в result переполнения не будет.

На ассемблере достаточно проверить бит OVF.
Rst7
Цитата(subver @ Dec 7 2005, 05:35) *
Цитата
Неподскажет ли кто можно ли как нибудь реализовать
функцию сложения с насышением на Си


...
На ассемблере достаточно проверить бит OVF.


Да вообщем и на С можно, например, для IAR, if (SREG_Bit3) ....

Только аккуратно надо с этим, рекомендуется посматривать в листинг, чего он там компилирует. Я для TCP/IP так бит переноса проверял (для расчета CRC).
DeXteR
Огромное спасибо за совет

Дело в том что способ subver очень медленный

Нельзя ли както побыстрее ??
Ведь задача считать Пи регулятор с частотой общета гдето килогрец 10 - 16
subver
Цитата
Нельзя ли както побыстрее ??
Ведь задача считать Пи регулятор с частотой общета гдето килогрец 10 - 16


Если процессор работает на частоте 16Мгц, то получается 1000 тактов для расчета регулятора.
неужели не хватит?
DeXteR
Кроме регулятора (а моджет и 2-х) системма будет делать много много чего ещо

Это привод безколекторного двигателя + зарядное устройство + интерфейс с жки
(или ЛСД ещо не решил)

Делал чтото похожее на АСМе Работает вполне нормально Обещают даже серию =)

Теперь решил попробывать на Си (чтоб научиться)
IgorKossak
Цитата(subver @ Dec 7 2005, 13:41) *
... Если процессор работает на частоте 16Мгц, то получается 1000 тактов для расчета регулятора.
неужели не хватит?

Да хватит с головой!
Чем бы процессор ещё ни занимался.
На МСП430 при 1МГц тактовой работает при аналогичных условиях.
LordN
Цитата
Очень прошу поделиться исходниками маленького 16 разрядного пид (пи) регулятора на Си под атмел

пользуюсь вот этим:
Код
//************************************************************
void PI_regulator(void)    //    Алгоритм регулирования.
//************************************************************
{
    //********* обработка канальной температуры и ПИ закона ******
    Error[0] = ee.tmprSet - themp;    //    ошибка температуры.
                //    она же - пропорциональная составляющая.

    //    интегральная часть регулятора
    Integral += (float) (Error[0] + Error[1]) / (2 * ee.tauInt);        
    if(Integral < 0) Integral = 0;
    if(Integral > (float) ee.zoneProp) Integral = (float) ee.zoneProp;

    summ = (float) (Error[0] + Integral) / ee.zoneProp; //    полный сигнал ПИ-регулятора

    Error[1] = Error[0];

    if(summ <= 0)        //    Ограничитель  сигнала
        summ = 0;
    else if(summ >= 1)
        summ = 1;
}
//    ee.tmprSet = уставка.
//    ee.zoneProp = 1/Ku, величина обратная коэф-ту усиления.
//    ee.tauInt = Ti/tauQuant, постоянная времени интегрирования нормированная на время квантования.

не для атмела, но на Сях и во флоатах.
DeXteR
Цитата(IgorKossak @ Dec 7 2005, 19:14) *
Цитата(subver @ Dec 7 2005, 13:41) *

... Если процессор работает на частоте 16Мгц, то получается 1000 тактов для расчета регулятора.
неужели не хватит?

Да хватит с головой!
Чем бы процессор ещё ни занимался.
На МСП430 при 1МГц тактовой работает при аналогичных условиях.


Спорить небуду

Когда напишу что то - точно скажу сколька тактов выполняется

Всем Спасибо за советы smile.gif

De}{teR
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.