Arduino DUE чтение пина через регистры

AntonULN
Offline
Зарегистрирован: 21.03.2018
Добрый день форумчане, прошу помочь.
считываю энкодер, но при высокой скорости начинается пропуск импульсов..
 
Как «ускорить» стандартный вариант
if(digitalRead(pin_encoder_A0));                  для Arduino DUE?
Нашел вариант if( !digitalRiad(3)); но быстрее, я думаю, будет  через регистры.. прошу выложить вариант кода..
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Энкодер нужно читать по прерыванию. Если Вы будете читать его в loop, Вы всё равно будете время от времени пропускать сигналы. так что копайте в сторону прерываний.

AntonULN
Offline
Зарегистрирован: 21.03.2018

Уважаемый Евгений... :)   я так и делаю..но для определения направление движения в прерывание необходимо проверить второй вход, если 1, то в одну сторону, если 0, то в другую  (стандартный квадратурный энкодер)      

частота с энкодера доходит до 150кГц, вроде не сильно много, но с 80кГц начинаються пропуски...

AntonULN
Offline
Зарегистрирован: 21.03.2018

attachInterrupt(pin_encoder_A1, encoder_A,FALLING);

void encoder_A()
    if(digitalRead(pin_encoder_A0)) count_encoder_A++; 
        else                        count_encoder_A--;
}
строку "digitalRead" необходимо заменить на более "скоросной" вариант...
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну. не знаю, если она теряет на таких частотах, то дело скорее всего не скорости digitalRead

Впрочем, дело Ваше. То, что Вам нужно есть вот в этой библиотеке - она поддерживает прямой доступ к портам для всех ардуин, включая DUE на базе SAM. Там есть и исходники, и примеры.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

А если поискать то можно и готовый пример обработчика энкодера для Due найти :)

AntonULN
Offline
Зарегистрирован: 21.03.2018

большое спасибо всем за ответы...буду пробовать

«ЕвгенийП» возможно сказываются  и другие прерывания в программе, да и энкодеров 3шт., надо попробовать скомпилировать отдельно для 1-го энкодера

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonULN пишет:

частота с энкодера доходит до 150кГц, вроде не сильно много, но с 80кГц начинаються пропуски...

Сразу не обратил внимание на цифры. У вас промышлненный энкодер, на двигателе? Тогда никакие прерывания не успеют, нужно на таймере делать. В STM32 есть аппаратная поддержка энкодеров, в DUE по моему нету.

 

AntonULN
Offline
Зарегистрирован: 21.03.2018

dimax пишет:

AntonULN пишет:

частота с энкодера доходит до 150кГц, вроде не сильно много, но с 80кГц начинаються пропуски...

Сразу не обратил внимание на цифры. У вас промышлненный энкодер, на двигателе? Тогда никакие прерывания не успеют, нужно на таймере делать. В STM32 есть аппаратная поддержка энкодеров, в DUE по моему нету.

 

Конечно спасибо большое за пояснения...но не могу сказать что это меня это обрадовало   :(
 
 да энкодер на двигателе (всего будет их 3шт), 2500 имп на оборот, max частота до 3000 об/мин, 
 
на каком "минимальном" STM32 есть аппататная поддержка энкодеров? (случайно на stm32f103 нет?)
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonULN, на F103 точно есть, сам пользуюсь :) Например в  "народном"  f103c8t6  4 штуки 16-битных таймера, и каждый умеет быть обработчиком энкодера. То есть можно одновременно 4 мотора обсчитывать  не отвлекая  на это  МК. 

AntonULN
Offline
Зарегистрирован: 21.03.2018

Имею "народный" STM32, но руки пока не дошли до нормального разбора данного мк...

т.к. это тема другого форума можно ссылочку (можно несколько) на примеры...тема аппаратного считывания энкодера (да не одного!) очень нужная.. DUE в софтовом считывании грузиться очень сильно (мерил скорость обработки "loop")

AntonULN
Offline
Зарегистрирован: 21.03.2018
"dimax"  вот что нашел в pdf на "DUE" (стр.871)
 
36.6.14 Quadrature Decoder
36.6.14.1  Description
The quadrature decoder (QDEC) is driven by TIOA0, TIOB0, TIOB1 input pins and drives the timer/counter of
channel 0 and 1. Channel 2 can be used as a time base in case of speed measurement requirements (refer to
Figure 36-15).
 

случайно это не аппаратный декодер квадратурного сигнала...сам я точно не раскопаю, если кто поможет буду рад  :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonULN, похоже оно.  Подсказывать вряд ли кто возьмётся, Due не популярная плата. Так что теребите гугля :)

AntonULN
Offline
Зарегистрирован: 21.03.2018

отчитываюсь: поменял digitalRiad на REG_PIOC_PDSR и как говориться "вООоля", пропуски стали уже не на 1800об/мин, а на 2600 об/мин; а на 3000 об/мин загрузка мк уменьшилась ровно в 2 раза!!  Возможно мне даже будет этого достаточно  :)

Всем спасибо за помощь.