Перейти к содержанию
    

STM32F103 + Encoder

В STM32F103 имеется 16-и битный счетчик, к которому можно подключить квадратурный энкодер. Мне необходимо реализовать 32 битный счетчик. Частота сигнала в среднем 60кГц(максимум 120кГц). Может кто реализовывал подобную задачу, поделитесь мыслями: как реализовать 32 битный счетчик? Программно или может состыковать пару таймеров между собой(возможно через внешние выводы). Вариант взять вместо STM32F103 кристалл STM32F205 рассматривается, но ценник у первого ~3$, у второго 8$

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подобную проблему решили так.

Настраиваем таймер с энкодером на прерывания по переполнению, в обработчике прерываний, в зависимости от направления счета таймера, увеличиваем или уменьшаем старшую часть счета. К сожаленью по другому ни как.

Если не нужно определять направление счета то можно соеденить два счетчика каскадно

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вполне возможно сделать каскадно таймеры.

Как? Должнен быть прямой и обратный счет каскадированного 32-х битного таймера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как? Должнен быть прямой и обратный счет каскадированного 32-х битного таймера.

Да, точно, с реверсом не получится...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет! А не подскажете как правильно настроить таймер на Энкодер?

У меня энкодер подключен к 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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет! А не подскажете как правильно настроить таймер на Энкодер?

У меня энкодер подключен к 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()

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в прерывании смотрю на второй канал энкодера и инкерментирую или декрементирую значение энкодера в зависимости от его состония.

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 и там вести счёт. Тогда не нужен будет таймер и его можно будет отключить, тем самым немного уменьшив потребление прибора, если конечно не требуется замер скорости вращения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в прерывании смотрю на второй канал энкодера и инкерментирую или декрементирую значение энкодера в зависимости от его состония.

 

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

 

Такой подход имеет минус- при появлении джиттера ( когда стукаешь по энкодеру, и одна ножка энкодера туда- сюда скачет, а вторая на месте стоит) будет бесконечное кручение показывать..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При каких условиях это происходит? Из-за вибраций? Если настроить таймер в режиме энкодера разве такого не будет происходить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто-нибудь реализовывал делитель частоты энкодера на STM32F(любой кристалл с аппаратной обработкой энкодера) с выводом поделенной частоты наружу? Частота входного сигнала до 1МГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...