|
|
  |
ПИД регулятор на ARM |
|
|
|
Jul 17 2008, 06:36
|
Участник

Группа: Свой
Сообщений: 45
Регистрация: 7-11-05
Пользователь №: 10 537

|
Цитата(kanzler @ Jul 17 2008, 08:02)  Господа! Прошу подсказать где можно взять программный модуль(на Си) ПИД регулятора под ARM? Под АРМ не нашла...  но есть вот такой вариант
Прикрепленные файлы
PID.zip ( 1.25 килобайт )
Кол-во скачиваний: 522
|
|
|
|
|
Jul 17 2008, 07:42
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(kanzler @ Jul 17 2008, 07:02)  Господа! Прошу подсказать где можно взять программный модуль(на Си) ПИД регулятора под ARM? Цитата Под АРМ не нашла... А чем собственно ПИД под АРМ отличается от ПИД под АВР? или PC? Тем более если на си? "Дайте мне, пожалуйста, глобус Украины" - вот это что напоминает. Сорри за офтоп. Не удержался.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Jul 17 2008, 08:29
|
Участник

Группа: Свой
Сообщений: 45
Регистрация: 7-11-05
Пользователь №: 10 537

|
Продолжая оффтоп... А вы смайлики вообще правильно трактуете?  или вы их отключили?  И здерживайте всётаки себя, а то глупо смотриться... причем здесь разница между ПИД для АРМ и ПИД для АВР, написано же что пример реализации ПИД на Си есть в апноте для АВР, а не ПИД для АВР...
Сообщение отредактировал маша - Jul 17 2008, 08:35
|
|
|
|
|
Jul 17 2008, 15:47
|
Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491

|
Цитата(Dir @ Jul 17 2008, 13:46)  О, очень многим  При реализации алгоритма ПИД на ARM в подавляющем большинстве случаев можно вообще не заморачиваться эффектами насыщения интегрального терма. Работай в лоб с флоутами (и даже даблами) и в ус не дуй. Быстродействия хватает. Для AVR же приходится морочиться с целочисленной арифметикой, перекалибровками, следить за границами термов... В общем, ARMы для ПИДов зверски упрощают жизнь  Я считаю, что, наоборот, необходимо следить за границами, особенно интегральной части. Иначе это может привести к неприятным эффектам. ЗЫ: немного непонятно, что значит "морочится с целочисленной арифметикой"? Что за перекалибровки?
|
|
|
|
|
Jul 17 2008, 16:38
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата да и быстродействие нужно, с чем AVR вряд ли справиться Ну вообщем мы тут вывели формулу  2*Navr=Narm, где Navr - количество тактов AVR, Narm - количество тактов для ARM аналогичного кода (тестовым кодом был JPEG-кодер). А что у Вас за объект регулирования, что надо прямо за микросекунды его крутить?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 20 2008, 16:55
|

Местный
  
Группа: Свой
Сообщений: 201
Регистрация: 6-01-05
Пользователь №: 1 830

|
Цитата(SpyBot @ Jul 17 2008, 18:47)  Я считаю, что, наоборот, необходимо следить за границами, особенно интегральной части. Иначе это может привести к неприятным эффектам. ЗЫ: немного непонятно, что значит "морочится с целочисленной арифметикой"? Что за перекалибровки? Так все ж про него, про Аппнот Атмеля, который про ПИД. Вот какой он есть для AVR: http://atmel.com/dyn/resources/prod_documents/AVR221.ziphttp://atmel.com/dyn/resources/prod_documents/doc2558.pdfИ вот что от него остается для ARM: Код typedef struct { float fKp; float fKi; float fKd; float fLastProcessValue; float fSumError; float fMaxPID; float fMinPID; } PID_DATA; Код WORD ContrPID(float fSetPoint, float fProcessValue, PID_DATA *pid) { float fError, fPterm, fDterm, fIterm, fRet, fsError; fError = fSetPoint - fProcessValue; // Вычисление P-терма fPterm = pid->fKp * fError; // Вычисление D-терма fDterm = pid->fKd * (fProcessValue - pid->fLastProcessValue); pid->fLastProcessValue = fProcessValue; // Вычисление I-терма fsError = pid->fSumError + fError; fIterm = pid->fKi * fsError; // fRet = fPterm + fDterm + fIterm + pid->fMinPID; // if (fRet > pid->fMaxPID) return (WORD)(pid->fMaxPID); else if (fRet < pid->fMinPID) return (WORD)(pid->fMinPID); pid->fSumError = fsError; return (WORD)fRet; } Остается добавить инициализацию и ... фсе, можно использовать Конкретный пример: Код void FlowRatePID(void) { WORD U_reg; // вычисление нижней и верхней границы переменной регулирования PidDataFR.fMinPID = DELTA_LOWLIM + K_LOWLIM * fPin; PidDataFR.fMaxPID = DELTA_HIGHLIM + K_HIGHLIM * fPin; // вычисление коеффициентов Kp, Ki, Kd PidDataFR.fKp = fKpFR; PidDataFR.fKi = fKiFR; PidDataFR.fKd = fKdFR; // регулирование U_reg = ContrPID(fSetFlowRate, fFlowRate, &PidDataFR); setPWM_pr(U_reg); } Куда в реальной жизни может убежать интегральный терм, если он во флоуте? Или в дабле? Это в целом виде он может переполнить 16-битную разрядную сетку (AN221). PS. Пример реальный, но писался очень давно для регулирования скорости расхода газа (Flow Rate) регулятором на ARM по мотивам AN221. Тонкости уже подзабылись. PPS. "Для ARM" это я, конечно, говорю условно. Ничто не мешает его и на AVR запустить. Но вот что-то не много я знаю людей, которые на AVR свободно флоутами и даблами ворочают. Все боятся (и правильно!), что производительности не хватит...
|
|
|
|
|
Jul 20 2008, 17:43
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(Dir @ Jul 20 2008, 20:55)  Куда в реальной жизни может убежать интегральный терм, если он во флоуте? Или в дабле? Это в целом виде он может переполнить 16-битную разрядную сетку (AN221). PS. Пример реальный, но писался очень давно для регулирования скорости расхода газа (Flow Rate) регулятором на ARM по мотивам AN221. Тонкости уже подзабылись. Уважаемые господа! Я, лично, а может не только я... думаю, что с какой точностью и с какой разрядностью ни считай, интегральная часть не должна расти больше, чем нужно. иными словами, пока ошибка больше некоторой, должен работать пропорциональный и дифференциальный члены... (во время переходного процесса). Надо учитывать реальности объекта регулирования. При изменении задающего параметра его скорость нужно ограничивать или не трогать интегральный член... Тогда зашкала не будет. Правильный алгоритм и в целых числах будет нормально работать, переход на плавующую арифметику ничего не улучшит, а только иллюзию создаст.
|
|
|
|
|
Jul 20 2008, 18:01
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Tanya @ Jul 20 2008, 20:43)  интегральная часть не должна расти больше, чем нужно. иными словами, пока ошибка больше некоторой, должен работать пропорциональный и дифференциальный члены... +1000  Люди,ау! Добавьте признак, что если имеется ограничение по выходу, то считаем интегральный терм. Для уверенности лучше микрочиповские аппликухи перечитать, раз на атмеловских такаядеталь проскочила.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|