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

mahowik
rual:

Тут трассировка нужна… Дискавери Ф3 или Ф4?

ф4… пока покопаюсь сам, потом если что буду просить 😃
у тебя дока или схемка gy-86 есть?

и как делать трассировку? это тож самое что дебаг? 5-й кейл вроде поддерживает дебаг периферии…

rual
mahowik:

и как делать трассировку? это тож самое что дебаг?

Ну да, отладка! Кейл делает

mahowik:

у тебя дока или схемка gy-86 есть?

Схемы нет, да и не надо. МПУ и МС висят на внешней шине, компас через МПУ, все готовности выедены как есть.

SergDoc
mahowik:

драйвер смотреть надо (то что я не люблю больше всего )… скорее всего там фига…

а i2c драйвер сам писал или у меня взял? там хитрость одна в настройке портов есть, правильно работает только так, а не как в базефлайте:

void i2cUnstick(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    uint8_t i;


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
                GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
                //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);


    GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);
    for (i = 0; i < 8; i++) {
        // Wait for any clock stretching to finish
        while (!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10))
            delayMicroseconds(10);


        // Pull low
        GPIO_ResetBits(GPIOB, GPIO_Pin_10); //Set bus low
        delayMicroseconds(10);
        // Release high again
        GPIO_SetBits(GPIOB, GPIO_Pin_10); //Set bus high
        delayMicroseconds(10);
    }


    // Generate a start then stop condition
    // SCL  PB10
    // SDA  PB11


    GPIO_ResetBits(GPIOB, GPIO_Pin_11); // Set bus data low
    delayMicroseconds(10);
    GPIO_ResetBits(GPIOB, GPIO_Pin_10); // Set bus scl low
    delayMicroseconds(10);
    GPIO_SetBits(GPIOB, GPIO_Pin_10); // Set bus scl high
    delayMicroseconds(10);
    GPIO_SetBits(GPIOB, GPIO_Pin_11); // Set bus sda high


    // Init pins
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
                GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}
rual

Ф4 кстати проще, у Ф3 внутренняя “кухня” и2ц операций.

SergDoc

Вариант - подавай 3.3 и на 5V и на 3.3V

mahowik
SergDoc:

а i2c драйвер сам писал или у меня взял?

твой… самому слабо 😃

SergDoc:

Вариант - подавай 3.3 и на 5V и на 3.3V

вроде сперва продержался подольше, потом завис опять, когда уже собрался писать что все гут 😃
надо к ардуине подрубить и убедиться что проблема не в железе или же в нем как раз…

rual:

Ну да, отладка! Кейл делает

уже не помню где читал, но отладка именно периферии появилась в 5-й версии… т.е в 4.7 не было вроде…

SergDoc

смотри - 4,5 лапы выбор адреса - на корпусе обе, 2 - i2c/spi - должно питание висеть - проверь если есть чем, я из базефлайта выкидывал все упоминания о BMP085 - у них адреса одинаковые и в драйвере MS5611 как раз и идёт автодетект обоих!!!

mahowik

i2c драйвер твой не трогал… bmp085 не выкашивал, но не думаю что в этом проблема, т.к. CLI показывает что задетектил ms5611…
тем более если по адресам были бы какие ошибки, то вообще баро не запустился бы думаю, а то запускается и потом молчек… буду дебагать в общем…

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

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