Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103 + Encoder
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
KSN
В STM32F103 имеется 16-и битный счетчик, к которому можно подключить квадратурный энкодер. Мне необходимо реализовать 32 битный счетчик. Частота сигнала в среднем 60кГц(максимум 120кГц). Может кто реализовывал подобную задачу, поделитесь мыслями: как реализовать 32 битный счетчик? Программно или может состыковать пару таймеров между собой(возможно через внешние выводы). Вариант взять вместо STM32F103 кристалл STM32F205 рассматривается, но ценник у первого ~3$, у второго 8$
Bandy
Подобную проблему решили так.
Настраиваем таймер с энкодером на прерывания по переполнению, в обработчике прерываний, в зависимости от направления счета таймера, увеличиваем или уменьшаем старшую часть счета. К сожаленью по другому ни как.
Если не нужно определять направление счета то можно соеденить два счетчика каскадно
sergeymen
Вполне возможно сделать каскадно таймеры.
KSN
Цитата(sergeymen @ Aug 3 2012, 10:52) *
Вполне возможно сделать каскадно таймеры.

Как? Должнен быть прямой и обратный счет каскадированного 32-х битного таймера.
sergeymen
Цитата(KSN @ Aug 3 2012, 08:48) *
Как? Должнен быть прямой и обратный счет каскадированного 32-х битного таймера.

Да, точно, с реверсом не получится...
Spider
Всем привет! А не подскажете как правильно настроить таймер на Энкодер?
У меня энкодер подключен к TIM4 CH1/CH2, всё как бы настроил и кручу энкодер, но счётчик только уменьшается, при вращении в любую сторону. Что может быть не так?
Код
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  
  TIM_DeInit(TIM4);
  
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_Period = 0xFFF;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
adnega
Задействовать TIM_SelectHallSensor.
Gunner
QUOTE (Alexey Belyaev @ Sep 28 2012, 21:39) *
Всем привет! А не подскажете как правильно настроить таймер на Энкодер?
У меня энкодер подключен к TIM4 CH1/CH2, всё как бы настроил и кручу энкодер, но счётчик только уменьшается, при вращении в любую сторону. Что может быть не так?

1) Enable the GPIO Clock for TIMx pins (CH1, CH2): RCC_AHB1PeriphClockCmd()
2) Enable the Peripheral Clock for TIMx: RCC_APB1PeriphClockCmd() or RCC_APB2PeriphClockCmd()
3) Configure CH1 and CH2 pins as alternate function: GPIO_PinAFConfig(), GPIO_Init()
4) TIMx Configuration: TIM_TimeBaseInit(), TIM_EncoderInterfaceConfig()
5) Configure and enable TIMx interrupt
6) Enable TIMx counter: TIM_Cmd()
nx6310
Я в прерывании смотрю на второй канал энкодера и инкерментирую или декрементирую значение энкодера в зависимости от его состония.
Код
void TIM2_IRQHandler(void)
{static int t1,t2,a;
      if(TIM2->SR&TIM_SR_CC3IF)
      {
if(GPIOB->IDR&GPIO_Pin_11)conor--;
else conor++;
       t2=TIM2->CNT;
       if(t2>t1)speed=t2-t1;
       else speed=t2-t1+65535;
       t1=t2;
       speed=140625/speed;
speed=(speed*(100-90)+a*90)/100;a=speed;
       TIM2->SR&=~TIM_SR_CC3IF;
if((conor>=3150336)|(conor<=-3150336)|(conor==0)){OSTANOV;} }

}

Использую таймер в режиме захвата.
В принципе можно использовать прерывания по выводам EXTI и там вести счёт. Тогда не нужен будет таймер и его можно будет отключить, тем самым немного уменьшив потребление прибора, если конечно не требуется замер скорости вращения.
Serj78
Цитата(nx6310 @ Oct 30 2012, 13:03) *
Я в прерывании смотрю на второй канал энкодера и инкерментирую или декрементирую значение энкодера в зависимости от его состония.

Использую таймер в режиме захвата.


Такой подход имеет минус- при появлении джиттера ( когда стукаешь по энкодеру, и одна ножка энкодера туда- сюда скачет, а вторая на месте стоит) будет бесконечное кручение показывать..
nx6310
При каких условиях это происходит? Из-за вибраций? Если настроить таймер в режиме энкодера разве такого не будет происходить?
KSN
Кто-нибудь реализовывал делитель частоты энкодера на STM32F(любой кристалл с аппаратной обработкой энкодера) с выводом поделенной частоты наружу? Частота входного сигнала до 1МГц.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.