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

SergDoc

Картинку первую покажу, только что домучал 😃

mahowik:

А сорсы под какую среду?

Кеил

mahowik

Серега, так когда мы будем у тебя уже плату покупать? ))
либо если она опен сорс, то создай проект под GPL или как там принято…

rual
mahowik:

А сорсы под какую среду? Coocox гад не саппортит ф3, а только ф4…

кейл 4,60, размер кода войдёт в бесплатныю версию. Файл проекта там же, только поправить нужно размещение библиотек, )) ну и скачать их с оф.сайта.
Кста, Александр, покажи скрины с идикатора, хочу посмотреть какой вектор кажет магнитометр.

mahowik:

вот нашел… можно под eclipse настроить www.engineering-diy.blogspot....e-openocd.html

Да и ещё на СТшном сайте есть дока по настройке среды под кейл, эклипс и пр., Квик Стартед вроде…

зы: приложил расписание выводов для своего проекта под Ф3.
СПИ1-дус;и2ц1-аксель и маг;ТИМ2/3-ппм;ТИМ1/4-шим; УСАРТ1-терминал/телеметрия; СПИ2/И2Ц2/УСАРТ2/3-пока свободны.

RusINS1_0F3D.rar

SergDoc

Я чёт тут подумал, для тех кто в теме - если вместо надписи “Логотип?” невзначай впихнуть M25P16 (там SPI разъём рядом и места хватает) что получится? Правильно порт Рево, ну почти, входы выходы не совпадают (их больше и другие таймеры) ну и естественно I2C и SPI другие. Но как говорится “Она конечно не Венера, но что-то венерическое в ней есть” (С) 😃 Думаю впихну на всякий случай - ну вот, показал картинку - переделать захотелось 😃 а ещё там не видно - под магнитометром EEprom-ка стоит, так что девайс становится довольно универсальным - можно много чего портировать 😃

Да, Вопрос - в какую религию обращать? MultiWii пробовал, CC - тоже летал… конечно субъективное мнение, но Wii понравился больше: код более понятен (ну не программер я) и танцев с бубном и I2C не было, но ведь кругом ещё столько опенсорсных вариантов…

SergDoc

В общем на обеде флешка влезла 😃
Вечером наконец-то начну верхнюю плату 😃

rual

Вот и моя Ф3 полетела:

Ролик короткий для удобства выкладывания в тубу. Вариант ПО ещё очень сырой и не полный, портирован только только лётный алгоритм и ИНС, по мере переноса менял структуру кода, посему есть нестыковчки в процессах подготки к пуску (почему-то прерывается калибровка ДУС). Вобщем работы ещё много, но хотелось похвастаться:) Как только допилю старт и терминал с сохранением настроек выложу хекс.

mahowik
rual:

Александр, покажи скрины с идикатора, хочу посмотреть какой вектор кажет магнитометр.

на вых-х сделаю… а то вчера дрюкался со стабилизацией предсказателя высоты… таки стабилизировал его гада! 😃

SergDoc:

Да, Вопрос - в какую религию обращать? MultiWii пробовал, CC - тоже летал… конечно субъективное мнение, но Wii понравился больше: код более понятен (ну не программер я) и танцев с бубном и I2C не было, но ведь кругом ещё столько опенсорсных вариантов…

посмотри mwc-ng от ziss_dm у него там правильная архитектура заложена… кросплатформенность avr/arm, tasks management with fixed time loop наскока помню…
code.google.com/p/mwc-ng/

SergDoc

Примерка:
примека принесла две новости

  1. Всё сошлось - можно плату изготавливать:)
  2. Барометр с гудлака оказался паяный 😦 (до этого времени не распаковывал)

rual
SergDoc:

Всё сошлось - можно плату изготавливать

Красиво. Какой софт портировать будешь? Когда ждать первый полет?

SergDoc:

Барометр с гудлака оказался паяный (до этого времени не распаковывал)

Интересно, он не в заводской упаковке? Мож предпродажная проверка?

SergDoc

Наверно Мультипилот - он в VET6 влезет, на барометре пластик родной но был заклеен скотчем - перевернул - следы флюса и припой на лапах, если с какой дефектной платы сняли - куда ни шло, а если бракованный сам - плохо…

mahowik
rual:

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

отлично компас отрабатывает! никуда не скачет при наклонах… и это без калибровки? точненькА юг север запад восток показывает!
я так понимаю у тебя автокалибровка компаса сделана? т.к. на команду “c” по идее только гира и аксель калибруется…

только один баг странный, иногда гуй подвисает на 1-3 сек, потом оклемается и дальше пашет…

rual

Ты получается ближе меня к “магнитному пупу” Земли, судя по вектору )))

mahowik:

отлично компас отрабатывает! никуда не скачет при наклонах… и это без калибровки?

Да, это без калибровки. Особо не вижу в этом смысла, по кругу расхождение в максимумах единицы градусов.

mahowik:

я так понимаю у тебя автокалибровка компаса сделана? т.к. на команду “c” по идее только гира и аксель калибруется…

нет, автокалибровки нет. Пробовал делать, но мне не понравилась, т.к. случайные выбросы смещают центры и масштаб осей. Клибровку компаса надо делать в услових близким к идельным, но как писал выше смысла не вижу… По команде “с” делается клибровка ДУС в части постоянных дрейфа осей, калибровка акселя тут не правильная (это не страшно если оси пропорциональны и отцентрованы), выполняется только замер средней магнитуды вектора G. Нужна была для экспериментов с измерением акселем линейных перемещений.

mahowik:

только один баг странный, иногда гуй подвисает на 1-3 сек, потом оклемается и дальше пашет…

Проблема в функциях millis() и micros(), надо заменить их на это hw_config.c

__IO uint16_t Sys_time_ms;
__IO uint8_t SysTime_256;
uint16_t millis(void)
{
 Sys_time_ms = (((uint32_t)~SysTick->VAL>>16)&0x0ff)|((uint16_t)SysTime_256)<<8;
 return Sys_time_ms;
}

hw_config.h

#define SysTick_Reload (uint32_t)0x00ffffff
#define micros() ((uint16_t)~SysTick->VAL>>3)
extern __IO uint16_t Sys_time_ms;
extern __IO uint8_t SysTime_256;
uint16_t millis(void);

stm32f30x_it.c

void SysTick_Handler(void)
{
 if (inLoop){
  /* àâàðèéíûé çàïðîñ ÄÓÑà */
  if (GPIO_ReadInputDataBit(L3GD20_SPI_INT2_GPIO_PORT,L3GD20_SPI_INT2_PIN)==Bit_SET)
   if(EXTI_GetITStatus(L3GD20_SPI_INT2_EXTI_LINE)==RESET)
    if (cntDUSRdy--==0){
       cntDUSRdy=5;
       DUS_Zapros();
    }
  /* àâàðèéíûé çàïðîñ àêñåëÿ */
  if (GPIO_ReadInputDataBit(LSM303DLHC_I2C_INT1_GPIO_PORT,LSM303DLHC_I2C_INT1_PIN)==Bit_SET)
   if(EXTI_GetITStatus(LSM303DLHC_I2C_INT1_EXTI_LINE)==RESET)
    if (cntAccRdy--==0){
     cntAccRdy=20;
     Acc_Zapros();
    }
 }
 /* ñèñòåìíîå âðåìÿ */
 SysTime_256 ++;
 Sys_time_ms = (((uint32_t)~SysTick->VAL>>16)&0xff)|((uint16_t)SysTime_256)<<8;
}
Sir_Alex

Кто нибудь знает, какие есть критерии при выборе частоты LPF фильтра гиры и акселя?
Я пока только одно упоминание увидел более-менее вразумительное, в исходниках ArduCopter’a: “Частота LPF выбирается в два раза меньше SAMPLE Rate”

rual
Sir_Alex:

“Частота LPF выбирается в два раза меньше SAMPLE Rate”

Это классика, следствие из теоремы Котельникова.
Вполне справедливо, нужно чтобы отсчёты не “пролетели” мимо обработки.

Sir_Alex
rual:

Это классика, следствие из теоремы Котельникова. Вполне справедливо, нужно чтобы отсчёты не “пролетели” мимо обработки.

Как теорему Котельникова применить к обработке Аналогово сигнала я знаю.
Sample Rate тут по всей видимости никаким боком (Это частота на которой обновляются регистры с выходными данными). Потому что гира на самом деле оцифровывается с частотой 1KHz или 8KHz (для MPU6000). Если я правильно понимаю, LPF отсеивает вибрации ниже определенной частоты. Вопрос только в том, какие частоты в виде помех обычно бывают на коптере. Отсюда видимо и надо плясать при выборе LPF (и возможно HPF).

Надо попробовать написать тулзу, для вывода графика FFT и подбора значений фильтра по нему. Причем при работающих моторах…

HikeR
Sir_Alex:

при работающих моторах…

моторы обычно не вращаются с одной и той же скоростью, особенно когда их несколько ;)

а где вы видели озвученный коментарий про частоту, не ткнете?

Sir_Alex
HikeR:

а где вы видели озвученный коментарий про частоту, не ткнете?

AP_InertialSensor_MPU6000.cpp:

    // sample rate and filtering
    // to minimise the effects of aliasing we choose a filter
    // that is less than half of the sample rate
HikeR:

моторы обычно не вращаются с одной и той же скоростью, особенно когда их несколько 😉

Логично, поэтому надо строить график при Throttle от нуля до 100%.