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

rual
RaJa:

Подскажите, пожалуйста проекты на STM32F103 и на STM32F4 с открытым исходным кодом, чтобы не изобретать велосипед.

SergDoc:

Мультипилот, на мой взгляд не совсем хорошее решение, копаюсь в PWM и таймерах - бррр…

Вот неплохой проект code.google.com/p/gluonpilot/, aka Drinker подсказал, весь проект не смотрел, но ИМУ у него (то что на кватернионах) правильное. Именно АХРС советую, математика быстрая, горизонт устойчивый , думаю в свой пролект встроить.

Alexsis1109

Подскажите, пожалуйста, как завести таймер на Atmega128 на 0,5мкс для подсчета ШИМа??? У меня ниже 5мкс он виснуть начинает(((( может нужно как то специально его регистры конфигурить и еще чего?? подскажите, пожалуйста, кто знает как…

SergDoc
Sir_Alex:

У меня за окном сугробы по пояс

ага наверно, у меня недавно пошел, а уже тоже по колено, с утра всё чисто было даже подсохло всё …

RaJa
SergDoc:

Naze32 на F103 все эти датчики поддерживает сразу, мультипилот есть под 103 есть под407 - но под ваши датчики всё переписывать надо, как в принципе и ОпенПилот СС, СС3D - 103, Revo -405 и BMP выкиньте сразу…

Весна уже на дворе, какие разработки? уже летать надоооо 😃

Мультипилот, на мой взгляд не совсем хорошее решение, копаюсь в PWM и таймерах - бррр…

BMP выкинуть не могу - платка 10DOF, максимум что можно - не использовать его 😃 Чем заменить?
Naze32 - это Afrodevices? Я в них запутался уже.
Multipilot это порт MultiWii под STM32 с эмуляцией ардуино (на хрена- непонятно), верно?
Меня не пугает переписать, потому что доделывать чужое сложнее чем написать свое, скорее всего. Особенно когда проект вида OpenPilot. Тем более у меня пока нет задачи превзойти, мне нужна хорошая расширяемость и удаленная управляемость. Ну и разобраться что к чему.
Летать уже летал, но сейчас продал ESC Turnigy AE-25A и заказал моторчики NX4005-650 хочу проверить их эффективность на 10х4.5 как пишут в табличках на 3S. Под мой вес коптера их тяги должно хватить и ESC BlueSeries 20A.
В качестве “просто полетать” валяется платка Crius MultiWii SE и висит на стене еще не облетанный Clouds Fly. Но это не особо интересно.
Все равно я сейчас в команде по разработке коптера, так что от разработки никуда не деться )

SergDoc
RaJa:

Naze32 - это Afrodevices? Я в них запутался уже.

да - это порт MultiWii

RaJa:

Multipilot это порт MultiWii под STM32 с эмуляцией ардуино (на хрена- непонятно), верно?

ArduPilot - STM32

RaJa:

BMP выкинуть не могу - платка 10DOF, максимум что можно - не использовать его Чем заменить?

я у себя на мелкоплате выкинул и повесил на проводках MS5611 - небо и земля…

RaJa
Sir_Alex:

Посмотрите еще ArduCopter. Последние исходники уже написаны под разные платформы, в том числе и F4 (плата называется PX4). Правда это усложняет структуру кода, т.к. они пишут свой HAL под каждую платформу.
Multipilot32 вроде тот же ArduCopter портированный под железо VRBrain…

PX4 уже на заметке, да, спасибо. Вместе с AfroDevices. У меня такой список получился:
Naze32
AfroFlight32 (MultiWii STM32 - AfroFlight)
OpenPilot
STM32VLDiscovery (aeroquad.com/attachment.php?attachmentid=3632&d=1306798120)
Flymaple
MultiPilot32
AeroQuad32

SergDoc
RaJa:

Вместе с AfroDevices

code.google.com/p/afrodevices/source/browse/#svn%2… интересней чем просто WII

Sir_Alex:

Посмотрите еще ArduCopter. Последние исходники уже написаны под разные платформы, в том числе и F4 (плата называется PX4). Правда это усложняет структуру кода, т.к. они пишут свой HAL под каждую платформу.
Multipilot32 вроде тот же ArduCopter портированный под железо VRBrain…

чёт я ничего не увидел, в мультипилоте точно есть порт Арду на PX4, о надо ещё в нём поковырятся…
Алексей, вы со снегом накаркали - за окном метель вообще началась ничерта не видно, а я расчитывал мелкоплату потестить, все лучшие моменты жизни блин на работе, пол дня на улице в одной кофте провозился с таксометром, а тут на тебе 😃

Alexsis1109
SergDoc:

мелкоплату потестить

Сергей, Вы не работали с Atmega-ми? Не поможете с таймером разобраться?..

SergDoc

с Wii не пойдёт?

/**************************************************************************************/
/***************               Standard RX Pins reading            ********************/
/**************************************************************************************/
#if defined(STANDARD_RX)
  // predefined PC pin block (thanks to lianj)
  #define RX_PIN_CHECK(pin_pos, rc_value_pos)                                                        \
    if (mask & PCInt_RX_Pins[pin_pos]) {                                                             \
      if (!(pin & PCInt_RX_Pins[pin_pos])) {                                                         \
        dTime = cTime-edgeTime[pin_pos]; if (900<dTime && dTime<2200) rcValue[rc_value_pos] = dTime; \
      } else edgeTime[pin_pos] = cTime;                                                              \
    }
  // port change Interrupt
  ISR(RX_PC_INTERRUPT) { //this ISR is common to every receiver channel, it is call everytime a change state occurs on a RX input pin
    uint8_t mask;
    uint8_t pin;
    uint16_t cTime,dTime;
    static uint16_t edgeTime[8];
    static uint8_t PCintLast;

    pin = RX_PCINT_PIN_PORT; // RX_PCINT_PIN_PORT indicates the state of each PIN for the arduino port dealing with Ports digital pins

    mask = pin ^ PCintLast;   // doing a ^ between the current interruption and the last one indicates wich pin changed
    sei();                    // re enable other interrupts at this point, the rest of this interrupt is not so time critical and can be interrupted safely
    PCintLast = pin;          // we memorize the current state of all PINs [D0-D7]

    cTime = micros();         // micros() return a uint32_t, but it is not usefull to keep the whole bits => we keep only 16 bits

    #if (PCINT_PIN_COUNT > 0)
      RX_PIN_CHECK(0,2);
    #endif
    #if (PCINT_PIN_COUNT > 1)
      RX_PIN_CHECK(1,4);
    #endif
    #if (PCINT_PIN_COUNT > 2)
      RX_PIN_CHECK(2,5);
    #endif
    #if (PCINT_PIN_COUNT > 3)
      RX_PIN_CHECK(3,6);
    #endif
    #if (PCINT_PIN_COUNT > 4)
      RX_PIN_CHECK(4,7);
    #endif
    #if (PCINT_PIN_COUNT > 5)
      RX_PIN_CHECK(5,0);
    #endif
    #if (PCINT_PIN_COUNT > 6)
      RX_PIN_CHECK(6,1);
    #endif
    #if (PCINT_PIN_COUNT > 7)
      RX_PIN_CHECK(7,3);
    #endif

    #if defined(FAILSAFE) && !defined(PROMICRO)
      if (mask & 1<<THROTTLEPIN) {  // If pulse present on THROTTLE pin (independent from ardu version), clear FailSafe counter  - added by MIS
        if(failsafeCnt > 20) failsafeCnt -= 20; else failsafeCnt = 0; }
    #endif
  }
Alexsis1109
SergDoc:

с Wii не пойдёт?

этот код с атмеги? и что такое Wii?

SergDoc

328мега , атмега2560 ну и там всякие производные
вот настройка портов

/**************************************************************************************/
/***************                   RX Pin Setup                    ********************/
/**************************************************************************************/
void configureReceiver() {
  /******************    Configure each rc pin for PCINT    ***************************/
  #if defined(STANDARD_RX)
    #if defined(MEGA)
      DDRK = 0;  // defined PORTK as a digital port ([A8-A15] are consired as digital PINs and not analogical)
    #endif
    // PCINT activation
    for(uint8_t i = 0; i < PCINT_PIN_COUNT; i++){ // i think a for loop is ok for the init.
      PCINT_RX_PORT |= PCInt_RX_Pins[i];
      PCINT_RX_MASK |= PCInt_RX_Pins[i];
    }
    PCICR = PCIR_PORT_BIT;

    /*************    atmega328P's Specific Aux2 Pin Setup    *********************/
    #if defined(PROMINI)
     #if defined(RCAUXPIN)
        PCICR  |= (1 << 0) ; // PCINT activated also for PINS [D8-D13] on port B
        #if defined(RCAUXPIN8)
          PCMSK0 = (1 << 0);
        #endif
        #if defined(RCAUXPIN12)
          PCMSK0 = (1 << 4);
        #endif
      #endif
    #endif

    /***************   atmega32u4's Specific RX Pin Setup   **********************/
    #if defined(PROMICRO)
      //Trottle on pin 7
      DDRE &= ~(1 << 6); // pin 7 to input
      PORTE |= (1 << 6); // enable pullups
      EIMSK |= (1 << INT6); // enable interuppt
      EICRB |= (1 << ISC60);
      // Aux2 pin on PBO (D17/RXLED)
      #if defined(RCAUX2PIND17)
        DDRB &= ~(1 << 0); // set D17 to input
      #endif
      // Aux2 pin on PD2 (RX0)
      #if defined(RCAUX2PINRXO)
        DDRD &= ~(1 << 2); // RX to input
        PORTD |= (1 << 2); // enable pullups
        EIMSK |= (1 << INT2); // enable interuppt
        EICRA |= (1 << ISC20);
      #endif
    #endif

а вот ещё веточка есть rcopen.com/forum/f123/topic221574

Alexsis1109
SergDoc:

328мега , атмега2560 ну и там всякие производные
вот настройка портов Код:

о_0. Вы разбираетесь в этом коде??

SergDoc

есть маленький проблем, это ардуино со своими библиотеками и всеми вытекающими, но есть такой контроллер - КУК kkmulticopter.com/index.php?option=com_content&vie… там исходники чисто под AVRStudio есть на си, есть на ассеме, когда-то баловался переписывал порты, давно…

// pin change interrupt enables
	PCICR |= (1 << PCIE0);			// PCINT0..7
	PCICR |= (1 << PCIE2);			// PCINT16..23

	// pin change masks
	PCMSK0 |= (1 << PCINT7);		// PB7
	PCMSK2 |= (1 << PCINT17);		// PD1
	// external interrupts
	EICRA  = (1 << ISC00) | (1 << ISC10);	// Any change INT0, INT1
	EIMSK  = (1 << INT0) | (1 << INT1);		// External Interrupt Mask Register
	EIFR |= (1 << INTF0) | (1 << INTF1);

	// timer0 (8bit) - run @ 8MHz
	// used to control ESC/servo pulse length
	TCCR0A = 0;						// normal operation
	TCCR0B = (1 << CS00);			// clk/0
	TIMSK0 = 0; 					// no interrupts

	// timer1 (16bit) - run @ 1Mhz
	// used to measure Rx Signals & control ESC/servo output rate
	TCCR1A = 0;
	TCCR1B = (1 << CS11);

	// timer2 8bit - run @ 8MHz / 1024 = 7812.5KHz
	// and Stick-Arming
	TCCR2A = 0;
	TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20);	// /1024
	TIMSK2 = 0;
	TIFR2  = 0;
	TCNT2 = 0;		// reset counter
Alexsis1109
SergDoc:

когда-то баловался переписывал порты, давно…

спасибо за ссылку. а конкретно по таймеру в атмеге сможете что-то посоветовать? как его настроить на 0,5мкс?

RaJa
SergDoc:

да - это порт MultiWii
я у себя на мелкоплате выкинул и повесил на проводках MS5611 - небо и земля…

Он, зараза стоит около 18 баксов с обвязкой. Заказать что ли…

SergDoc:

есть маленький проблем, это ардуино со своими библиотеками и всеми вытекающими, но есть такой контроллер - КУК kkmulticopter.com/index.php?option=com_content&vie… там исходники чисто под AVRStudio есть на си, есть на ассеме, когда-то баловался переписывал порты, давно…

Кук вроде только на асме, по крайней мере на С я что-то не нашел.

RaJa
SergDoc:

Minsoo Kim писал на си

А, нашел, версия 1.5 с сырцами, там есть немножко полезного для AVR кода

oleg70
Alexsis1109:

сможете что-то посоветовать? как его настроить на 0,5мкс?

Немного не понял, что значит 0.5 мкс (частота тактирования чтоль?)
А вообще в ATmega-х пред/делитель (от тактовой частоты) очень “дешевый”
т.е. коэфициенты фиксированные (8/16/32/64) смотрите даташит он на 128-ю даже на русском есть.
Если не хотите смотреть то CVavr все сам настроит (там “мастер” есть).

SergDoc

Для STM если что подчерпнуть forum.easyelectronics.ru/viewforum.php?f=35
гы-гы на этом форуме хоть в FAQ посылают обычно, не так уж далеко, а таам, сразу в даташиты 😃 эт я так почитал мельком 😃

RaJa
SergDoc:

Для STM если что подчерпнуть forum.easyelectronics.ru/viewforum.php?f=35
гы-гы на этом форуме хоть в FAQ посылают обычно, не так уж далеко, а таам, сразу в даташиты 😃 эт я так почитал мельком 😃

Я на том форуме зареган, но там общие вопросы, а тут конкретные в приложении к коптерной тематике 😃
Конкретный опыт всегда лучше общего )

SergDoc

Да кто там про ремаппинг вопрос поднял? я ж блин три дня как в голову ужаленый ходил, remap у F103 на дополнительные функции порта, в F4 все функции являются альтернативными и выбираются по надобности

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOA,&GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM5);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM5);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM5);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM5);

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

PWM_CH3 JP1_4 PB5 TIM3_CH2 (REMAP) D36

блин, а то что инструкция для F103 я и забыл, и думаю назачем?