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

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мкс. Вы наверно спросите что нахотся в самом теле таймера, для частоты эксперемента туда помещена всего дна команда на вкл/ светодиода. В чем тут дело?

oleg70
Alexsis1109:

ну для того чтобы посчитать длительность ШИМа

Правильно нужен таймер но надо сначала выбрать какой (8-ми или 16-битный), далее “понеслось”… :
при 8-ми битах он считает макс. до 256, если устраивает Вас эта дискретность на канал (вполне неплохо) делаете расчет тактовой частоты так чтобы не было переполнения за 1м/сек (стандартная длительность импульса аппы), в данном случае 16Mhz/64=250 Khz= 4 мк/с.
На 16-ти битном можно считать уже до 65535 и можно сделать круче…
По моему понятно объяснил: частота такта счетчика=дискретность канала (с учетом емкости самого счетчика)
Все зависит уже от Вашего желания…

Alexsis1109:

тактируется таймер от регистра OCR

Дело в том что от OCR таймер не тактируется, это регистр сравнения (Вы вообще хотите мерять ШИМ или генерить?)
Не пойму…