2015-07-04 10:33 AM
Hello all,
i am trying to capture a ppm signal, for the moment i use a steady fixed widith signal of 740hz, with 1050us on period, and 300us off period. The signal going to PA0 and PA1 of my STM32F4 I have several questions: I noticed if i use as trigger TIM_TS_TI1FP1 , the event interupt ocures at the specific frequency of the signal wich i have it on the input of mcu, this somehow overides my timebase period/prescale setings. Is this true? When performing a readout of the counter register, it is reseted just by reading it? The counter registers are automaticly cleard when a new rise/fall it event ocurrs? I am afraid i did not understand exactly the corelation between timer clock and the counting register... With the code bellow my raw values for the given 740hz signal are Capture1 = 4430 Capture2 = 1890 Is there a specific formula for calculate the ''ON'' period in microseconds? My timer settings are like in the following codeRCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE); //Enable the GPIOx AHB clock
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
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_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure Timer2 timebase */
TIM_TimeBaseStructure.TIM_Prescaler = 9;
TIM_TimeBaseStructure.TIM_Period = 6999;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* configure Timer2 Channel 1 */
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /*Capture performed each time an edge is detected on the capture input. */
TIM_ICInitStructure.TIM_ICFilter = 0x00;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
/* configure Timer2 Channel 2 */
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x00;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
/* Configure Timer2 Interupt Sources */
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); // enable Channel 1 capture interupt
TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);// enable Channel 2 capture interupt
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //enable interupt events
TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); /* Rising edge of the selected trigger input
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE); // Start the Timer
Bellow are the Interupts
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == 1)// If compare capture has occured
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
capture1 = TIM_GetCapture1(TIM2); // Get timer counts for Period
GPIO_ToggleBits(GPIOD,GPIO_Pin_5); // just some toggle for logic analyzer
GPIO_ToggleBits(GPIOD,GPIO_Pin_5);
}
if(TIM_GetITStatus(TIM2, TIM_IT_CC2) == 1)// If compare capture has occured
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
capture2= TIM_GetCapture2(TIM2);
GPIO_ToggleBits(GPIOD,GPIO_Pin_9); // just some toggle for logic analyzer
GPIO_ToggleBits(GPIOD,GPIO_Pin_9);
}
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // Counter overflow, reset interrupt
GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
}
}
2015-07-05 07:37 AM
You're right, i forgot when i pasted the code .
I not used any delta values, because the values are very true already from the capture register. For example my signal is 1050us on, and 300us off And the values coming out from capture1 are ton+toff ( 1350 us) and on capture2 i have 300us. Just did a simple substraction capture1=capture1-capture2 Does the dma automaticly fills the array with values from the timer capture register? Do you have a example code of using ppm and DMA for timer input capture?if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == 1)// If compare capture has occured
{ TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); capture1 = TIM_GetCapture1(TIM2); // Get timer counts for Period capture1 = capture1 -capture2 ; // get the Toff value between pulses if (capture1 >2000){ uu=7;} //if we detect the ''dead pulse'' reset pulse index uu++;if
(uu>7){ uu=0;} // if the index reached maximum allowed index, reset it !
}