2015-09-15 2:37 AM
Hello, i am trying to measure a rc pwm signal (from a single channel of a rc receiver)
This signal has a total period of 20ms (50 hz) The active pulse is between 900us and 2000us width Strangely i have a similar aproach with a stm32f4 device where i have no overflow of the ''delta'' value So my APB clock is 60mhz, the prescaled value is 59 ( 60-1) , therefore my counter ticks at 1us rate And since i have 16bit timer only, i filed the period register with 0xFFFF (65535) This gives me a 26 hz ... normaly i am not intrested in this frequency ( or should i? )TIM_TimeBaseStructure.TIM_Prescaler = 59;
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// configure Timer3 Channel 3
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x00;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
// configure Timer3 Channel 4
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
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(TIM3, &TIM_ICInitStructure);
// Configure Timer2 Interupt Sources */
// TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE); // enable Channel 3 capture interupt
TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);// enable Channel 4 capture interupt
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
//enable tim2 irq
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =6;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE); // Start the Timer
And bellow is my timer3 handler
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_CC3) == SET){ // If Low-Hi transition occured
TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
capHi = TIM_GetCapture3(TIM3); // Get timer counts for Period
GPIO_SetBits(GPIOA,red);
GPIO_SetBits(GPIOB,GPIO_Pin_2);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
}
if(TIM_GetITStatus(TIM3, TIM_IT_CC4) == SET){ // If Hi-Low transition occured
TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
capLo= TIM_GetCapture4(TIM3); // Get timer counts for Period
GPIO_ResetBits(GPIOA,red);
GPIO_SetBits(GPIOB,GPIO_Pin_10);
GPIO_ResetBits(GPIOB,GPIO_Pin_10);
}
delta=capLo-capHi; // get the actual high period of the signal
/***** send the values to serial *****/
sprintf(txt,''%u'',capHi);
USART_Puts('' capHi: '');
USART_Puts(txt);
sprintf(txt,''%u'',capLo);
USART_Puts('' capLo: '');
USART_Puts(txt);
sprintf(txt,''%u'',delta);
USART_Puts('' delta: '');
USART_Puts(txt);
USART_Puts(''\r\n'' );
}
And bellow i have ploted some serial data , the red values are the bad ones, and i want to know is there a way to overcome this issue?
capHi: 27149 capLo: 28140 delta: 991
capHi: 15668 capLo: 16659 delta: 991
capHi: 4188 capLo: 52696 delta:
48508
capHi: 40226 capLo: 41217 delta: 991 capHi: 28748 capLo: 29738 delta: 990 capHi: 64784 capLo: 239 delta: 991 capHi: 53301 capLo: 54292 delta: 991 capHi: 23801 capLo: 24791 delta: 990 capHi: 12319 capLo: 13310 delta: 991 capHi: 838 capLo: 1828 delta: 990 capHi: 36874 capLo: 37865 delta: 991 capHi: 25394 capLo: 26384 delta: 990 capHi: 61431 capLo: 62422 delta: 991 capHi: 49950 capLo: 50941 delta: 991 capHi: 38467 capLo: 21440 delta:48509
capHi: 8969 capLo: 9960 delta: 991 capHi: 63025 capLo: 64016 delta: 991 capHi: 33528 capLo: 34518 delta: 990 capHi: 22047 capLo: 23037 delta: 9902015-09-15 6:58 AM
>
/***** send the values to serial *****/
In an ISR? It's a bad idea. How long does this take? If it would be short enough, you'd see only one of the two values changed in each message.
JW
We’re moving the ST Community to a new platform to give you a better and more reliable community experience.