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

mahowik

доделал новогоднюю моргалку на окно (на ардуине и диодной ленте купленной к коптеру 2 года назад) и вернулся к теме… 😃

кроче дело было не в бобине… в float accAlt переменной интегратора в дебаге увидел значение 1.#QNAN
при чем с этой переменной выполняются только операции умножения, т.е. деление на ноль исключено по идее…

таймкоп зарыл бомбу 😃

static float accAlt = 0.0f;
...
// 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;

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

кстати, возможно FPU просто надо тюнить спецом, т.е. сетапить ему параметры правильные?

rual
mahowik:

кстати, возможно FPU просто надо тюнить спецом, т.е. сетапить ему параметры правильные?

А ты чем собираешь проект ?

rual
SergDoc:

У Таймкопа нет FPU

Этаж не важно, оно ж не асме написано, а компиллер сам должен корректно формировать код с ФПУ или без.

SergDoc

Возможно, глюк в кейле, у меня баро не обрубался 4.7(если не ошибаюсь), а вот удержание высоты, я где-то описывал, ровно 30 сек - потом моторы в минимум - перещёлкиваю тумблер опять висит. Я тогда решил что бага в алгоритме и стал переделывать на MahoWii, а тут как раз кто-то, не буду пальцем показывать (Sir Alex) 😃, подбил на порт Арду - ну и всё, так всё в разваленном виде и осталось 😦

oleg70

Возникла проблема (?) с F4 процем - не могу ,почему то, запустить SPI3… На плате использую и SPI1 и SPI2, код инициализации сто раз уже проверил, а результат: SPI 1-2 работают , 3-й молчит… (смотрел осциллографом - нету SCK)…😦
В даташите что то про конфликт с Jtag накорябоно, но так и не понял что… (вроде пины PC10,11,12 не имеют отношения к Jtag)…
Кто нибуть ,чего подскажет ???

SergDoc

По секрету скажу, в PX4 SPI3 работает, в Pixhawk эти же лапы по SD протоколу, должно всё работать. Конфликт с Jtag может быть если SPI3 заведено на порт B (где в частности оно у меня на новой плате - для боящихся в NuttX Jtag отключаемый 😃 ). Олег, если это не сверхсекретная информация, то можете кусок кода с инициализацией показать…

Alexey_1811

Вот рабочий код, правда в режиме слейв и с ДМА.

GPIO_StructInit(&gpio);
    gpio.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    gpio.GPIO_Mode = GPIO_Mode_AF;
    gpio.GPIO_Speed = GPIO_Speed_50MHz;
    gpio.GPIO_OType = GPIO_OType_PP;
    gpio.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_Init(GPIOC,&gpio);
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_SPI3);
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_SPI3);
    SPI_I2S_DeInit(SPI3);
    SPI_StructInit(&spi3);
    SPI3 -> CR2 = SPI_CR2_TXDMAEN;
    spi3.SPI_Mode = SPI_Mode_Slave;
    spi3.SPI_DataSize = SPI_DataSize_8b;
    spi3.SPI_NSS = SPI_NSS_Soft;
    SPI_Init(SPI3,&spi3);
    //
    DMA1_Stream4->CR |= DMA_SxCR_EN; // Enable DMA1 Stream4
    DMA1_Stream7->CR |= DMA_SxCR_EN; // Enable DMA1 Stream7
    SPI_Cmd(SPI3,ENABLE);
SergDoc

Я плохо смотрю, или SCK (PC12) нет?

GPIO_StructInit(&gpio);
    gpio.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 ;
    gpio.GPIO_Mode = GPIO_Mode_AF;
    gpio.GPIO_Speed = GPIO_Speed_50MHz;
    gpio.GPIO_OType = GPIO_OType_PP;
    gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOC,&gpio);
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_SPI3);
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_SPI3);
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_SPI3);
    SPI_I2S_DeInit(SPI3);
    SPI_StructInit(&spi3);
    SPI3 -> CR2 = SPI_CR2_TXDMAEN;
    spi3.SPI_Mode = SPI_Mode_Slave;
    spi3.SPI_DataSize = SPI_DataSize_8b;
    spi3.SPI_NSS = SPI_NSS_Soft;
    SPI_Init(SPI3,&spi3);
    //
    DMA1_Stream4->CR |= DMA_SxCR_EN; // Enable DMA1 Stream4
    DMA1_Stream7->CR |= DMA_SxCR_EN; // Enable DMA1 Stream7
    SPI_Cmd(SPI3,ENABLE);

и, по моему, в слейве NSS должна аппаратная быть не?

Alexey_1811

Клок есть. Нет MOSI так как он не используется для генерации графики OSD.

SergDoc

GPIO_PuPd_NOPULL; и в слейве оно ж будет принимать, а не выдавать синхронизацию…

Alexey_1811

NSS мне вообще не нужен. Используются только 2 выхода SCK и MISO. SPI тактируется таймером в ШИМ режиме.

SergDoc

Ну ясно (а то как-то я тут со своей колокольни не посмотрев что это ОСД 😃 - онож в один конец), а как это поможет Олегу?

SergDoc

Не ну почему сразу “никак” - оно ж работает - а значит круг поисков уменьшается 😃

oleg70
SergDoc:

Олег, если это не сверхсекретная информация, то можете кусок кода с инициализацией показать…

Код такой же как и у SPI1 и SPI2, которые работают… (просто место в ветке займет),

кстати

SergDoc:

Конфликт с Jtag может быть если SPI3 заведено на порт B

кстати на PORTB у меня SPI1 сидит…
Просто думал может хитрость здесь какая… (у Avr-a была такая фигня) Буду копать…

SergDoc
oleg70:

просто место в ветке займет

а много и не надо, тактирование самого SPI, тактирование портов, настройка портов - это как бы и не много. А так получается ни о чём - не работает и всё, а штатные экстрасенсы уже на новогодние каникулы отправились 😃
Это как я SPI2 в ПО PX4 запускал - в NuttX ошибка была по порту (MOSI или MISO не помню) - всё компилится, а не работает - пока дошло библиотеки перелопатить надо, может и арду на пару месяцев раньше взлетел 😃 ну правда с Александром ещё с УСБ воевали - но это другое…

oleg70
SergDoc:

а много и не надо

// MS5611 Set
//==================================================================
//==================================================================
//==================================================================

/* Configure the chip select pin
in this case we will use PD0 */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStruct);

GPIOD->BSRRL |= GPIO_Pin_0; // high

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStruct);

// connect SPI3 pins to SPI alternate function
GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3);

// enable peripheral clock

SPI_I2S_DeInit(SPI3);
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //40 Mhz / *
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI3, &SPI_InitStruct);

SPI_Cmd(SPI3, ENABLE); // enable SPI3

SergDoc
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //40 Mhz / * 

А тут правильно?
APB1 и APB2 на разных частотах работают…

APB1 has a max allowed value of 42MHz, APB2 max 84 MHz.

oleg70
SergDoc:

А тут правильно?

Это комментарий просто затесался…
Тут дело такое: я запускаю вот такую “заглушку”
while(1)
{
while (!(SPI1->SR & SPI_SR_TXE));
SPI1->DR = data;
LED_ON
}
в результате на CLK должен быть постоянный сигнал (меандр) + вкл. светодиода (контрольный) , светодиод горит а сигнала нет !, (на мрачные мысли наводит, типа проц./каюк)…

Инициализация вроде правильная…

mahowik
rual:

А ты чем собираешь проект ?

5-й keil

SergDoc:

У Таймкопа нет FPU

ну вот потому и написал что типа зарыл бомбу последователям 😃

rual:

Этаж не важно, оно ж не асме написано, а компиллер сам должен корректно формировать код с ФПУ или без.

все верно… бага в компиллере скорее всего…

SergDoc:

Возможно, глюк в кейле, у меня баро не обрубался 4.7(если не ошибаюсь), а вот удержание высоты, я где-то описывал, ровно 30 сек - потом моторы в минимум - перещёлкиваю тумблер опять висит.

ну так ты словил туже багу 😉 т.е. баро как мы выяснили не обрубался и у меня, а отваливалась переменная интегратора высоты в 1.#QNAN и в гуи оно как ноль видно и в расчетах тоже как ноль берется скорее всего… потому находясь на высоте когда переменную высоты рубило в ноль, моторы и гасли…

А вообще зря я походу взял последнюю версию из гитхаба на переделку… хоть и коП писал что это стабильная версия последняя, выснилось что там даж автоконфигурации nmea модулей нет и mtk1.6-1.9 протоколы не поддерживаются… фильтры дефолтные совсем не для “полететь из короПки”… терь мне понятно почему на naze32 мало народу летает, хотя надо признать есть много удобств по сравнению с вием, типа настройка всего подряд через CLI, т.е. без перезаливки прошивки соот-но…

SergDoc
oleg70:

на мрачные мысли наводит, типа проц./каюк

а порт просто подёргать 1,0…

mahowik

Поправлюсь, для nmea автоконфигурация есть, но кривая. Просто идет авто определение скорости модуля без переключения на нужную, т.е. нашел скажем 38400 бод и все, а то что там 1 герц частота обновления может стоять это уже в садд 😃


case GPS_NMEA:
            // nothing to do, just set baud rate and try receiving some stuff and see if it parses
            serialSetBaudRate(core.gpsport, gpsInitData[gpsData.baudrateIndex].baudrate);
            gpsSetState(GPS_RECEIVINGDATA);
            return;
rual
oleg70:

Инициализация вроде правильная…

Олег, у тебя в тесте СПИ1, а проблемы вроде с СПИ3 были?

mahowik:

все верно… бага в компиллере скорее всего…

Не думаю, кейл НУ очень умный, поэтому при работе с железом надо быть очень внимательным.
Стартап проекта родной кейловский асм? Если да, то замени на этот

startup_stm32f4xx.rar

mahowik
rual:

Не думаю, кейл НУ очень умный, поэтому при работе с железом надо быть очень внимательным.
Стартап проекта родной кейловский асм? Если да, то замени на этот

заменил… не помогло…

в твоем файле ток размер стека и хип поболей и потом если ошибка в общении с FPU то по идее эти параметры не решают проблемы, хотя если основной проц общается с FPU через стек, то может конечно влиять…



Stack_Size      EQU     0x00002000

Heap_Size       EQU     0x00002000