реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Эмуляция энкодера.
Jenya7
сообщение Jul 24 2017, 05:45
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Что бы проверить работу таймера в режиме энкодера я решил эмулировать на двух ножках 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 градусов, но на скопе я вижу сигналы в одной фазе. Это скоп так показывает или у меня ошибка?

Сообщение отредактировал Jenya7 - Jul 24 2017, 05:46
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 24 2017, 06:03
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Задайте состояния выходов для энкодера таблицей.
И прокручивайте ее по кругу - наиболее приближенная к реальному энкодеру эмуляция.
(закрашенные сектора на диске - таже таблица)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 24 2017, 06:10
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jul 24 2017, 11:03) *
Задайте состояния выходов для энкодера таблицей.
И прокручивайте ее по кругу - наиболее приближенная к реальному энкодеру эмуляция.
(закрашенные сектора на диске - таже таблица)

это то что я делаю в коде - прокручиваю состояния каждый тайм слот (1-2-3-4).

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

пробовал выставлять выход через ODR
Код
void TIM7_IRQHandler(void)
{
   switch (enc_state)
   {
       case 0:
           //ENC_PORT->BSRR |= ENC_PIN_A;  //1
           //ENC_PORT->BRR |= ENC_PIN_B;   //0
           ENC_PORT->ODR = 0x200;
       break;
       case 1:
           //ENC_PORT->BSRR |= ENC_PIN_A;  //1
           //ENC_PORT->BSRR |= ENC_PIN_B;  //1
             ENC_PORT->ODR = 0x600;
       break;
       case 2:
           //ENC_PORT->BRR |= ENC_PIN_A;   //0
           //ENC_PORT->BSRR |= ENC_PIN_B;  //1
           ENC_PORT->ODR = 0x400;
       break;
       case 3:
           //ENC_PORT->BRR |= ENC_PIN_A;   //0
           //ENC_PORT->BRR |= ENC_PIN_B;   //0
         ENC_PORT->ODR = 0x000;
          
       break;
   }
  
   if(enc_state == 3)
     enc_state = 0;
   else
     enc_state++;
  
   TIM7->SR = 0;
}

тот же результат

если я ставлю 4 брекпойнта - в каждом кейсе - то я вижу что состояния выходов меняются по таблице (10 11 01 00). но когда код бежит они мигают одновременно.

Сообщение отредактировал Jenya7 - Jul 24 2017, 07:06
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 24 2017, 07:13
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



скорее всего глючек не в приведенном коде, а "наружи",
в виде "накладки" нескольких выдач в порт.
Попробуйте максимально "растянуть" осцилграфом импульсы, и ВОЗМОЖНО найдутся утерянные
фазы выдачи.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 24 2017, 07:21
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jul 24 2017, 12:13) *
скорее всего глючек не в приведенном коде, а "наружи",
в виде "накладки" нескольких выдач в порт.
Попробуйте максимально "растянуть" осцилграфом импульсы, и ВОЗМОЖНО найдутся утерянные
фазы выдачи.

я вывел ножки на светодиоды. частота мигания раз в 4 секунды. тут невооруженным глазом все видно. что интересно что по брейкпоинтам отрабатывается правильно - первый зажигается потом второй первый гаснет потом второй. а без остановок зажигаются и гаснут одновременно.
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jul 24 2017, 07:38
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



А таймер случайно в ту же ногу не выдает импульсы?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 24 2017, 07:43
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Эдди @ Jul 24 2017, 12:38) *
А таймер случайно в ту же ногу не выдает импульсы?

нет. я вижу два светодиода мигают.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jul 24 2017, 07:57
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Тут прерывание срабатывает два раза.
После команды сброса флажка прерывания надо что-то типа __DSB(); или просто несколько nop'ов.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 24 2017, 08:23
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(esaulenka @ Jul 24 2017, 12:57) *
Тут прерывание срабатывает два раза.
После команды сброса флажка прерывания надо что-то типа __DSB(); или просто несколько nop'ов.

О! __DSB(); помогло, спасибо. а что эта инструкция делает?

описание такое
Цитата
The Data Synchronization Barrier (DSB) acts as a special kind of memory barrier. The DSB operation will complete when all explicit memory accesses before this instruction have completed. No instructions after the DSB will be executed until the DSB instruction has completed, that is, when all of the pending accesses have completed.


но как это влияет на обработку прерывания?

Сообщение отредактировал Jenya7 - Jul 24 2017, 08:37
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jul 24 2017, 08:47
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Никогда _достаточно_ глубоко не разбирался, но суть в том, что флажок прерывания где-то застревает на несколько тактов. Если он сбрасывается последней инструкцией в обработчике, есть высокая вероятность, что контроллер прерываний решит, что он всё ещё установлен, и вызовет обработчик ещё раз.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 24 2017, 09:17
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(esaulenka @ Jul 24 2017, 13:47) *
Никогда _достаточно_ глубоко не разбирался, но суть в том, что флажок прерывания где-то застревает на несколько тактов. Если он сбрасывается последней инструкцией в обработчике, есть высокая вероятность, что контроллер прерываний решит, что он всё ещё установлен, и вызовет обработчик ещё раз.

понял. спасибо.

если сбрасывать флаг TIM7->SR = 0; вначале прерывания а не в конце тоже помогает. чудеса.

Сообщение отредактировал Jenya7 - Jul 24 2017, 09:22
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jul 24 2017, 10:25
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



А частота какая? Странно, что такой небольшой кусок кода не успевает выполниться между переполнениями таймера.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 24 2017, 10:53
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Эдди @ Jul 24 2017, 15:25) *
А частота какая? Странно, что такой небольшой кусок кода не успевает выполниться между переполнениями таймера.

до 4kHz выставлял

я тут подумал. есть моторы с высокими RPM. у меня может произойти переполнение счетчика на полном прогоне. я что то не нашел опции прескейлера входной частоты.

Сообщение отредактировал Jenya7 - Jul 24 2017, 10:56
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 24 2017, 11:46
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Jul 24 2017, 13:53) *
. . .
я тут подумал. есть моторы с высокими RPM. у меня может произойти переполнение счетчика на полном прогоне. я что то не нашел опции прескейлера входной частоты.

я посмотрел бы на приоритеты прерываний + errata.pdf sm.gif
ps - А что за чип ?



Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 24 2017, 12:17
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jul 24 2017, 16:46) *
я посмотрел бы на приоритеты прерываний + errata.pdf sm.gif
ps - А что за чип ?

а при чем тут прерывания.
чип STM32F303VCT6. при частоте энкодера 400 герц счетчик переполняется за минуту. у меня может возникнуть система с большим прогоном , больше минуты. логически было предположить что входные сигналы A/B можно поделить чтоб увеличить дальность. но я такой опции не нашел.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th May 2024 - 02:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016