2014-05-16 03:52 PM
Hi,
I am trying to get the duration of a signal with input capture of timer. I have two signals, which are comming from another chip, CLK and OUT. CLK is 125 KHz and OUT is variable between ~3.5KHz and 4KHz. I clocked the timer4 from clk input, which is connected to CH1 of the timer. OUT is connected to CH3 of the timer4. I want to count the duration of the signal on
high level
and on
low level
. In the standard library example it measures only one edge. I set the timer on both edges, one is direct, other is indirect. How can I count the duration of ''1''s and ''0''s, since there is only one counter register?
chip: STM32F105
initialization:
#define TIMER_NR TIM4
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBase_InitStructure.TIM_Period = 65535;
TIM_TimeBase_InitStructure.TIM_Prescaler = 0;
TIM_TimeBaseInit(TIMER_NR, &TIM_TimeBase_InitStructure);
TIM_TIxExternalClockConfig(TIMER_NR, TIM_TIxExternalCLK1Source_TI1, TIM_ICPolarity_Rising, 0);
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 = 0;
TIM_ICInit(TIMER_NR, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI; //ch3
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0;
TIM_ICInit(TIMER_NR, &TIM_ICInitStructure);
TIM_ITConfig(TIMER_NR, TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
TIM_Cmd(TIMER_NR, ENABLE);
interrupt handler:
void TIM4_IRQHandler(void)
{
static uint16_t value = 0, old_val = 0, diff = 0, sync = 0, insync = 0;
static uint8_t input_pin, bitcount = 0;
if(TIM_GetITStatus(TIMER_NR, TIM_IT_CC3) == SET)
{
TIM_ClearITPendingBit(TIMER_NR, TIM_IT_CC3);
IC4ReadValue1 = TIM_GetCapture3(TIMER_NR);
}
if(TIM_GetITStatus(TIMER_NR, TIM_IT_CC4) == SET)
{
TIM_ClearITPendingBit(TIMER_NR, TIM_IT_CC4);
IC4ReadValue2 = TIM_GetCapture4(TIMER_NR);
}
}
If i subtract both values
IC4ReadValue2
and
IC4ReadValue1 I can get the delta for high level, how can I get low level as well?
Thanks.
2014-05-16 04:15 PM
How can I count the duration of ''1''s and ''0''s, since there is only one counter register?
There are however FOUR latches. The counter is the time base, you latch the count into one latch on the rising edge, and the falling edge on the second latch. Interrupt on CC1 (Rising) Current CC1 - Last CC1 = Period in ticks of the Time Base Current CC1 - Current CC2 = Low time in ticks of the Time Base Current CC2 - Last CC1 = High time in ticks of the Time Base2014-05-17 03:37 PM