Создание собственной системы стабилизации
Олег, у тебя в тесте СПИ1,
Мат-перемат…(😃)… Три дня !.. Она зараза такая маленькая, эта единичка…
Все пошло, извиняюсь… (пора перекур сделать с программированием.)
заменил… не помогло…
Мда… Значится что то в коде… Но ты ведь всё равно эти процедуры менять будешь? Меняй, а там посмотришь
Три дня !
Ну так бывает ))) Когда всё само сложное сделано, лажаешь на мелочах, глаз “замыливается”. начинаешь лезть в дебри, а то что под носом не видишь. Свежий взгляд очень помогает…
Да вот платка под MT3329 и эту коробочку
может кому пригодится…
там размер 31 мм оно ложится на нижнюю и входит в верхнюю, плотно закрываясь 😃
Полетал слегка: ветер собачий (при порыве в спину аж толкает) и хоть и GPS протрулюлюкал loc (пищалку на таймере вывел - поёт разные мелодии) и ручки впринципе тянулись к переключателю, но очко не из титана - так в лойтере и не попробовал…
Зато полетал в альтхолд - держит даже в ветер такой очень хорошо 😃
Взлёт и посадка в альтхолд:
Взлёт - моторы крутят на минимуме пока не передвинешь стик больше 50% - сразу резкий отрыв где-то на полметра и всё стик в 50 - висим, больше - подымаемся…
Посадка - немного станновато сделано, возможно из-за сильного ветра, но чтобы посадить надо стик почти в минимум опустить - начинает садиться, надо отдать должное посадка ну оочень мягкая, сам так не посажу (ну разве что в штиль) 😃
Раз альтхолд работает на жестко прикрученной плате, значит аксель себя чувствует хорошо 😃
Мда… Значится что то в коде… Но ты ведь всё равно эти процедуры менять будешь? Меняй, а там посмотришь
В коде вряд ли, т.к. отключение FPU решает проблему. Бага в компиллере явно…
Да и код там простой. Локальная статическая переменная (accAlt) и пару умножений с ней
int getEstimatedAltitude(void)
{
static uint32_t previousT;
uint32_t currentT = micros();
uint32_t dTime;
int32_t error;
int32_t baroVel;
int32_t vel_tmp;
int32_t BaroAlt_tmp;
float dt;
float vel_acc;
static float vel = 0.0f;
static float accAlt = 0.0f;
static int32_t lastBaroAlt;
static int32_t baroGroundAltitude = 0;
static int32_t baroGroundPressure = 0;
dTime = currentT - previousT;
if (dTime < UPDATE_INTERVAL)
return 0;
previousT = currentT;
if (calibratingB > 0) {
baroGroundPressure -= baroGroundPressure / 8;
baroGroundPressure += baroPressureSum / (cfg.baro_tab_size - 1);
baroGroundAltitude = (1.0f - powf((baroGroundPressure / 8) / 101325.0f, 0.190295f)) * 4433000.0f;
vel = 0;
accAlt = 0;
calibratingB--;
}
// calculates height from ground via baro readings
// see:
BaroAlt_tmp = lrintf((1.0f - powf((float)(baroPressureSum / (cfg.baro_tab_size - 1)) / 101325.0f, 0.190295f)) * 4433000.0f); // in cm
BaroAlt_tmp -= baroGroundAltitude;
BaroAlt = lrintf((float)BaroAlt * cfg.baro_noise_lpf + (float)BaroAlt_tmp * (1.0f - cfg.baro_noise_lpf)); // additional LPF to reduce baro noise
dt = accTimeSum * 1e-6f; // delta acc reading time in seconds
// Integrator - velocity, cm/sec
vel_acc = (float)accSum[2] * accVelScale * (float)accTimeSum / (float)accSumCount;
// Integrator - Altitude in cm
accAlt += (vel_acc * 0.5f) * dt + vel * dt; // integrate velocity to get distance (x= a/2 * t^2)
accAlt = accAlt * cfg.baro_cf_alt + (float) BaroAlt *(1.0f - cfg.baro_cf_alt); // complementary filter for Altitude estimation (baro & acc)
EstAlt = accAlt;
vel += vel_acc;
#if 0
debug[0] = accSum[2] / accSumCount; // acceleration
debug[1] = vel; // velocity
debug[2] = accAlt; // height
#endif
accSum_reset();
//P
error = constrain(AltHold - EstAlt, -300, 300);
error = applyDeadband(error, 10); // remove small P parametr to reduce noise near zero position
BaroPID = constrain((cfg.P8[PIDALT] * error / 128), -200, +200);
//I
errorAltitudeI += cfg.I8[PIDALT] * error / 64;
errorAltitudeI = constrain(errorAltitudeI, -50000, 50000);
BaroPID += errorAltitudeI / 512; // I in range +/-100
baroVel = (BaroAlt - lastBaroAlt) * 1000000.0f / dTime;
lastBaroAlt = BaroAlt;
baroVel = constrain(baroVel, -300, 300); // constrain baro velocity +/- 300cm/s
baroVel = applyDeadband(baroVel, 10); // to reduce noise near zero
// apply Complimentary Filter to keep the calculated velocity based on baro velocity (i.e. near real velocity).
// By using CF it's possible to correct the drift of integrated accZ (velocity) without loosing the phase, i.e without delay
vel = vel * cfg.baro_cf_vel + baroVel * (1 - cfg.baro_cf_vel);
vel = constrain(vel, -1000, 1000); // limit max velocity to +/- 10m/s (36km/h)
// D
vel_tmp = lrintf(vel);
vel_tmp = applyDeadband(vel_tmp, 5);
vario = vel_tmp;
BaroPID -= constrain(cfg.D8[PIDALT] * vel_tmp / 16, -150, 150);
return 1;
}
Взлёт - моторы крутят на минимуме пока не передвинешь стик больше 50% - сразу резкий отрыв где-то на полметра и всё стик в 50 - висим, больше - подымаемся…
я когда единожды ардупират пробовал (в альтхолд), подумал это он так прыгнул из за вибраций на борту, также не исключал, что это они так воздушную подушку побороли 😃
и что в этом хорошего?
Я вес баро просто уменьшал на взлете и отрыв от земли хоть 20см в сек делай, т.е. перевел за 50%, никакого прыжка… взлетаем…
Вот старый видос. Смотреть с 2:40
Бага в компиллере явно…
А они за это ещё и деньги просят 😦
А они за это ещё и деньги просят 😦
Не ну IDE вполне себе мощная, а баги есть везде. В той же Arduino IDE натыкался на пару глюков и пока строчки (независимые от контекста) местами не менял никак не получалось убрать “загадочность”. А пару раз натыкался, когда компиллер не видит закрывающей скобки из-за набора дефайнов внутри, хотя там 100% было все ок… так что это нормально…
И даже в чипах есть баги. И об этом пишут в спеках, что мол при таких то условиях и значениях регистров будет глюк…
upd: По некоторым моим постам можно подумать, что я не люблю арду. Это не так! 😃
Пожалуй самый перспективны проект и мощнейшее комьюнити в тырнете. А вики вообще загляденье!
Я тут вспомнил, помнишь багу по альтхольду в базефлигхт - давно было я ещё на мелкоплате тогда с сонаром ковырялся, а ты делал RC разные, там в ноль переменная становилась всегда из-за неправильного перевода из int в float, я про неё и забыл… может она?
Немного не по теме но спрошу тут. Кто то запускал UART4 на STM32F4 (stm32f405rgt6). Ну ни как не выходит передать данные.
//============================== UART_4 FRSKY ==================================
void Init_Uart4(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* --------------------------- System Clocks Configuration -----------------*/
/* UART4 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
/* GPIOA clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/*-------------------------- GPIO Configuration ----------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Connect USART pins to AF */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_UART4);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_UART4);
/* USARTx configuration ------------------------------------------------------*/
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(UART4, &USART_InitStructure);
USART_Cmd(UART4, ENABLE);
}
//==============================================================================
unsigned char _data[10] = {1,2,3,4,5,6,7,8,9,0};
void SendUart4(void)
{
unsigned char ii;
for (ii=0;ii<10;ii++)
{
while(USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET){;} // Wait for Empty
UART4->DR = (unsigned char)_data[ii];
__nop();
//USART_SendData(UART4, data[ii]); // Echo Char
}
}
возможно надо
USART_SendData(UART4, (uint8_t)_data[ii]);
может его рвёт от char?
Вопрос снят. Я блин дятел синюю термоусадку не на тот провод одел и получилось что на землю был сигнальный провод. Нужно отдохнуть.
Ооо я частенько чё-нить нитуда воткну, а потом бегаю ищу 😃 неправильное подключение может привести к серьёзным научным открытиям;)
Я тут вспомнил, помнишь багу по альтхольду в базефлигхт - давно было я ещё на мелкоплате тогда с сонаром ковырялся, а ты делал RC разные, там в ноль переменная становилась всегда из-за неправильного перевода из int в float, я про неё и забыл… может она?
Нее, это не то. Там вроде была переменная интегратора и сумма “не копилась” т.к. дискреты/самплы мелкие были, а дробная часть отбрасывалась из-за преобразования типов… вроде так…
А тут явно косяк не в этом. Уже и на 4.73 кейл откатился и таж фигня. Пока отключил FPU, а там посмотрим…
DRDY это готовность МС5611, я ей не пользуюсь, так что не подскажу.
Вах вах вах! 😃
Подрубил осцилл посмотреть, а там синхра готовности данных идет с частотой всего ~15гц. А ms5611 даже при макс. разрешении АЦП дает ~100гц по даташиту!
Response time (Conversion time for ADC) = 8.22ms for Oversampling Ratio = 4096
Ну думаю совсем таймкоп свою железку не любит! 😃
Потом смотрю на схемку от Сержа, а DRDY это пин готовности компаса 😃
Полез в кодярник и даташит, а там как раз дефолтный дата рэйт это 15 герц 😃
Потом смотрю на схемку от Сержа, а DRDY это пин готовности компаса
Извини, наврал, у МСки вообще выхода готовности нет, это компас 5883. По большому счету его готовность не особо нужна, только если для контроля работоспособности.
Готовность данных нужно контролировать только у датчиков с которых данные интегрируются, дабы не словить пропуск или не считать два раза одно и тоже.
А тут явно косяк не в этом. Уже и на 4.73 кейл откатился и таж фигня. Пока отключил FPU, а там посмотрим…
Сдаётся мне, что проблема у тебя в формировании переменной dt, попробуй отладить с нулевым уровнем оптимизации компиллера.
Готовность данных нужно контролировать только у датчиков с которых данные интегрируются, дабы не словить пропуск или не считать два раза одно и тоже.
Камрад, а как ты их контролируешь?
2 Serg, 3дээры красавцы:
Dear Customer,
We recently updated the 3DR Pixhawk flight controllers that were included with your IRIS developer units. The upgraded Pixhawk features improved power handling plus an additional accelerometer.
We have begun shipping the new Pixhawk flight controllers to the address where you received your IRIS. You will receive one Pixhawk for each IRIS you purchased. If you resold your IRIS, please be sure to contact your customers and provide them with this updated flight controller.
Тоесть скоро их будет два? Если так, то для опытоф могу первый предложить!
Неужели они на столько обкакались, что высылают новые контроллеры без замены старых? ГЫ сразу вырисовывается себестоимость 😃
Камрад, а как ты их контролируешь?
Дык ловлю сигнал готовности от гиры и акселя. Т.е. все отсчеты датчиков учтены и обработка данных идёт в такт с датчиками.
Тоесть скоро их будет два? Если так, то для опытоф могу первый предложить!
Дык ты хоть скажи какие датчики в твоём стоят, и если там ЛСМ то ведь летает нормально, даже отлично.
А я тулчайны и ПО всё переношу на Писишку, шяс буду посмотреть что в пикхавке накуралесили - ну и как следствие обновлю Арду…
Дык ловлю сигнал готовности от гиры и акселя.
Не по прирыванию?
и если там ЛСМ
Лсм 303d судя по размеру и коду пиксхавка
Кстати, чуть я расстроился из-за того, что когдато приобрел пару бреакоутов с лсм303длм…Разозлился и таки заставил ейо не хуже тех-же адхл и мпу летать. Видео в личку кину дабы не разводить слухов.
А я тулчайны и ПО всё переношу на Писишку
Как закончишь, подскажешь че и как?
Как закончишь, подскажешь че и как?
у меня бубунта если чё…
да на SPI1 повесили MPU6000 в Pixhawk-e
дийдроносы вроде скрипт установки починили, шяс NuttX клонируется - проверю…
Не по прирыванию?
По прерыванию, и весь обсчёт в обработчиках.
Лсм 303d судя по размеру и коду пиксхавка
тада не понимаю в чем зуд у 3Дээров, если экземпляры вполне на ЛСМ летают. Или там ЛСМ какие особые?
.Разозлился и таки заставил ейо не хуже тех-же адхл и мпу летать.
у дронсов тоже получилось, и вроде без всякого акультизма.