Создание собственной системы стабилизации
на синенькое тыкаем и ждём… пост 49
49 пост в этой ветке??
49 пост в этой ветке??
вот к стати, кто-нибудь знает как устроен захват ШИМа в этом китайском контроллере??? там атмега328, в которой тоже только 2 аппаратных прерываний с захватом. а принимает она 4 канала на каждую ножку.
вам в си в ассеме или на пальцах?
// 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
вам в си в ассеме или на пальцах?
если можно, сначала на пальцах…
и к стати, чем отличается PCINT от просто INT?
Ребята, здесь последние несколько страниц, на пальцах рассказано как обрабатывать сигналы от приемника. Причем все варианты, от PPM до PWM. От использования ICP до обычных пинов. Сколько ж можно то?
если можно, сначала на пальцах…
Так там же вроде по коду все итак понятно, по фронту запоминаешь значение счетчика таймера, по спаду считаешь разницу между текущим значением и тем, что запомнил до этого…
и к стати, чем отличается PCINT от просто INT?
Так там же вроде по коду все итак понятно, по фронту запоминаешь значение счетчика таймера, по спаду считаешь разницу между текущим значением и тем, что запомнил до этого…
спасибо!!!
дрейф быстрого/высокочастотного вектора гиры компенсируется НЧ вектором акселя:
Да, у меня вобщем то так и сделано, динамическая часть считается по ДУСу, а статическая по акселю и компасу. Динамическая часть корректируетя статической через малый коэффициент, только вместо обычных векторов кватернионы.
Но на сколько я понял, схождение/корректировка кватернионов у тебя сделана через пид регуль. Так вот его его и надо выкинуть, заменив обычным компл. фильтром…
сижу переписываю порты под себя и всё больше закрадывается мысль, а не пошло-бы оно всё, плюнуть и начать собирать новый проект(без maple) , но если чесно - боюсь… блин я ж проект от мелкоплаты перетащил под эклипс, пойду ка поковыряю, библиотеки только все достать…
сижу переписываю порты под себя и всё больше закрадывается мысль, а не пошло-бы оно всё, плюнуть и начать собирать новый проект(без maple) , но если чесно - боюсь… блин я ж проект от мелкоплаты перетащил под эклипс, пойду ка поковыряю, библиотеки только все достать…
Давно пора выкинуть maple. У меня вот проблема - не разобрался пока с математикой. У меня вообще с ней плохо. понимал бы как оно работает, написать код было бы проще. ну и работу с сенсорами нужно изучить. STM32 только только начал изучать
Подготовил чистое IDE на Eclipse+arm_plugins, gcc+cygwin+openocd, библиотеки для F4,
в git выкладывать? здоровая зараза 😦
давно хочу но как-то руки не доходят, при арминге сделать запуск моторов поочерёдно: один набрал обороты, включился следующий и т.д. реально? но minthrottle 1250-1300 дабы моторы потом не останавливались?
давно хочу но как-то руки не доходят, при арминге сделать запуск моторов поочерёдно: один набрал обороты, включился следующий и т.д. реально? но minthrottle 1250-1300 дабы моторы потом не останавливались?
А практический смысл в этом какой? Или просто так?
Minthrottle вроде 1150-1200 должно вполне хватать, 1300 не великовато ли будет, при одном работающем не будет ли клонить на 1 сторону ?
зависит от регулей, я себе устанавливаю 1300 дабы точно не заглохли, практического никакого, просто, думаю, красиво…
ковыряю всяко разны файлы и вот что:
startup_stm32f4xx.s
.syntax unified
.cpu cortex-m3
.fpu softvfp
.thumb
это как это?
ядро вроде же Cortex-M4 да и fpu присутствует?
у Ф4 что нет калибровки АЦП?
как на Ф10х
// Calibrate ADC
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
не катит, может как-то по другому это обзывается?
у Ф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