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

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

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

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

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

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


 
Опции темы
Непрочитано 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.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 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.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 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, время: 03:11.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot