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

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

<< < (32/32)

juliang:
Копирал съм кода от работещ контролер, в който съм правил доста промени.

1. Такъв е синтаксиса на този тип контролери. А и на езика Си, на който се пишат програмите. Struct-а е... как да го кажа ... обект, нещо. Това нещо си носи както променливите, така и логиката. в една програм може да има много "неща", много "обекта". Самия контролер при захранваането последователно извиква функциите Init на всички обекти в прогамата, и после циклично извиква последователно всички Main методи на обектите. Така функционира... не ме питай защо, вероятно щото голяма част от кода се генерира автоматично и е по-лесно.

2. Enable е мой пропуск - трябва да го допиша в логиката. Всеки един "блок", или "обект" трябва да има тази променилва и ако тя е False, това означава че контролера е спрян. Тогава почти всички блокове трябва да спрат да работят, остават само тези които следят сензорите или бутоните, с които контролера да се пусне отново. Не че е грешка, но е признак на недоглждане :) Просто в началото на Main метода трябва да допиша "if !Enable then return;" и блока няма да изпълнява нищо.

3. Да, тази функция се изпълнява еднократно при захранването на контролера.

4. Тук ... исках да се подсигуря. Td и Ti са променливи, които са записани в енергонезависимата памет на контролера -  те се задават от потребителя чрез менюто и се запомянт дори и тока да спре. Не съм сигурен дали програмно мога да правя нещо друго освен да ги прочитам, не знам дали мога да ги ползвам в изчисленията, така че просто копирам стойността им в integralTime и derivativeTime и вече работя с тях.

5. В началото всички елементи на масива са 0. При всяко изпълнение на Main-а аз обхождам масива, като в 99-та клетка слагам стойността на 98-а, в 98-а стойността на 97-а и т.н. т.е. "придвижвам" масива с една клетка надясно. Накрая поставям новата стйност в клетка нула. Малко бавно става, но процесите които управлявам са още по-бавни. Един цикъл на цялата програма - не само контролера, а целия проект - се изпълнва за около 0.15 секунди, което е много-много по-бързо отколкото ми трябва.

6. В масива се съхраняват отклоненията на входа от зададената стойност. Трябват ми за да мога да анализирам "накъде вървят нещата", т.е. колко бързо се променя входа или колко дълго време съм бил под или над исканаат стойност.
Изхода е само един - Output. Тъй като тоя контролер работи изключително тежко с числа с плаваща запетая, работя с цели числа и чак на края ги деля на 10. По-голяма точност не ми трябва - специално тои контролер го ползвам за управление на температури на вода, така че стойностите са от 0 до 100 градуса макс. Изхода на контролера е от 0 до 1000, т.е. имам разделителна способност от 0.1 градуса, което е повече от достатъчно.

Като цяло съм доста спънат от самия контролер и другите блокове в него, които идват от производителя и трябва да спазвам "добрия тон" като се пъхам между тях. Почти всички заводски блокове работят със стойности от 0 до 1000 и е безмислено да работя с отрицателни числа или с числа по-големи от 1000 - ианче ще трябва да ги конветирам в нещо разбираемо за другите блокчета. Дори входовете и изходите ми са мащабирани за стойности от 0 до 1000, което при вх/изх 0-10 волта е 0.01 волт - повече от достатъчно като точност. Помпата с 3 000 об/мин я упрявлявам с точност 3 об/мин, което е безполезно точно, една моторна задвижка с вход 0-10 волта и обхват 0-90 градуса да искам от нея точност 0.1 ъглови градуса положение също е несериозно.

EDM electronics:
Сега разбрах какво правиш, но не всичко. Записваш през определено време изменението на входа САМО в нулевия елемент на масива, като с цикъла преди това местиш данните от предходния елемент в един назад. Така придвижваш записа в нулевия елемент по целия масив с всяко изпълнение на цикъла. Обаче:
Не мога да разбера този запис, мисля, че имаш някаква грешка
for (i = 99; i > 0; i--)
        {
            errors = errors[i - 1]
        }

Мисля, че не можеш така да представиш масива само с името му errors, без скобите и броя на елементи му или пък само един елемент записан вътре в него. Или вместо броя поне променлива, примерно i.

Така както си го записал няма да ти мести стойността, да не би записа да е правилно така:
errors [ i ] = errors[i - 1]


Тук виждам същото при четенето на масива:

for (i = 0; i < integralTime; i++)
      {
         integral = integral + errors * Ki;
      }


Не трябва ли да е така:
integral = integral + errors [ i ] * Ki;


juliang:
Проблема не е в "моя телевизор"... във форума е :)
Като искаш да напишеш нещо наклонено (италик) във форума ползваш следните тагове:

--- Код: ---[i] italic text [/i]

--- Край на кода ---

и ... кат съм пейстнал кода, форума е изял това в скобите ...

Навигация

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

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

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