STM32F100 + Two Timer + Encoder
26.02.2015, 10:20
|
|
|
Прописка
Регистрация: 31.10.2006
Сообщений: 149
Сказал спасибо: 15
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
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 пары значений.
Кошерно временно отключать прерывание.
|
|
|
|
26.02.2015, 11:02
|
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: STM32F100 + Two Timer + Encoder
|
Цитата:
|
|
Может попробовать взять STM32105, там 32 битный таймер есть
|
Это с какого перепоя?
|
|
|
|
Сказали "Спасибо" STM32F0
|
|
|
26.02.2015, 11:04
|
|
|
Частый гость
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F100 + Two Timer + Encoder
Boba_spb, Примерно: Encoder 4800 шагов на оборот - 10 об/сек
|
|
|
|
26.02.2015, 11:14
|
|
|
Частый гость
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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 секунд, вероятность наступления такого события, в течении суток будет складываться и рано или поздно оно обязательно наступит.
|
|
|
|
26.02.2015, 11:20
|
|
|
Частый гость
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F100 + Two Timer + Encoder
Сообщение от STM32F0
|
|
Это с какого перепоя?
|
Кстати, да. Ввели в заблуждение. Если верить табличке 2 из AN4013 (DM00042534.pdf), то ни в одном MCU STM32F1xx серии нет 32bit таймера. Во всех других есть, а в этой нет.
|
|
|
|
26.02.2015, 11:25
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: STM32F100 + Two Timer + Encoder
Ну опечатался STM32105 - STM32F05
|
|
|
|
26.02.2015, 11:26
|
|
|
Частый гость
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F100 + Two Timer + Encoder
Сообщение от Boba_spb
|
|
Ну опечатался STM32105 - STM32F05
|
Со всяким бывает
|
|
|
|
26.02.2015, 12:50
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: STM32F100 + Two Timer + Encoder
Проблема дрожания решается вроде совсем просто.
Изначально CNT таймера заряжаем на 0х8000. (пусть это будет нулевое положение.)
А далее все просто как мычание - в прерывнии по переполнению счетчика
устанавливаем CNT таймера в 0х8000 и на этом болтания как ромашки в проруби закончится.
|
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
26.02.2015, 13:15
|
|
|
Частый гость
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F100 + Two Timer + Encoder
Boba_spb, Да как вариант)
|
|
|
|
27.02.2015, 06:55
|
|
|
Частый гость
Регистрация: 24.02.2015
Сообщений: 11
Сказал спасибо: 4
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F100 + Two Timer + Encoder
Как итог я сделал так:
- настроил таймер на энкодер
- загрузил в него значение 32768 (0x8000)
- сделал прерывание для этого таймера по CCR3=1 (CC3IE) и CCR4=65535 (CC4IE)
- в обработчике прерывания первым делом восстанавливаю TIMx-›CNT = 32768, затем проверяю с какой стороны прерывание по установленным флагам в TIMx-›SR, делаю корректировку глобальной переменной типа s32 (можно и больше) на величину 32767 в + или в -.
- в любом участке программы можно проверить текущее положение через расчёт суммы текущего смещения TIMx-›CNT - 32768 и общей суммы (глобальной переменной s32)
Все работает. Всем спасибо!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:55.
|
|