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

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 я и забыл, и думаю назачем?

RaJa
SergDoc:

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

То есть у F4 можно любую функцию на любой пин назначить?

SergDoc

Нет там боольшая таблица с альтернативными функциями для каждого порта, вот из них можно выбирать нужное…

rual
SergDoc:

в F4 все функции являются альтернативными и выбираются по надобности

Не знал про Ф4, думал как у Ф1. У Ф3 получается как у Ф4.

RaJa
rual:

Не знал про Ф4, думал как у Ф1. У Ф3 получается как у Ф4.

Да вроде все то же самое - несколько альтеранативных функций (обычно 3-5) на пин, какую надо, такую включаешь, как на 103м.

SergDoc

собрал прошивку autoquad блин 430 с гаком килобайт флеши надо, ладно ещё над чемнибудь поиздеваюсь…

Alexsis1109
oleg70:

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

ну для того чтобы посчитать длительность ШИМа нужен счетчик (таймер). Чем чаще этот таймер тикает, теб точнее можно измерить шим. Сейчас у меня таймер заведен на 10мкс, т.е. длительность шима я могу измерить с точностью ±10мкс. Я правильно меряю шим, таймером?

Geniok
Alexsis1109:

ну для того чтобы посчитать длительность ШИМа нужен счетчик (таймер). Чем чаще этот таймер тикает, теб точнее можно измерить шим. Сейчас у меня таймер заведен на 10мкс, т.е. длительность шима я могу измерить с точностью ±10мкс. Я правильно меряю шим, таймером?

Ну в принципе меряете (а точнее отсчитываете) правильно. Смотрите какие предделители у вас есть. От чего тактируете таймер?

У меня вот какой вопрос возник по работе с I2C в stm32.
Есть ли смысл использовать DMA вместо прерываний?
Может кто использовал?

Alexsis1109
Geniok:

Ну в принципе меряете (а точнее отсчитываете) правильно. Смотрите какие предделители у вас есть. От чего тактируете таймер?

предделители все выключил. тактируется таймер от регистра OCR. допустим присваиваем регистру OCR = 100, тогда частота таймера будет f = Fкварца/1+OCR = 14745600/1+100 = 145996 т.е. Т=1/f = 6.85мкс. Т.е. эти 6.85 мкс и есть точность с которой я могу отсчитать шим. Но это слишком грубо, нужно хотябы 1мкс. Но когда я начинаю уменьшать значение OCR, почему то меньше 5.2 мкс период не хочет снижаться. Теоритически при OCR= 10, Т должен = 0,685мкс, а по факту он все ровно 5,2мкс. Вы наверно спросите что нахотся в самом теле таймера, для частоты эксперемента туда помещена всего дна команда на вкл/ светодиода. В чем тут дело?