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

rual
SergDoc:

ну мне большего пока и ненадо от этой платы…

Это для маленькой с 103м?

SergDoc:

но на портах PB8, PB9 шимы не выключились

надо найти место где инициализация ШИМ выполняется…

SergDoc

да на 103-м

rual:

надо найти место где инициализация ШИМ выполняется…

drv_pwm.c - буду ковырять…

rual
SergDoc:

drv_pwm.c - буду ковырять…

Найди вызов в майне pwmInit, найди в параметре ссылку на одну из структур
и убери из неё PWM5, PWM6

static const uint8_t multiPWM[] = {
    PWM1 | TYPE_IW,     // input #1
    PWM2 | TYPE_IW,
    PWM3 | TYPE_IW,
    PWM4 | TYPE_IW,
   // PWM5 | TYPE_IW, /// !!!!!!!!!!!!!!!!!!
    //PWM6 | TYPE_IW, /// !!!!!!!!!!!!!!!!!!
    PWM7 | TYPE_IW,
    PWM8 | TYPE_IW,     // input #8
    PWM9 | TYPE_M,      // motor #1 or servo #1 (swap to servo if needed)
    PWM10 | TYPE_M,     // motor #2 or servo #2 (swap to servo if needed)
    PWM11 | TYPE_M,     // motor #1 or #3
    PWM12 | TYPE_M,
    PWM13 | TYPE_M,
    PWM14 | TYPE_M,     // motor #4 or #6
    0xFF
};

или просто закоментируй, ломать код не надо, всё структурами настраивается.

rual

Вот здесь

    // this is pretty hacky shit, but it will do for now. array of 4 config maps, [ multiPWM multiPPM airPWM airPPM ]
    if (init->airplane)
        i = 2; // switch to air hardware config
    if (init->usePPM)
        i++; // next index is for PPM

    setup = hardwareMaps[i];

выбирается одна из структур

static const uint8_t *hardwareMaps[] = {
    multiPWM,
    multiPPM,
    airPWM,
    airPPM,
};

которые описаны выше,

 static const uint8_t multiPPM[] = {
    PWM1 | TYPE_IP,     // PPM input
    PWM9 | TYPE_M,      // Swap to servo if needed
    PWM10 | TYPE_M,     // Swap to servo if needed
    PWM11 | TYPE_M,
    PWM12 | TYPE_M,
    PWM13 | TYPE_M,
    PWM14 | TYPE_M,
    PWM5 | TYPE_M,      // Swap to servo if needed
    PWM6 | TYPE_M,      // Swap to servo if needed
    PWM7 | TYPE_M,      // Swap to servo if needed
    PWM8 | TYPE_M,      // Swap to servo if needed
    0xFF
};

static const uint8_t multiPWM[] = {
    PWM1 | TYPE_IW,     // input #1
    PWM2 | TYPE_IW,
    PWM3 | TYPE_IW,
    PWM4 | TYPE_IW,
    PWM5 | TYPE_IW,
    PWM6 | TYPE_IW,
    PWM7 | TYPE_IW,
    PWM8 | TYPE_IW,     // input #8
    PWM9 | TYPE_M,      // motor #1 or servo #1 (swap to servo if needed)
    PWM10 | TYPE_M,     // motor #2 or servo #2 (swap to servo if needed)
    PWM11 | TYPE_M,     // motor #1 or #3
    PWM12 | TYPE_M,
    PWM13 | TYPE_M,
    PWM14 | TYPE_M,     // motor #4 or #6
    0xFF
};

static const uint8_t airPPM[] = {
    PWM1 | TYPE_IP,     // PPM input
    PWM9 | TYPE_M,      // motor #1
    PWM10 | TYPE_M,     // motor #2
    PWM11 | TYPE_S,     // servo #1
    PWM12 | TYPE_S,
    PWM13 | TYPE_S,
    PWM14 | TYPE_S,     // servo #4
    PWM5 | TYPE_S,      // servo #5
    PWM6 | TYPE_S,
    PWM7 | TYPE_S,
    PWM8 | TYPE_S,      // servo #8
    0xFF
};

static const uint8_t airPWM[] = {
    PWM1 | TYPE_IW,     // input #1
    PWM2 | TYPE_IW,
    PWM3 | TYPE_IW,
    PWM4 | TYPE_IW,
    PWM5 | TYPE_IW,
    PWM6 | TYPE_IW,
    PWM7 | TYPE_IW,
    PWM8 | TYPE_IW,     // input #8
    PWM9 | TYPE_M,      // motor #1
    PWM10 | TYPE_M,     // motor #2
    PWM11 | TYPE_S,     // servo #1
    PWM12 | TYPE_S,
    PWM13 | TYPE_S,
    PWM14 | TYPE_S,     // servo #4
    0xFF
};

можешь свою добавить и включить в hardwareMaps[]

SergDoc

Запустил на портах PB8, PB9 проверяю работоспособность остальных шимов…

серва точно работает 😃 моторы не стартонули не один:(

SergDoc

Вобщем надо, свистелку тобиш триггер пересадить на порт pa11

rual
SergDoc:

моторы не стартонули не один

ШИМа нет?

SergDoc

как раз то шим есть похоже моторы не назначаются…

Короче я сам дурак - последние прошивки Таймкопа ( там где он якобы отладил алт холд) НЕРАБОЧИЕ - армятся, но шимы не меняются…

SergDoc

откатил прошивку, движки сместились без проблем, но сонар не заработал 😦

Фух всё, работают и движки, и серва, и сонар PB8 - PB9 😃 , а вот по ходу альт холд придётся самому присобачивать, да и всё равно сонар в иму вклинивать надо… пошел я спать…
на картинке я специально сонар вверх вниз дёргал, где скачёк - пальцем закрыл…

SergDoc

Вот только интересный момент, у меня получается на одном таймере теперь висит и 50Гц шим и 400Гц - как-то нехорошо получаеццо…

rual
SergDoc:

у меня получается на одном таймере теперь висит и 50Гц шим и 400Гц - как-то нехорошо получаеццо…

Не очень, у всех каналов таймера будет герцовка как у последнего в структуре по ссылке в hardwareMaps[]

SergDoc

так вот я и хочу повесить trigger сонара на порт A-какой нибудь PA13 или PA14 - как правильно в драйвере записать GPIO ?

серва то работает, а она бы на 400Гц не потянула…

вот где переключается канал в 50Гц режим


if (init->useServos) {
            // remap PWM9+10 as servos
            if (port == PWM9 )//|| port == PWM10)
                mask = TYPE_S;
        }

и отсчёт моторов сдвигается - я закоментировал PWM 10 -порт PA11, отсчёт пошол с него и мотор на нём завёлся, возможно что теперь он не на 400Гц а на 50Гц.

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

SergDoc

вот статейка шимы на одном таймере но с разной частотой по каналам… это я себя успокаиваю - будет погода подлетну посмотрю 😃

rual
SergDoc:

так вот я и хочу повесить trigger сонара на порт A-какой нибудь PA13 или PA14 - как правильно в драйвере записать GPIO ?

вылож файлы сонара .c и .h поправлю

SergDoc

я впринципе попробовал перекидывать - не вышло

case sonar_pwm56:
        trigger_pin = GPIO_Pin_8;   // здесь номер порта
        echo_pin = GPIO_Pin_9;      // PWM6 (PB9) - 5v tolerant
        exti_line = EXTI_Line9;
        exti_pin_source = GPIO_PinSource9;
        exti_irqn = EXTI9_5_IRQn;
        break;
-------------------------------------------------------------------------
// tp - trigger pin
    GPIO_InitStructure.GPIO_Pin = trigger_pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure); // сам порт 
rual
SergDoc:

я впринципе попробовал перекидывать - не вышло

// tp - trigger pin
    GPIO_InitStructure.GPIO_Pin = trigger_pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure); // сам порт

Порт забыл поменять…

drv_hcsr04.rar

SergDoc

Нет менял, это просто для примера, возможно он где-то задействован в программном (возможно для переключения в cli как в арду или переключение каких-то режимов), но я не нашел и даже упоминаний…

ааа вот оно чё


 last_measurement = current_time;
    distance_ptr = distance;

    GPIO_SetBits(GPIOB, trigger_pin);
    //  The width of trig signal must be greater than 10us
    delayMicroseconds(11);
    GPIO_ResetBits(GPIOB, trigger_pin);

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

замерял линейкой сонар врёт на сантиметр…

SergDoc

На портах А не пошло…

это порты для отладки через St-Link , их надо где-то переназначить…

не надо голову дурить, у меня ещё порт B не кончился 12, 13, 14, 15 - тобиш SPI но я его как порядочная св не развёл придётся припаятся пямо к лапе…

SergDoc

В общем trigger переехал на PA11, моторы на 4-й таймер, серва на 1-м, всё завелось 😃

rual
SergDoc:

всё завелось

отлично, удержание высоты проверял?

SergDoc

Я ещё только пытаюсь алт холд Александра (Mahovik) воткнуть, т.к. не пошли прошивки последние, а потом уже вклинивать сонар в IMU буду, он сейчас только показывает высоту и всё, в расчётах не учавствует…

Ещё идея лезет, от прошлого проекта осталась платка под GPS (можно крепить поверх мелкой на стойках), пожертвовать двумя AUXами - на первом сделать LEVEL, LEVEL+Alt Hold, LEVEL+Alt Hold+Headfree - трёхпозиционник, на втором переключение GPS - удержание позиции и возврат домой, под GPS освободить второй UART…