Создание собственной системы стабилизации

alekseii

Мне нужно для avr 8 битного контроллера, я любитель, пока немного разобрался именно в этой программе. По 8 битному таймеру в подпрограмме прерывания (совпадению или переполнению), делал инкремент переменной (вход_1, например), а в основной программе отслеживаем входные фронты и соответственно разрешаем в программе прерывания увеличивать ту или иную переменную (вход_1, …,вход_6), так упрощённо. Делал два флага (один для отслеживания передних фронтов, другой об окончании данного сигнала и его же использовал для подсчёта и выхода из “отсчитывающего” цикла). Делал в разных вариациях но устойчивого считывания так и не получил.
Для одного сигнала (или нескольких но у которых передние фронты не смещены относительно друг друга) всё просто:
цыкл while (ждём на входе 0 (нуль)) {}; // отслеживаем начало переднего фронта
цыкл while (ждём на входе 1 (единица)){}; сигнал пришёл
таймер старт {};
цыкл while (ждём на входе 0 (нуль)) {}; // сигнал окончился
таймер стоп {};
имеем значение в переменной вход_1.
А для нескольких “смещёных” сигналов ни как не получается.

SergDoc

в мультивие например:

**************************************************************************************/
/***************               Standard RX Pins reading            ********************/
/**************************************************************************************/
#if defined(STANDARD_RX)

#if defined(FAILSAFE) && !defined(PROMICRO)
   // predefined PC pin block (thanks to lianj)  - Version with failsafe
  #define RX_PIN_CHECK(pin_pos, rc_value_pos)                        \
    if (mask & PCInt_RX_Pins[pin_pos]) {                             \
      if (!(pin & PCInt_RX_Pins[pin_pos])) {                         \
        dTime = cTime-edgeTime[pin_pos];                             \
        if (900<dTime && dTime<2200) {                               \
          rcValue[rc_value_pos] = dTime;                             \
          if((rc_value_pos==THROTTLEPIN || rc_value_pos==YAWPIN ||   \
              rc_value_pos==PITCHPIN || rc_value_pos==ROLLPIN)       \
              && dTime>FAILSAFE_DETECT_TRESHOLD)                     \
                GoodPulses |= (1<<rc_value_pos);                     \
        }                                                            \
      } else edgeTime[pin_pos] = cTime;                              \
    }
#else
   // predefined PC pin block (thanks to lianj)  - Version without failsafe
  #define RX_PIN_CHECK(pin_pos, rc_value_pos)                        \
    if (mask & PCInt_RX_Pins[pin_pos]) {                             \
      if (!(pin & PCInt_RX_Pins[pin_pos])) {                         \
        dTime = cTime-edgeTime[pin_pos];                             \
        if (900<dTime && dTime<2200) {                               \
          rcValue[rc_value_pos] = dTime;                             \
        }                                                            \
      } else edgeTime[pin_pos] = cTime;                              \
    }
#endif

  // port change Interrupt
  ISR(RX_PC_INTERRUPT) { //this ISR is common to every receiver channel, it is call everytime a change state occurs on a RX input pin
    uint8_t mask;
    uint8_t pin;
    uint16_t cTime,dTime;
    static uint16_t edgeTime[8];
    static uint8_t PCintLast;
  #if defined(FAILSAFE) && !defined(PROMICRO)
    static uint8_t GoodPulses;
  #endif

    pin = RX_PCINT_PIN_PORT; // RX_PCINT_PIN_PORT indicates the state of each PIN for the arduino port dealing with Ports digital pins

    mask = pin ^ PCintLast;   // doing a ^ between the current interruption and the last one indicates wich pin changed
    cTime = micros();         // micros() return a uint32_t, but it is not usefull to keep the whole bits => we keep only 16 bits
    sei();                    // re enable other interrupts at this point, the rest of this interrupt is not so time critical and can be interrupted safely
    PCintLast = pin;          // we memorize the current state of all PINs [D0-D7]

    #if (PCINT_PIN_COUNT > 0)
      RX_PIN_CHECK(0,2);
    #endif
    #if (PCINT_PIN_COUNT > 1)
      RX_PIN_CHECK(1,4);
    #endif
    #if (PCINT_PIN_COUNT > 2)
      RX_PIN_CHECK(2,5);
    #endif
    #if (PCINT_PIN_COUNT > 3)
      RX_PIN_CHECK(3,6);
    #endif
    #if (PCINT_PIN_COUNT > 4)
      RX_PIN_CHECK(4,7);
    #endif
    #if (PCINT_PIN_COUNT > 5)
      RX_PIN_CHECK(5,0);
    #endif
    #if (PCINT_PIN_COUNT > 6)
      RX_PIN_CHECK(6,1);
    #endif
    #if (PCINT_PIN_COUNT > 7)
      RX_PIN_CHECK(7,3);
    #endif

    #if defined(FAILSAFE) && !defined(PROMICRO)
      if (GoodPulses==(1<<THROTTLEPIN)+(1<<YAWPIN)+(1<<ROLLPIN)+(1<<PITCHPIN)) {  // If all main four chanells have good pulses, clear FailSafe counter
        GoodPulses = 0;
        if(failsafeCnt > 20) failsafeCnt -= 20; else failsafeCnt = 0;
      }
    #endif
  }

code.google.com/p/multiwii/source/…/RX.cpp

alekseii

Сергей спасибо !
Так сразу не понятно, буду разбираться 😃

rual
strizhmax:

7й - это какой, никак не могу придумать? Оплётка?

Наверное выход готовности, хотя я думаю можно обойтиясь 6ю, ибо сам SPI может генерить прерывания по приёму байта или слова.

SergDoc

Как-то обсуждалось hom.hackpad.com/SmartIMU-E9zzbSI7QyK
так вскользь, так вот там подпаяться только, 4 выхода шим есть, думаю и поймать чем сигнал с приёмыша есть… мелко мелко готово )))

rual:

ибо сам SPI может генерить прерывания по приёму байта или слова.

может конечно, но если использовать DMA мы можем его и не дождаться, раз, потом чёт я плохо представляю как устройство стоящее слейвом может по своей прихоти что-то пихнуть?

rual
SergDoc:

может конечно, но если использовать DMA мы можем его и не дождаться,

Где и как его использовать? При чтении данных из ИМУ? Вообще надо чтобы был полноценный межпроцессорный обмен.

SergDoc:

чёт я плохо представляю как устройство стоящее слейвом может по своей прихоти что-то пихнуть?

Я предполагал что голова у датчиков, а многоногий проц ведомый. К тому ж пиксавом РТОСе есть вроде возможность использовать виртуальные порты? И получить по сути ПХ4, что актуально для порта Ардупилота.

SergDoc

если “голова” у датчиков, то как следствие нужен мощный проц, тогда отпадает всякое рвение использовать многоногий ведомый - легче на одном всё…

rual
SergDoc:

как следствие нужен мощный проц, тогда отпадает всякое рвение использовать многоногий ведомый - легче на одном всё…

Что касается больших ЛА - это да. Но я так понимаю, что мотивация “разделить мозги” идёт не от недостатка мощи, а от желания улучшить компоновку для маленьких моделей. Для больших и средних та же Ф4БЫ вполне оптимальна по функционалу и размерам, тот же visasta делает одноплатные мозги на многоногом проце. Тут же смысл раздела в том, чтобы разнести чувствительные датчики подальше от вибрации и больших токов при небольших размерах ЛА.

Ну а комплексные мозги для мошкары лучше чем AutoQuad M4 я не видел…

oleg70
rual:

чтобы разнести чувствительные датчики подальше от вибрации

Именно это заставило меня сделать платку с датчиками отдельно (наиболее важно для коптеров)…
шесть тонких/гибких проводков связи позволяют сделать наилучшую виброизоляцию.

rual:

и больших токов

тут уже сложнее…, например заметил что львиная доля шумов у MS5611 идет именно от внешних наводок, по хорошему ему вообще нужен отдельный проц. с паузами работы при циклах замеров АЦП (короче схема разростается 😃)
Вообще говоря понял одно - если хочется сделать полетный контроллер с характеристиками выше средних, то простым по схемотехнике он не получится…

Geniok

Кто нибудь разбирался, как устроен auto tune в arducopter?
По большей части интересует теория автоматического подбора коэффициентов.

SergDoc

День рождения F4BY V2XX пролюбили 😦

k0der

а занимался кто разработкой бесколекторного подвеса?

rual
SergDoc:

День рождения F4BY V2XX пролюбили

предлагаю бахнуть!😁 (с) ДМБ

k0der:

а занимался кто разработкой бесколекторного подвеса?

теоретизировал на эту тему 😉 а в чем сбственно вопрос?

k0der
rual:

теоретизировал на эту тему а в чем сбственно вопрос?

имеет ли смысл делать самому? или проще готовый взять? если самому какую ветку лучше выбрать?

rual
k0der:

имеет ли смысл делать самому?

В чем смысл делать самому? Вы хотите сделать прорыв в этой области? Или хотите особую функциональность?

k0der:

или проще готовый взять?

проще

k0der:

если самому какую ветку лучше выбрать?

вроде как ветка AlexMos’a “Независимы интеллектуальный… подвес” начиналась с дискуссий об алгоритмах и методах, но как и везде выродилась в повторяющиеся вопросы пользователей по продукту… Если хотите повторить и разобраться, то туда, если “перевернуть мир”, то создавайте свою. Но в последнем случае надо быть готовым к тому, что вас начнут сильно “клевать” все начиная от “профи” до модераторов.

SergDoc
rual:

предлагаю бахнуть!

Обязательно бахнем - весь мир в труху (С) 😃
весной…

rual
djdron:

Прикольная штука. но ценник антигуманный. Вот бы ктонить дал это в руках покрутить на время?😉

IvanKo:

Народ, может кто знает чего об этом проекте?
wiki.paparazziuav.org/wiki/Main_Page

Платки у них симатишные, размер мелкий, но уже устарели )))

IvanKo
rual:

но уже устарели )))

А почему устарели то?

rual
IvanKo:

А почему устарели то?

Потому что 1 - слабый проц, 2 - старые датчики, 3- подобных контроллеров по приемлемой цене уже вполне хватает (см. CC3D).

ps: п.2 -неправ , датчики нормальные. заменю на малое количество ШИМ/ППМ-выходов.

IvanKo
rual:

Потому что 1 - слабый проц, 2 - старые датчики, 3- подобных контроллеров по приемлемой цене уже вполне хватает (см. CC3D).

ps: п.2 -неправ , датчики нормальные. заменю на малое количество ШИМ/ППМ-выходов.

Незнаю, например у этой платы на борту уже Cortex M4, плюс 11 шим выходов:
wiki.paparazziuav.org/wiki/KroozSD
На нем кстати парень рекорд времени полета установил, я както тут кидал ссылку в долголетах.

А датчики я так понимаю у всех примерно одинаковые.

rual
IvanKo:

Незнаю, например у этой платы на борту уже Cortex M4, плюс 11 шим выходов:

Это другое дело, и “телевизор” на борту. Сколько она стоит?

oleg70
IvanKo:

А датчики я так понимаю у всех примерно одинаковые

Даже если эти датчики “в 5 раз лучше” (что маловероятно), цена действительно убивает…

djdron
rual:

Прикольная штука. но ценник антигуманный. Вот бы ктонить дал это в руках покрутить на время?😉

цена у них конская, хотя датчики обычные, интересно они на столько же хороши сколько стоят. Я бы их тоже в руках покрутил. Надо не полетники делать а такие модули)))