Easyelectronics.ru

Электроника для всех
Текущее время: 25 ноя 2017, 07:00

Часовой пояс: UTC + 5 часов



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Эмуляция энкодера.
СообщениеДобавлено: 24 июл 2017, 10:47 
Заглядывает иногда

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 175
Что бы проверить работу таймера в режиме энкодера я решил эмулировать на двух ножках AB сигналы.
Код:
void TIM7_IRQHandler(void)
{
   switch (enc_state)
   {
       case 0:
           GPIOF->BSRR = GPIO_Pin_9;   //1
           GPIOF->BRR = GPIO_Pin_10;   //0
       break;
       case 1:
           GPIOF->BSRR = GPIO_Pin_9;   //1
           GPIOF->BSRR = GPIO_Pin_10;  //1
       break;
       case 2:
           GPIOF->BRR = GPIO_Pin_9;   //0
           GPIOF->BSRR = GPIO_Pin_10; //1
       break;
       case 3:
           GPIOF->BRR = GPIO_Pin_9;   //0
           GPIOF->BRR = GPIO_Pin_10; //0
       break;
   }
 
   if(enc_state == 3)
     enc_state = 0;
   else
     enc_state++;
 
   TIM7->SR = 0;
}

По идее должно работать как на картинке, сигналы сдвинуты на 90 градусов, но на скопе я вижу сигналы в одной фазе. Это скоп иак показывает или у меня ошибка?


Вложения:
optical-encoder-quadrature-1234.jpg
optical-encoder-quadrature-1234.jpg [ 27.92 Кб | Просмотров: 521 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Эмуляция энкодера.
СообщениеДобавлено: 24 июл 2017, 11:13 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 631
Подключите два светодиода и снизьте частоту таймера (прерываний от таймера) до 1 Гц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Эмуляция энкодера.
СообщениеДобавлено: 24 июл 2017, 11:43 
Заглядывает иногда

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 175
BusMaster писал(а):
Подключите два светодиода и снизьте частоту таймера (прерываний от таймера) до 1 Гц.

мигают одновременно. значит скоп не причем.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Эмуляция энкодера.
СообщениеДобавлено: 24 июл 2017, 13:08 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 631
Странно, потому что код - правильный. Посмотрите, у вас в основном цикле или в других прерываниях нет ли параллельного такого же кода?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Эмуляция энкодера.
СообщениеДобавлено: 24 июл 2017, 13:28 
Заглядывает иногда

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 175
BusMaster писал(а):
Странно, потому что код - правильный. Посмотрите, у вас в основном цикле или в других прерываниях нет ли параллельного такого же кода?

посоветовали добавить в конце __DSB(); не знаю что эта инструкция делает но помогло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Эмуляция энкодера.
СообщениеДобавлено: 24 июл 2017, 13:57 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 631
Это сишная обертка ассемблерной инструкции dsb - data synchronization barrier. Инструкция притормаживает поток команд до тех пор, пока предыдущие команды не завершат свою работу. На первый взгляд это как-то не вкладывается в голове, но если вспомнить, что исполнение инструкций - конвейерное и они могут исполняться в разном порядке, не в том, в котором извлекались, то становится ясно.
Поздний сброс флага прерывания может фактически не сбрасываться из-за изменения порядка выполнения инструкций в конвейере.
__DSB() равносильна нескольким __NOP(), хотя не всегда. Проц может выкидывать nop-ы по своему усмотрению. Это не этап компиляции, это этап работы конвейера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Эмуляция энкодера.
СообщениеДобавлено: 24 июл 2017, 14:09 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 472
Откуда: Германия
А если "TIM7->SR = 0;" в начало перенести - тоже помогает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Эмуляция энкодера.
СообщениеДобавлено: 24 июл 2017, 14:16 
Заглядывает иногда

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 175
dev писал(а):
А если "TIM7->SR = 0;" в начало перенести - тоже помогает?

таки да. помогает. :)

при частоте энкодера 400 герц счетчик переполняется за минуту. у меня может возникнуть система с большим прогоном , больше минуты. логически было предположить что входные сигналы A/B можно поделить чтоб увеличить дальность. но я такой опции не нашел.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB