Справочници, схемотехника, теория > Програмиране на микроконтролери, програматори, цифрови проекти

GPS-автопилот - алгоритъм

<< < (30/35) > >>

valex:
Мисля, че има самoнастройващ се PID.

juliang:

--- Цитат на: valex в Април 16, 2020, 03:30:56 pm ---Мисля, че има самoнастройващ се PID.

--- Край на цитат ---
1. Няма да мустигне паметта за толкоз код
2. Самия процес на адаптация на ПИД-а изисква системата да работи, т.е. да е в движение


Теория на ПИД-а:

Имаш входна стойност (примерно в диапазона 0-1000)
Имаш желана стойност (0-1000)
Имаш изходна стойност (0-1000)

Съвсем примерно искаш температурата да ти е 200 градуса (или поската на движение да е 200 градуса). Имаш последни 4 измерени данни 150, 180, 200, 210.

Пропорционалния коефициент е отклонението на последното измерване спрямо заданието. Т.е. ще е 200 - 210 = -10.
Интегралния коефициент ще е 200 - ((150+180+200+210) /4) или +15
Диференциалния коефициент ще е (150-210)/4 или -15

Какво казват тези числа:
Пропорционалния казва "вече си прехвърлил заданието, ще трябва да намалиш изходната стойност".
Интегралния казва "да, ама през последните 4 измервания в 3 от случаите си бил под заданието, така че ще трябва да увеличиш изхода, за да достигнеш заданието по-бързо"
Диференциалния казва "скоростта на нарастването ти е голяма, ще трябва да намалиш изхода, за да не прескочиш заданието.

Всеки от тези 3 коефициента се умножава по един свой си множител (Кп, Ки, Кд), който определя колко "важен" е дадения коефцициент. Точно намирането на тези множители е "адаптацията" на контролера, и зависи изключително от инертността на системата която се управлява.

Ако имаш само пропроционален коефициент, то или ще достигаш заданието бавно (малък множител), или ще го прескачаш  и системата ще осцилира (в твоя случай ще се движи на зиг-заг известно време)(голям множител).

Добавянето на интегрален коефициент помага при голямо отклонение от заданието, т.е. системата много по-бързо ще се стреми към заданието, а също така и ще хваща дребни отклонения при малък пропорционален коефицинет. Също така и ще елиминира грешки в измерването, породени от самия уред, ще действа като един вид филтър. Огромния недостатък е, че при голям множител осцилацията неконтролируемо се увеличава.

Диференцилания коефициент работи в общия случай наобратно на предните два. Когато пропроционалния и интегралния крещят "ДАВАЙ, ДАВЙ НАГОРЕ!!!", то диференциалния се влияе от скоростта на нарастване а не от абсолютна стойност на отклонението, и се явява спирачка на стремежите да се достигне бързо (и вследствие на това да се прескочи неконтролируемо) заданието.

Ако и трите множителя в примера са 1, то на изхода ще получиш 200 + (-10 +15 -15) или 190. Т.е. системата ще усети че е прекалила, че тенденцията е към още по-голямо о*иране и ще започне да се връща.

EDM electronics:
juliang, много добре разбираемо го обясни.  :)
Като ти гледам сметките, кода не е толкова труден. Ще намеря обаче някоя готова библиотека.
В момента съм вързал една малка серво-машинка, но съм и сложил закъснение и плавно набиране, да е инертна и да се движи бавно, защото реално двигателя /сервото/ ми ще трябва да се върти бавно. Ориентировъчно теглото на целия мотор с батерията ще е 6-7 кг. и резките движения на тия килограми ще разрушат бързо редуктора.

Мога да настроя грубо тоя ПИД, но няма де е в реални условия, а там нещата ще са други. Затова ще е достатъчно само да направя работещ код и да изведа 3-те константи за ръчно програмиране, чрез дисплея. Окончателната настройка на ПИД-а ще стане в реални условия - на вода, а те в домашни условия няма как да се случат с пробната малка серво-машинка.

juliang:
Тук можеш да видиш как работят заедно 2 ПИД-а - един заводски и един който съм го писал аз:
https://www.youtube.com/watch?v=D37f_ZUM8Kg

Вдясно малкия екран е един KS40, който има задание да държи налягане 3.2 бара в един парен котел. В зависимост от промяната на налягането увеличава или намалява мощността на горелката (зеленото число на втория ред - 0-100%).
Вляво е един данфоски контролер, който пък мери налягането на горивото (биогаз) което постъпва в горелката и въз основа на това управлява едновременно 2 газодувки, които доставят газта от балона до горелката. Задачата му е да поддържа 150 милибара независимо от това колко консумира горелката (не казвайте на никой, щото по закон нямам право да дигам налягането над 100 милибара :) ).

Алгоритъма тук е допълнително усложнен от това, че при ниска мощност на горелката дебита на газодувките е по-голям от необходимото (газодувката не може да се сваля на по-малко от 40% от макс. си мощност), и се налага по някое време вместо две газодувки да остава да работи само една. И за да ми е още по-весело, двете газодувки са различни, т.е. имат различен дебит ... :)

Та... ПИД-а ще ти е необходим ако имаш голяма инертност. Инертността няма да можеш да я компенсираш с бавно движение на мотора - ще почне да осцилира. Аз имах същия проблем с тези газодувки - тръбопровода е почти 200 метра, и от момента в който газодувката се включи до момента в който налягането на газта при горелката почне да се качва закъснението е към 5 секунди... А аз нямам резервен обем горе при горелката, който да задържи налягането 5 секунди, и се налага про най-малкия намек за прромяна на налягането контролера да реагира изпреварващо. Тук се наложи да пипна кода на контролера и да уможа диференциалния коефициент още веднъж по десет, защото множител 100 не ми беше достатъчен ...  при множител на пропорционалния от порядъка на 4 или 5 диференциалния работи с множител от порядъка на 500 :)

А, да ... интегралния и диференциалния коефициент освен множител имат и "дължина на опашката", или време... тоест въз основа на колко измервания назад да правя сметките. Опитно установих че ми трябват данни за последните 10-тина секунди, но понякога се налага да се следят данни в рамките на 5-10 минути - примерно когато се управлява отоплителна инсталация в някой хотел, където като загрееш водата и я пратиш по тръбите тя се връща след 5 минути и чак тогава можеш да разбереш какво се случва - дали ти трябва още топло или топлото е повече от нужното... :)

VITAN:
++1  :)

Навигация

[0] Списък на темите

[#] Следваща страница

[*] Предходна страница

Премини на пълна версия