Создание собственной системы стабилизации
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
328мега , атмега2560 ну и там всякие производные
вот настройка портов Код:
о_0. Вы разбираетесь в этом коде??
есть маленький проблем, это ардуино со своими библиотеками и всеми вытекающими, но есть такой контроллер - КУК 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
когда-то баловался переписывал порты, давно…
спасибо за ссылку. а конкретно по таймеру в атмеге сможете что-то посоветовать? как его настроить на 0,5мкс?
да - это порт MultiWii
я у себя на мелкоплате выкинул и повесил на проводках MS5611 - небо и земля…
Он, зараза стоит около 18 баксов с обвязкой. Заказать что ли…
есть маленький проблем, это ардуино со своими библиотеками и всеми вытекающими, но есть такой контроллер - КУК kkmulticopter.com/index.php?option=com_content&vie… там исходники чисто под AVRStudio есть на си, есть на ассеме, когда-то баловался переписывал порты, давно…
Кук вроде только на асме, по крайней мере на С я что-то не нашел.
Minsoo Kim писал на си
Minsoo Kim писал на си
А, нашел, версия 1.5 с сырцами, там есть немножко полезного для AVR кода
сможете что-то посоветовать? как его настроить на 0,5мкс?
Немного не понял, что значит 0.5 мкс (частота тактирования чтоль?)
А вообще в ATmega-х пред/делитель (от тактовой частоты) очень “дешевый”
т.е. коэфициенты фиксированные (8/16/32/64) смотрите даташит он на 128-ю даже на русском есть.
Если не хотите смотреть то CVavr все сам настроит (там “мастер” есть).
Для STM если что подчерпнуть forum.easyelectronics.ru/viewforum.php?f=35
гы-гы на этом форуме хоть в FAQ посылают обычно, не так уж далеко, а таам, сразу в даташиты 😃 эт я так почитал мельком 😃
Для STM если что подчерпнуть forum.easyelectronics.ru/viewforum.php?f=35
гы-гы на этом форуме хоть в FAQ посылают обычно, не так уж далеко, а таам, сразу в даташиты 😃 эт я так почитал мельком 😃
Я на том форуме зареган, но там общие вопросы, а тут конкретные в приложении к коптерной тематике 😃
Конкретный опыт всегда лучше общего )
Да кто там про ремаппинг вопрос поднял? я ж блин три дня как в голову ужаленый ходил, 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 я и забыл, и думаю назачем?
Да кто там про ремаппинг вопрос поднял? я ж блин три дня как в голову ужаленый ходил, remap у F103 на дополнительные функции порта, в F4 все функции являются альтернативными и выбираются по надобности
То есть у F4 можно любую функцию на любой пин назначить?
Нет там боольшая таблица с альтернативными функциями для каждого порта, вот из них можно выбирать нужное…
в F4 все функции являются альтернативными и выбираются по надобности
Не знал про Ф4, думал как у Ф1. У Ф3 получается как у Ф4.
Не знал про Ф4, думал как у Ф1. У Ф3 получается как у Ф4.
Да вроде все то же самое - несколько альтеранативных функций (обычно 3-5) на пин, какую надо, такую включаешь, как на 103м.
собрал прошивку autoquad блин 430 с гаком килобайт флеши надо, ладно ещё над чемнибудь поиздеваюсь…
Немного не понял, что значит 0.5 мкс (частота тактирования чтоль?)
А вообще в ATmega-х пред/делитель (от тактовой частоты) очень “дешевый”
т.е. коэфициенты фиксированные (8/16/32/64) смотрите даташит он на 128-ю даже на русском есть.
ну для того чтобы посчитать длительность ШИМа нужен счетчик (таймер). Чем чаще этот таймер тикает, теб точнее можно измерить шим. Сейчас у меня таймер заведен на 10мкс, т.е. длительность шима я могу измерить с точностью ±10мкс. Я правильно меряю шим, таймером?
ну для того чтобы посчитать длительность ШИМа нужен счетчик (таймер). Чем чаще этот таймер тикает, теб точнее можно измерить шим. Сейчас у меня таймер заведен на 10мкс, т.е. длительность шима я могу измерить с точностью ±10мкс. Я правильно меряю шим, таймером?
Ну в принципе меряете (а точнее отсчитываете) правильно. Смотрите какие предделители у вас есть. От чего тактируете таймер?
У меня вот какой вопрос возник по работе с I2C в stm32.
Есть ли смысл использовать DMA вместо прерываний?
Может кто использовал?
Ну в принципе меряете (а точнее отсчитываете) правильно. Смотрите какие предделители у вас есть. От чего тактируете таймер?
предделители все выключил. тактируется таймер от регистра 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мкс. Вы наверно спросите что нахотся в самом теле таймера, для частоты эксперемента туда помещена всего дна команда на вкл/ светодиода. В чем тут дело?
ну для того чтобы посчитать длительность ШИМа
Правильно нужен таймер но надо сначала выбрать какой (8-ми или 16-битный), далее “понеслось”… :
при 8-ми битах он считает макс. до 256, если устраивает Вас эта дискретность на канал (вполне неплохо) делаете расчет тактовой частоты так чтобы не было переполнения за 1м/сек (стандартная длительность импульса аппы), в данном случае 16Mhz/64=250 Khz= 4 мк/с.
На 16-ти битном можно считать уже до 65535 и можно сделать круче…
По моему понятно объяснил: частота такта счетчика=дискретность канала (с учетом емкости самого счетчика)
Все зависит уже от Вашего желания…
тактируется таймер от регистра OCR
Дело в том что от OCR таймер не тактируется, это регистр сравнения (Вы вообще хотите мерять ШИМ или генерить?)
Не пойму…
Правильно нужен таймер но надо сначала выбрать какой (8-ми или 16-битный),
конечно, таймер у меня 8-ми битный. Мне и надо считать то в идеале до 10))) я же говорю что ставлю 100 в регистр OCR, т.е. он считает до 100 и при этом выдает длительность в 6,85мкс.
делаете расчет тактовой частоты так чтобы не было переполнения за 1м/сек (стандартная длительность импульса аппы), в данном случае 16Mhz/64=250 Khz= 4 мк/с.
а вот это не совсем понял. вы хотите сказать, что точность отсчитывания шима достаточна в 4мкс?
16Mhz/64=250
что такое 64?
Дело в том что от OCR таймер не тактируется, это регистр сравнения (Вы вообще хотите мерять ШИМ или генерить?)
Не пойму…
хочу мерить ШИМ