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

SergDoc

Компилятор начал подавать признаки жизни, но что-то не так 😦

**** Build of configuration Default for project AeroQuad ****

make all

Compiling C: AeroQuad32/MapleCompatibility/flash_stm32.c

Compiling C++: AeroQuad32/AeroQuadMain.cpp

Compiling C++: AeroQuad32/MapleCompatibility/EEPROM.cpp

Compiling C++: Libraries/AQ_I2C/Device_I2C.cpp

Compiling C++: Libraries/AQ_Math/AQMath.cpp

Creating library: Libmaple/libmaple/libmaple.a
arm-none-eabi-ar rcs Libmaple/libmaple/libmaple.a objSTM32/dummy/./AeroQuad32/MapleCompatibility/flash_stm32.o objSTM32/dummy/./AeroQuad32/AeroQuadMain.o objSTM32/dummy/./AeroQuad32/MapleCompatibility/EEPROM.o objSTM32/dummy/./Libraries/AQ_I2C/Device_I2C.o objSTM32/dummy/./Libraries/AQ_Math/AQMath.o

Linking: objSTM32/dummy/./AeroQuad32/AeroQuadMain.elf
arm-none-eabi-gcc: ./Libmaple/libmaple/libmaple/syscalls.o: No such file or directory
rm Libmaple/libmaple/libmaple.a
make: *** [objSTM32/dummy/./AeroQuad32/AeroQuadMain.elf] Error 1

**** Build Finished ****
Razek

попробуй либы компильнуть отдельно make -C Libmaple/libmaple library компилится?

SergDoc

сейчас не могу
./Libmaple/libmaple/libmaple/syscalls.с - фаил есть

может здесь Creating library: Libmaple/libmaple/libmaple.a ещё каталог libmaple нужен?
так Libmaple/libmaple/libmaple/libmaple.a ?

к этим
Device_I2C.cpp из ./Libmaple/libmaple/libmaple/ библиотеки цепляются…

Razek
SergDoc:

может здесь Creating library: Libmaple/libmaple/libmaple.a ещё каталог libmaple нужен?

Не нужен

SergDoc:

Device_I2C.cpp из ./Libmaple/libmaple/libmaple/ библиотеки цепляются…

По-моему для компиляции Device_i2C из ./Libmaple/libmaple/libmaple ничего не линкуется

SergDoc

может и не к нему, вечером точно посмотрю…

Alexsis1109
Geniok:

Чтение датчиков занимает кучу времени. Делать это в прерывании - не самая хорошая идея, имхо.

А вы с какой частотой опрашиваете ШИМ с приемника? И с какой гиро и аксель?

Geniok
Alexsis1109:

А вы с какой частотой опрашиваете ШИМ с приемника? И с какой гиро и аксель?

Гиру и аксель с максимальной планирую. Данные забирать на обработку по готовности. Пока ни с какой. Но так то каждый цикл желательно. Например, если в МультиВий время цикла 3000 мкс, то получается частота 33Гц примерно.

А ШИМ поступает с приемника с частотой 50Гц. Обрабатывать планирую не чаще 5 Гц. Хотя тоже надо пробовать, как будет сказываться на управлении.

Sir_Alex
Geniok:

то получается частота 33Гц примерно.

Не 33, а 333Гц

Alexsis1109
Geniok:

А ШИМ поступает с приемника с частотой 50Гц. Обрабатывать планирую не чаще 5 Гц. Хотя тоже надо пробовать, как будет сказываться на управлении.

я посчитал, с какой скоростью я дергаю стики на 3D самоле, получилось примерно полный размах стика, (от 1мс до 2 мс) проходит где-то за 0,2с. т.е. получается я дергаю стиком с частотой 5Гц в пике. т.е. если опрашивать приемник реже 5 раз в секунду, то можно просто не успеть за стиком. Кароче, сейчас у меня сделано именно опрос приемника с частотой 5Гц, каждые 0.2с, и это очень, очень плохо. машинка вообще не успевает отработать все движения стика.

я думаю надо с максимальной, с частотой самого приемника шим мерить и выдавать наружу. Кто как думает? у кого как сделано?

Geniok
Sir_Alex:

Не 33, а 333Гц

Да, все верно, с телефона писал, пропустил цифру.

Alexsis1109:

я посчитал, с какой скоростью я дергаю стики на 3D самоле, получилось примерно полный размах стика, (от 1мс до 2 мс) проходит где-то за 0,2с. т.е. получается я дергаю стиком с частотой 5Гц в пике. т.е. если опрашивать приемник реже 5 раз в секунду, то можно просто не успеть за стиком. Кароче, сейчас у меня сделано именно опрос приемника с частотой 5Гц, каждые 0.2с, и это очень, очень плохо. машинка вообще не успевает отработать все движения стика.

я думаю надо с максимальной, с частотой самого приемника шим мерить и выдавать наружу. Кто как думает? у кого как сделано?

Вы на самолет воздействуете напрямую, или через систему стабилизации ?

Alexsis1109
Geniok:

Вы на самолет воздействуете напрямую, или через систему стабилизации ?

напрямую. а какая разница? плата стабилизации это как бы проходная плата, которая при необходимости может самостоятельно вносить коррективы на рули управления. а когда такой необходимости нет, она должна полностью повторять сигнал с приемника, в том числе и скорость его изменения

SergDoc

RUNTIMELIB = $(LIB_MAPLE_HOME)/build/libmaple.a не создаётся библиотека - где копать?
опля, в libmaple ешё один проект который и создаёт то, что надо - он компилится, дальше опять танцы с бубном…

rual

Для Geniok и Alexsis1109: Коллеги, я что-то пропустил ) АВР я рассматривать не буду, ибо там нужно действительно делать много приседаний для сохранения нормального темпа работы всей системы.
Если берём СТМ32, то о чём собсно речь?
Считаю свою систему:
Частоты
ДУС - 380Гц
Аксель и магнитометр - 50Гц ,
ППМ (разделённый по каналам, т.е. 4 канальный захват ШИМ) примерно 60 Гц,
всё остальное имеет приорететы ниже и выполняется по освобождению.
Итак: для 103го СТМа (без аппаратной плавучки):

  1. Петля ДУС, выполняется: чтение ДУС, обновление текущего положения в пространстве, вычисление ошибки положения относительно заданного
    период ДУС 1/380 = 2.6 мсек, максмальное время обсчёта ~0.3 мсек: заполнение машвремени цикле ~11%.
  2. Петля акселя, выполняется: чтение акселя, обновление ошибки для коррекции текущего положения по ДУСу, интегрирование линейной скорости по акселю, запуск чтения магнитометра.
    период акселя 1/50 = 20 мсек, макс.время обсчёта ~0.35 мсек, заполнение машвремени в цикле ~2%.
  3. Петля ППМ, выполняется изменение настройки таймера на отлов фронта\спада, вычисление длины импульса ППМ, вычисление задающего кватерниона. Период 1/60 = 17мсек, макс время обсчёта 0.12 мсек, заполнение ~1.4%.
    В наихудшем случае, если все эти события произойдут одновременно и будут обработаны сверху вниз в порядке приоритета, то получим 0.3+0.35+0.12 = 0.77 мсек или ~30% от минимального цикла системы (периода ДУС)!
    И при этом заведомо понятно, что в следующем периоде ДУС других событий не будет (кроме собственно обработки ДУС). А для Ф3 на той же частоте время выполнения делим примерно на 10. Дык стоит париться всё это высчитывая?
    Главное не тупить в пустых циклах в ожидании событий, у СТМа всё для этого есть.
    И ещё один момент, проценты показвают загрузку до потолка, но потолок это не 100% , а 200 😈 Вот почему, то что мы не уложились в мин цикл системы (100%) это конечно плохо (сбивает регулярость системы), но вобщем ничего фатального, главное чтоб обработчик собственно ДУСа успел отработать, а недоработавший обработчик с низким приоритетом(например акселя) он прирвёт и ещё раз обновит данные о положении, после чего аксель досчитается и отдаст проц обработчику ППМ. Но это всё будет работать если такие ситуации в системе достаточно редки (например если приемник дал помеху с более высокой частотой), т.к. недообработанным прерываниям необходимо досчитаться в течении следующих периодов, до наступления собствеенного прерывающего события.
Alexsis1109
rual:

АВР я рассматривать не буду

я как раз сейчас делаю на атмеге все это

rual:

ДУС - 380Гц

прошу прощения за тупость. расшифруйте ДУС?

rual:
  1. Петля ДУС, выполняется: чтение ДУС, обновление текущего положения в пространстве, вычисление ошибки положения относительно заданного

судя по этому алгоритму, и я использую такой же, чтение ППМ и акселя с гиро должно выполняться в одном цикле. чтение одного без другого (имею ввиду с разной частотой) не имеет смысла

Geniok
Alexsis1109:

напрямую. а какая разница? плата стабилизации это как бы проходная плата, которая при необходимости может самостоятельно вносить коррективы на рули управления. а когда такой необходимости нет, она должна полностью повторять сигнал с приемника, в том числе и скорость его изменения

В том то и дело что нет…
Сигнал всегда проходит через систему стабилизации. Потому настройка ПИДов будет влиять на то, насколько резок будет отклик на управление.

Понятно, что при прямом воздействии на органы управления, чем чаще читаем показания приемника - тем быстрее отклик.

Alexsis1109:

прошу прощения за тупость. расшифруйте ДУС?

Датчик угловых скоростей. Гироскоп по-нашему.

rual:

Для Geniok и Alexsis1109: Коллеги, я что-то пропустил ) АВР я рассматривать не буду, ибо там нужно действительно делать много приседаний для сохранения нормального темпа работы всей системы.
Если берём СТМ32, то о чём собсно речь?

Да мы скорее просто ведем неспешную беседу! 😃
Тут нет цели что-то друг другу доказать, просто у меня есть мнение, что считывать положение стиков с частотой больше 10Гц смысла не имеет. Хотя конечно данное утверждение на практике еще не проверено.

SirAlex меня поправит, если что, но по-моему в пирате положение стиков читается не каждый цикл.

rual
Alexsis1109:

прошу прощения за тупость. расшифруйте ДУС?

ДУС- датчик угловых скоростей. Гироскоп это вроде как прибор указывающий абсолютное отклонение от установленного положения.

Alexsis1109:

чтение одного без другого (имею ввиду с разной частотой) не имеет смысла

Отчегож? Вы ведь систему стабилизации строите, и на неё не только Р/У воздействует, но и текущие параметры полёта ЛА. Задавать полжение Вы можете достаточно нерасторопно, но система должна компенсировать все отклонения от заданого гораздо быстрей. Иначе она вовсе не нужна, коли Ваши руки быстрее реагируют на все возмущения. Для примера запустите коптер на одном лишь приёмнике, без мозгов и вертолётных гироскопов.

Alexsis1109
Geniok:

что считывать положение стиков с частотой больше 10Гц смысла не имеет. Хотя конечно данное утверждение на практике еще не проверено.

это все на практике нужно проверять, но 5Гц точно никак. мне кажется логичным чтобы плата контроллера не тормазила работу машинки как бы быстро я не дергал стик. думаю после 5Гц я переду сразу на 25Гц

SergDoc

Йоо-хооу собрал!!! 😃
в общих чертах: немного поизголялся над makefile, далее в папке libmaple - есть ещё один проект под одноимённым названием - надо собрать /build/libmaple.a, потом отыскать в закромах мапловской ide файлик ld.exe и положить в свои патчи (директорию с компилятором), далее залезть сюда github.com/bubulindo/libmaple_F4/tree/…/ld забрать две библиотеки libcs3_stm32_high_density.a и libcs4_stm32_high_density.a ну или скомпилировать их так же как и с libmaple лежат AeroQuad\Libmaple\libmaple\support\ld\libcs3_stm32_src\ и AeroQuad\Libmaple\libmaple\support\ld\libcs4_stm32_src\ нифига себе квестик😵
ну и ладно теперь у меня живёт AeroQad32 под Eclipse 😃

Sir_Alex
Geniok:

SirAlex меня поправит, если что, но по-моему в пирате положение стиков читается не каждый цикл.

100Hz, правда я в последней версии снизил до 50Hz - но это просто попытка найти проблему в PPM декодере.

Geniok
Alexsis1109:

это все на практике нужно проверять, но 5Гц точно никак. мне кажется логичным чтобы плата контроллера не тормазила работу машинки как бы быстро я не дергал стик. думаю после 5Гц я переду сразу на 25Гц

Это практически невозможно. Плата в любом случае будет затормаживать реакцию, более или менее. Если говорить конечно про устойчивый полет, а не попытки поймать стиками равновестное положение. Тут хоть 100Гц поставь! Или отключать большинство датчиков и рулить ручками…

mahowik

Кому интересно, нашел демо проектик для STM32F3Discovery под CoIDE (CooCox). Попробовал, собралось! Мой первый билд под stm32 😃
Правда заливал через STM32 ST-LINK Utility, т.к. похоже flash driver-а нет соот-го для STM32F30x под CooCox (Error: Flash driver function execute timeout)

Что нужно чтобы собрать проект:

  1. качаем/устанавливаем CooCox CoIDE V1.7.0 www.coocox.org/Index.html
  2. качаем/устанавливаем gcc под ARM launchpad.net/gcc-arm-embedded/+download
  3. берем Demo Project for CoIDE www.coocox.org/forum/topic.php?id=2219
  4. компилим, находим *.hex или *.bin и заливаем через STM32 ST-LINK Utility

радуемся! 😃