Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сброс таймера захвата STM32F100
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ELEKTROS
Скажите к примеру конфирурирую TIM2 на захват:
Код
  TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;
  TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Falling;
  TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
  TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
  TIM_ICInitStruct.TIM_ICFilter=0;
  TIM_ICInit(TIM2, &TIM_ICInitStruct);

Будет ли таймер сбрасываться сам при захвате? или нужно обнулять счётчик вручную? или где еще чего прописать чтобы он сам сбрасывался?
AHTOXA
Не будет. Обнулять вручную тоже не нужноsm.gif
Представьте, что вы используете не один, а несколько модулей захвата, и каждый из них сбрасывает счётчик. Ерунда получится.
Просто запоминайте состояние предыдущего захвата, и высчитывайте разницу.
ELEKTROS
Так я же один всево то использую sm.gif.
Конкретна задача: сигнал частотой от 0 до 1500Гц, дискретность 1 герц. Тактирование ядра, да и таймера 24 МГц, приходиться три различных делителя таймера использовать: 2000, 15,1, чтобы покрыть весь диапазон, и считаю что лучше производить сброс, чем делать условие и разность двух значений.
AHTOXA
Цитата(ELEKTROS @ Jul 11 2011, 16:59) *
Так я же один всево то использую sm.gif.

Это покаsm.gif
Цитата(ELEKTROS @ Jul 11 2011, 16:59) *
считаю что лучше производить сброс, чем делать условие и разность двух значений.

Условия не надо, просто разность. Ну или если уж так охота делать сброс, то вручную. Хотя это сильно снизит точность, потому что добавится время на вход в прерывание.
ELEKTROS
Прерывания и так использую, там с фронтом некоторый процесс синхронизировать требуется.
ELEKTROS
уже совсем незнаю что делать.
Вот прерывание по захвату диапазон частоты 0-1500Гц, неправильно меряет. TIM2 настроен с частотой 24МГц, захват по переднему фронту с нулевым фильтром, по идее TIM2 не будет переполняться при частоте больше 366Гц, при входном сигнале 150Гц, 30Гц заходит в условие if(perepolnenia_T2==0) когда perepolnenia_T2=0, что впринципе указавает на то что либо таймер не успевает переполниться, что ерунда какаято получается. Подскажите какая особенность может в работе с захватом? Ну погрешность, но не такая же.
Код
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 Гц.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.