Easyelectronics.ru

Электроника для всех
Текущее время: 21 июн 2018, 11:24

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

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

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 202
Что бы проверить работу таймера в режиме энкодера я решил эмулировать на двух ножках 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 Кб | Просмотров: 928 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Эмуляция энкодера.
СообщениеДобавлено: 24 июл 2017, 11:13 
Старожил
Аватара пользователя

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


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

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

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

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


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

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


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

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

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


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

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


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

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


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

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

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

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


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

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


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

Сейчас этот форум просматривают: jenya77


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

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

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