Уже совсем незнаю что делать.
Вот прерывание по захвату канал 1 TIM2, диапазон частоты 0-1500Гц на входе, то правильно то неправильно меряет. TIM2 настроен с частотой 24МГц, захват по переднему фронту с нулевым фильтром, по идее TIM2 не будет переполняться при частоте больше 366Гц, при входном сигнале 150Гц, 30Гц заходит в условие if(perepolnenia_T2==0) когда perepolnenia_T2=0, что впринципе указавает на то что либо таймер не успевает переполниться, что ерунда какаято получается. Подскажите какая особенность может в работе с захватом? Ну погрешность потому что в прерывании таймер обнуляется, но не такая же.
CODE
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET)
{
TIM2->SR = (uint16_t)~TIM_IT_CC1;
TIM2->CNT=0;
u32 temp_freq=freq;
count_deg_A=0;
count_deg_C=180;
if(perepolnenia_T2==0)
{
freq=(TIM2->CCR1)/10;
freq=FREQ_CPU/freq; }
}
else
{
temp_freq=(TIM2->CCR1)+0xFFFF*perepolnenia_T2;
temp_freq=temp_freq/10;
freq=(uint16_t)(FREQ_CPU/temp_freq);
}
perepolnenia_T2=0;
n_speed=6*freq/Z_ROTOR;
}
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
TIM2->SR = (uint16_t)~TIM_IT_Update;
perepolnenia_T2++;
if(perepolnenia_T2>3001)
{
freq=0;
n_speed=0;
}
}
}
Или может есть у кого исходник для определения частоты сигнала в диапазоне 0-1500 Гц.
Может таймеры не так настраиваю:
CODE
TIM_TimeBaseInitStruct.TIM_Prescaler=0; // нужно будет менять несколько ступеней для всего диапазона для захвата TIM2
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; // настройка счёта вверх
TIM_TimeBaseInitStruct.TIM_Period=150;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; // предделитель тактирования таймера
/* Инициализация таймеров */
TIM_TimeBaseInit(TIM7, &TIM_TimeBaseInitStruct);
TIM_TimeBaseInitStruct.TIM_Prescaler=0;
TIM_TimeBaseInitStruct.TIM_Period=0xFFFF;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_CenterAligned3; // настройка счёта вверх
TIM_TimeBaseInitStruct.TIM_Prescaler=0;
TIM_TimeBaseInitStruct.TIM_Period=1200;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
/* Заполнение полей структуры таймеров захвата */
TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter=0;
/* настройка захвата */
TIM_ICInit(TIM2, &TIM_ICInitStruct);
/* включение таймеров */
TIM_Cmd(TIM2,ENABLE);
/* Включение переферийных прерываний */
TIM2->SR = (uint16_t)~TIM_IT_Update;
TIM2->SR = (uint16_t)~TIM_IT_CC1;
TIM_ITConfig(TIM2, TIM_IT_Update | TIM_IT_CC1, ENABLE);// по захвату и обновлению - переполнению счётчика таймера
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // конфигурируем приоритетную группу
/* заполнение структуры модуля прерываний таймера 1 */
NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* заполнение структуры модуля прерываний таймера 2 */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
Сообщение отредактировал IgorKossak - Sep 16 2011, 09:32
Причина редактирования: [codebox]