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

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 таймер не тактируется, это регистр сравнения (Вы вообще хотите мерять ШИМ или генерить?)
Не пойму…

Alexsis1109
oleg70:

Правильно нужен таймер но надо сначала выбрать какой (8-ми или 16-битный),

конечно, таймер у меня 8-ми битный. Мне и надо считать то в идеале до 10))) я же говорю что ставлю 100 в регистр OCR, т.е. он считает до 100 и при этом выдает длительность в 6,85мкс.

oleg70:

делаете расчет тактовой частоты так чтобы не было переполнения за 1м/сек (стандартная длительность импульса аппы), в данном случае 16Mhz/64=250 Khz= 4 мк/с.

а вот это не совсем понял. вы хотите сказать, что точность отсчитывания шима достаточна в 4мкс?

oleg70:

16Mhz/64=250

что такое 64?

oleg70:

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

хочу мерить ШИМ

oleg70

Тогда так: имеем длительность ШИМ импульса от 1 милисек. до 2-милисек. (стандарт!) итого 1 милисек.
В одну миллисекунду “влазит” 250 импульсов по 4 микросекунды (не так ли?)
Вот Вам и дискрет. на канал, и частота тактирования счетчика (250 кГц)
Что значит " считать то в идеале до 10 " ? ВЫ что количество что ль посчитать хотите?

Alexsis1109
oleg70:

В одну миллисекунду “влазит” 250 импульсов по 4 микросекунды (не так ли?)
Вот Вам и дискрет. на канал, и частота тактирования счетчика (250 кГц)
Что значит " считать то в идеале до 10 " ? ВЫ что количество что ль посчитать хотите?

да, если 1мс разбить на 250 импульсов то будет 4мкс. Вы считаете этого будет достаточно? сейчас у меня дискретность 10мкс, это очень грубо получается.
если я присвою регистру сравнения OCR число 10, то по идее, по формуле, дискретность должна стать 0,68мкс.