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

Alexsis1109
Geniok:

Погоди, так PPM приходит же единым пакетом. Все каналы сразу. Значит тебе для его обработки нужна всего 1 ножка. И с помощью этой 1 ножки ты и обрабатываешь все свои 7 каналов. Тебе нужно ловить только переходы из 0 в 1 и из 1 в 0 и все, как написали выше.

да, согласен, РРМ это 1 канал. Но откуда его взять в обычном приемнике? я так понимаю, приемник ловит РРМ и разделяет его на все 7 ножек в отдельности…

rual
SergDoc:

вместо ифк датчиков прислали 4 пирометра, поругаться или с пирометрами что-нибудь замутить?

Это подстава, “прорекламируй” поставщика.

Razek:

А поделитесь ссылкой на математику?

ищем по “расстояние между точками на поверхности земли”, там мног всего, для начала gis-lab.info/qa/great-circles.html см. реализацию для эсель (наиболее близко к Си). Из этого просто нужно сделать 2мерный вектор ХУ.

mahowik:

а по чем там X,Y корректится? гпс? optflow?

нет, это чистый горизонт, линейные перемещения пока сам планирю считать. Просто более простой и понятной (мне) реализации не встречал. Только у него все лишние члены векторных произведений типа (1,0,0)х(0,0,1) исключены, я же всё делал “академически” ибо изобретал “велосипед” с нуля (т.е. с высоты своих познаний)

mahowik:

глянул… не потянет авр-ка похоже…

А ты попробуй, ДЦМ помоему шибко хуже.

mahowik:

Вот код ПД-части по гире:

Я как раз пор это, ПИ-регулятор комплементарного филтра. Тут палка о двух концах, сделаешь большой И - будет перекомпенсация (горизонт будет крыльями махать), при маленьком И будет нескомпенсированый завал в одну из сторон.

mahowik:

в крутых контроллерах типа немец, наза, а также от vis.asta так и сделано…

Тут по другому никак, более оперативных перемещения датчиков нет

mahowik:

он кстати про mpu6050

нет, он кстати про МПУ6000 на ПХ4м контроллере.

mahowik:

вот вариант красивый, но дороговато

Да, это сказка, то что нужно для конкурса (только тссс!), вот только стоил бы он баксов 70. А так я сам такой собиру, нужно только дождаться цифровой камеры от китайцких товарищей. Я видел где-то на датчике от мыши, просто туда был прикручен объектив от камеры.

oleg70:

Ломаю голову, как бы разделить линейные ускорения и крен у акселя… пока глухо.

“Академически” делается предельно просто: поворачиваем вектор акселя в мировую СК и вычитаем вектор нормали (0,0,-1) или (0,0,1) зависит от “полярности” акселя. В остатке все остальные ускорения 😁, в т.ч. ошибка горизонта. В моей вылолженной проге вроде есть функции в класcе INS.

Geniok
Alexsis1109:

да, согласен, РРМ это 1 канал. Но откуда его взять в обычном приемнике? я так понимаю, приемник ловит РРМ и разделяет его на все 7 ножек в отдельности…

Ааа, так у вас обычный приемник…
Пришла тут идея, если свести все каналы в один, соединив их между собой после выхода из приемника?
Так как импулься между собой разделены, то они перекрываться не будут, тогда все 7 каналов можно пустить по 1 проводу и подцепить к одному каналу таймера.

SergDoc
rual:

Это подстава, “прорекламируй” поставщика.

dx 😦 я писал раньше что посылка потерялась, а потом ещё не мог найти их (датчики) чтоб показать, а оказывается их уже нет, вот они и переслали новую с датчиками движения на пирометрах 😦 я один сегодня на работе уже сломал 😃 ладно фиг с ними, невелика потеря, сейчас уныло смотрю в код AeroQad сколько всего переделать то надо - ууу, никак не насмелюсь пока даже порты переписывать, а надо ещё gps от арду впихнуть (он там есть но надо правильно библиотеки подключать научится), удержание высоты сделано чисто на баро 😦 сонара нет, короче пахать и пахать, а хочется сделать cli, дабы не компилить постоянно для изменения аппарата или там подключения модулей (gps, сонар…) ну и всяких там расширеных возможностей по настройке, а без мативатора (платы) как-то ничего не хочется делать…

Geniok
SergDoc:

dx 😦

Один раз связывался с dx, больше я туда ни ногой…

SergDoc
Geniok:

Пришла тут идея, если свести все каналы в один, соединив их между собой?

это не панацея, и где гарантии что вы не убъёте приёмник, есть простое решение о котором уже писал, сам с такой штукой летаю, правда просто потому, что куча проводов задолбала…

Alexsis1109
SergDoc:

есть простое решение о котором уже писал

напишите еще раз, пожалуйста) а то искать замучаюсь…

SergDoc

на синенькое тыкаем и ждём… пост 49

mahowik
rual:

Я как раз пор это, ПИ-регулятор комплементарного филтра. Тут палка о двух концах, сделаешь большой И - будет перекомпенсация (горизонт будет крыльями махать), при маленьком И будет нескомпенсированый завал в одну из сторон.

вот вот! я когда с MARG-ом игрался, потратил кучу времени на настройку пид параметров компл. филтра (КФ), но так и не получил стабильного результата…
Но решение есть. Я както с Олегом (Syberian) общался по этому поводу и он наткнулся на туже проблему… Если пральна помню, то выкидываешь ПИД регуль из КФ и оставляешь, класический КФ, где дрейф быстрого/высокочастотного вектора гиры компенсируется НЧ вектором акселя:
Vg = Vg * (1 - 1/k) + Va * 1/k
где Vg - вектор гиры, Va - вектор акселя, на твой цикл (380 герц вроде) к=400…600

rual:

нет, он кстати про МПУ6000 на ПХ4м контроллере.

на его контроллере совсем не mpu6050/6000… а вот когда он писал порт на PX4, то сильно его ругал

Geniok
SergDoc:

это не панацея, и где гарантии что вы не убъёте приёмник,

Согласен, тут гарантий нет, есть 1 приемник, надо будет попробовать…

Alexsis1109
SergDoc:

на синенькое тыкаем и ждём… пост 49

49 пост в этой ветке??

Alexsis1109

вот к стати, кто-нибудь знает как устроен захват ШИМа в этом китайском контроллере??? там атмега328, в которой тоже только 2 аппаратных прерываний с захватом. а принимает она 4 канала на каждую ножку.

SergDoc

вам в си в ассеме или на пальцах?

// RX_ROLL
ISR(PCINT2_vect)
{
	if ( RX_ROLL )			// rising
	{
		RxChannel1Start = TCNT1;

	} else {				// falling
		RxChannelsUpdatingFlag = 1;
		RxChannel1 = TCNT1 - RxChannel1Start;
		RxChannelsUpdatingFlag = 0;
	}
}

// RX_PITCH
ISR(INT0_vect)
{
	if (RX_PITCH)
	{
		RxChannel2Start = TCNT1;

	} else {				// falling
		RxChannelsUpdatingFlag = 1;
		RxChannel2 = TCNT1 - RxChannel2Start;
		RxChannelsUpdatingFlag = 0;
	}
}

// RX_COLL
ISR(INT1_vect)
{
	if (RX_COLL)
	{
		RxChannel3Start = TCNT1;

	} else {				// falling
		RxChannelsUpdatingFlag = 1;
		RxChannel3 = TCNT1 - RxChannel3Start;
		RxChannelsUpdatingFlag = 0;
	}
}

// RX_YAW
ISR(PCINT0_vect)
{
	if ( RX_YAW )			// rising
	{
		RxChannel4Start = TCNT1;

	} else {				// falling
		RxChannelsUpdatingFlag = 1;
		RxChannel4 = TCNT1 - RxChannel4Start;
		RxChannelsUpdatingFlag = 0;
	}
}
////////////////////////////////////////////////////////////////////////////////////////////////

// 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

kkmulticopter.com/index.php?option=com_content&vie…

Alexsis1109
SergDoc:

вам в си в ассеме или на пальцах?

если можно, сначала на пальцах…

и к стати, чем отличается PCINT от просто INT?

Sir_Alex

Ребята, здесь последние несколько страниц, на пальцах рассказано как обрабатывать сигналы от приемника. Причем все варианты, от PPM до PWM. От использования ICP до обычных пинов. Сколько ж можно то?

Geniok
Alexsis1109:

если можно, сначала на пальцах…

Так там же вроде по коду все итак понятно, по фронту запоминаешь значение счетчика таймера, по спаду считаешь разницу между текущим значением и тем, что запомнил до этого…