Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

STM32F100 + Two Timer + Encoder

Непрочитано 26.02.2015, 10:20  
gks5
Прописка
 
Регистрация: 31.10.2006
Сообщений: 149
Сказал спасибо: 15
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
gks5 на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Можно вести глобальную переменную вместо второго счетчика.
Код:
volatile s32 ovfCounter = 0;
timer_base.TIM_Period = 0xFFFF;

void ENCODER_TIM_IRQHandler(void)
{
  if (TIM_GetITStatus(ENCODER_TIM, TIM_IT_Update) != RESET) {
    TIM_ClearITPendingBit(ENCODER_TIM, TIM_IT_Update);
    captured_direction = (ENCODER_TIM-›CR1 & TIM_CR1_DIR ? BACKWARD : FORWARD);
    switch(captured_direction) {
    case FORWARD:  ovfCounter++;  	break;
    case BACKWARD:  ovfCounter--;  	break;
    }
  }
}
encoder_cnt = ovfCounter * 0x10000 + ENCODER_TIM-›CNT;
Только надо проследить за пересечением с прерыванием, т.е. чтобы ovfCounter и ENCODER_TIM-›CNT считывались атомарно.
Я просто считываю подряд пока не совпадут 3 пары значений.
Кошерно временно отключать прерывание.
Реклама:
gks5 вне форума  
Непрочитано 26.02.2015, 11:02  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Цитата:
Может попробовать взять STM32105, там 32 битный таймер есть
Это с какого перепоя?
STM32F0 вне форума  
Сказали "Спасибо" STM32F0
AlmazRa (26.02.2015)
Непрочитано 26.02.2015, 11:04  
AlmazRa
Частый гость
 
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AlmazRa на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Boba_spb, Примерно: Encoder 4800 шагов на оборот - 10 об/сек
AlmazRa вне форума  
Непрочитано 26.02.2015, 11:14  
AlmazRa
Частый гость
 
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AlmazRa на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Сообщение от gks5 Посмотреть сообщение
Можно вести глобальную переменную вместо второго счетчика.
Код:
volatile s32 ovfCounter = 0;
timer_base.TIM_Period = 0xFFFF;

void ENCODER_TIM_IRQHandler(void)
{
  if (TIM_GetITStatus(ENCODER_TIM, TIM_IT_Update) != RESET) {
    TIM_ClearITPendingBit(ENCODER_TIM, TIM_IT_Update);
    captured_direction = (ENCODER_TIM-›CR1 & TIM_CR1_DIR ? BACKWARD : FORWARD);
    switch(captured_direction) {
    case FORWARD:  ovfCounter++;  	break;
    case BACKWARD:  ovfCounter--;  	break;
    }
  }
}
encoder_cnt = ovfCounter * 0x10000 + ENCODER_TIM-›CNT;
Только надо проследить за пересечением с прерыванием, т.е. чтобы ovfCounter и ENCODER_TIM-›CNT считывались атомарно.
Я просто считываю подряд пока не совпадут 3 пары значений.
Кошерно временно отключать прерывание.
Это как раз самый мой первый вариант был (см. выше), вот только допустим, что остановка вращения произошла как раз в районе перехода через ноль и начался небольшой люфт вала, как раз в один шаг, контроллер начнет постоянно уходить в прерывание и зависнет на этом прерывании, 'позабыв об основной программе'. Вероятность, конечно, 1/65536, НО она не нулевая и это как-то пугает. При остановке каждые 5 секунд, вероятность наступления такого события, в течении суток будет складываться и рано или поздно оно обязательно наступит.
AlmazRa вне форума  
Непрочитано 26.02.2015, 11:20  
AlmazRa
Частый гость
 
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AlmazRa на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Сообщение от STM32F0 Посмотреть сообщение
Это с какого перепоя?
Кстати, да. Ввели в заблуждение. Если верить табличке 2 из AN4013 (DM00042534.pdf), то ни в одном MCU STM32F1xx серии нет 32bit таймера. Во всех других есть, а в этой нет.
AlmazRa вне форума  
Непрочитано 26.02.2015, 11:25  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Ну опечатался STM32105 - STM32F05
Boba_spb вне форума  
Непрочитано 26.02.2015, 11:26  
AlmazRa
Частый гость
 
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AlmazRa на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Сообщение от Boba_spb Посмотреть сообщение
Ну опечатался STM32105 - STM32F05
Со всяким бывает
AlmazRa вне форума  
Непрочитано 26.02.2015, 12:50  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Проблема дрожания решается вроде совсем просто.
Изначально CNT таймера заряжаем на 0х8000. (пусть это будет нулевое положение.)
А далее все просто как мычание - в прерывнии по переполнению счетчика
устанавливаем CNT таймера в 0х8000 и на этом болтания как ромашки в проруби закончится.
Boba_spb вне форума  
Сказали "Спасибо" Boba_spb
AlmazRa (26.02.2015)
Непрочитано 26.02.2015, 13:15  
AlmazRa
Частый гость
 
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AlmazRa на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Boba_spb, Да как вариант)
AlmazRa вне форума  
Непрочитано 27.02.2015, 06:55  
AlmazRa
Частый гость
 
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
AlmazRa на пути к лучшему
По умолчанию Re: STM32F100 + Two Timer + Encoder

Как итог я сделал так:
- настроил таймер на энкодер
- загрузил в него значение 32768 (0x8000)
- сделал прерывание для этого таймера по CCR3=1 (CC3IE) и CCR4=65535 (CC4IE)
- в обработчике прерывания первым делом восстанавливаю TIMx-›CNT = 32768, затем проверяю с какой стороны прерывание по установленным флагам в TIMx-›SR, делаю корректировку глобальной переменной типа s32 (можно и больше) на величину 32767 в + или в -.
- в любом участке программы можно проверить текущее положение через расчёт суммы текущего смещения TIMx-›CNT - 32768 и общей суммы (глобальной переменной s32)

Все работает. Всем спасибо!
AlmazRa вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Proteus Timer 0 Over.. and Compare Max966 Proteus 0 13.08.2012 01:42
Stellaris timer kadrilo Микроконтроллеры, АЦП, память и т.д 0 26.10.2011 16:14
Прерывания по таймеру ADSP 21065l sergurets Цифровые сигнальные процессоры 7 23.03.2011 00:49
[Решено] помогите определить ENCODER lightworld Информация по радиокомпонентам 0 11.01.2010 18:44
Timer 0 в AVR 8515 martyr Микроконтроллеры, АЦП, память и т.д 0 12.10.2005 16:27


Часовой пояс GMT +4, время: 15:55.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.