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

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:

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

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

Alexsis1109
Geniok:

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

SergDoc:

спасибо!!!

rual
mahowik:

дрейф быстрого/высокочастотного вектора гиры компенсируется НЧ вектором акселя:

Да, у меня вобщем то так и сделано, динамическая часть считается по ДУСу, а статическая по акселю и компасу. Динамическая часть корректируетя статической через малый коэффициент, только вместо обычных векторов кватернионы.

mahowik

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

SergDoc

сижу переписываю порты под себя и всё больше закрадывается мысль, а не пошло-бы оно всё, плюнуть и начать собирать новый проект(без maple) , но если чесно - боюсь… блин я ж проект от мелкоплаты перетащил под эклипс, пойду ка поковыряю, библиотеки только все достать…

RaJa
SergDoc:

сижу переписываю порты под себя и всё больше закрадывается мысль, а не пошло-бы оно всё, плюнуть и начать собирать новый проект(без maple) , но если чесно - боюсь… блин я ж проект от мелкоплаты перетащил под эклипс, пойду ка поковыряю, библиотеки только все достать…

Давно пора выкинуть maple. У меня вот проблема - не разобрался пока с математикой. У меня вообще с ней плохо. понимал бы как оно работает, написать код было бы проще. ну и работу с сенсорами нужно изучить. STM32 только только начал изучать

SergDoc

Подготовил чистое IDE на Eclipse+arm_plugins, gcc+cygwin+openocd, библиотеки для F4,
в git выкладывать? здоровая зараза 😦

SergDoc

давно хочу но как-то руки не доходят, при арминге сделать запуск моторов поочерёдно: один набрал обороты, включился следующий и т.д. реально? но minthrottle 1250-1300 дабы моторы потом не останавливались?

Geniok
SergDoc:

давно хочу но как-то руки не доходят, при арминге сделать запуск моторов поочерёдно: один набрал обороты, включился следующий и т.д. реально? но minthrottle 1250-1300 дабы моторы потом не останавливались?

А практический смысл в этом какой? Или просто так?
Minthrottle вроде 1150-1200 должно вполне хватать, 1300 не великовато ли будет, при одном работающем не будет ли клонить на 1 сторону ?

SergDoc

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

SergDoc

ковыряю всяко разны файлы и вот что:
startup_stm32f4xx.s


.syntax unified
  .cpu cortex-m3
  .fpu softvfp
  .thumb

это как это?
ядро вроде же Cortex-M4 да и fpu присутствует?

SergDoc

у Ф4 что нет калибровки АЦП?
как на Ф10х

 // Calibrate ADC
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));

не катит, может как-то по другому это обзывается?

rual
SergDoc:

у Ф4 что нет калибровки АЦП?
как на Ф10х
не катит, может как-то по другому это обзывается?

Ф4 пока не трогал, но библиотеке действительно нет функций калибровки АЦП
Вот весь код инициализации из демки:

/******************************************************************************/
/*  ADCs configuration: triple interleaved with 5cycles delay to reach 6Msps  */
/******************************************************************************/
  /* ADC Common configuration *************************************************/
  ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_Interl;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInit(&ADC_CommonInitStructure);
  /* ADC1 regular channel 12 configuration ************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC1, &ADC_InitStructure);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_3Cycles);

  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);
  /* ADC2 regular channel 12 configuration ************************************/
  ADC_Init(ADC2, &ADC_InitStructure);
  /* ADC2 regular channel12 configuration */
  ADC_RegularChannelConfig(ADC2, ADC_Channel_12, 1, ADC_SampleTime_3Cycles);
  /* ADC3 regular channel 12 configuration ************************************/
  ADC_Init(ADC3, &ADC_InitStructure);

  /* ADC3 regular channel12 configuration *************************************/
  ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 1, ADC_SampleTime_3Cycles);
  /* Enable DMA request after last transfer (multi-ADC mode) ******************/
  ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
  /* Enable ADC1 **************************************************************/
  ADC_Cmd(ADC1, ENABLE);
  /* Enable ADC2 **************************************************************/
  ADC_Cmd(ADC2, ENABLE);
  /* Enable ADC3 **************************************************************/
  ADC_Cmd(ADC3, ENABLE);

думаю ,калиброквку можешь смело комментировать.

Вот ссылка на офиц. демо набор www.st.com/web/en/catalog/tools/PF257904

SergDoc

я так и сделал 😦
потихоньку разбираюсь, вот с прерываниями вроде подружился, а вот порт просто переключить digitalLo digitalHi не получилось - не имеет, аж страшно писать, члена BSRR ну и т.д. ладно разберу 😃

rual:

Вот ссылка на офиц. демо набор

он у меня есть…