Arduino DUE чтение пина через регистры
- Войдите на сайт для отправки комментариев
Ср, 24/10/2018 - 14:59
Добрый день форумчане, прошу помочь.
считываю энкодер, но при высокой скорости начинается пропуск импульсов..
Как «ускорить» стандартный вариант
if(digitalRead(pin_encoder_A0)); для Arduino DUE?
Нашел вариант if( !digitalRiad(3)); но быстрее, я думаю, будет через регистры.. прошу выложить вариант кода..
Энкодер нужно читать по прерыванию. Если Вы будете читать его в loop, Вы всё равно будете время от времени пропускать сигналы. так что копайте в сторону прерываний.
Уважаемый Евгений... :) я так и делаю..но для определения направление движения в прерывание необходимо проверить второй вход, если 1, то в одну сторону, если 0, то в другую (стандартный квадратурный энкодер)
частота с энкодера доходит до 150кГц, вроде не сильно много, но с 80кГц начинаються пропуски...
attachInterrupt(pin_encoder_A1, encoder_A,FALLING);
https://arduino.stackexchange.com/questions/35457/the-fastest-way-to-read-out-a-digital-pin-state-in-an-arduino-due
http://forum.arduino.cc/index.php?topic=260731.0
Очевидно, Вам нужно использовать регистр PIO_PDSR.
UPD: И на нешем форуме тема уже была:
http://arduino.ru/forum/programmirovanie/bystroe-chtenie-tsifrovykh-vkhodov-arduino-due
Ну. не знаю, если она теряет на таких частотах, то дело скорее всего не скорости digitalRead
Впрочем, дело Ваше. То, что Вам нужно есть вот в этой библиотеке - она поддерживает прямой доступ к портам для всех ардуин, включая DUE на базе SAM. Там есть и исходники, и примеры.
А если поискать то можно и готовый пример обработчика энкодера для Due найти :)
большое спасибо всем за ответы...буду пробовать
«ЕвгенийП» возможно сказываются и другие прерывания в программе, да и энкодеров 3шт., надо попробовать скомпилировать отдельно для 1-го энкодера
частота с энкодера доходит до 150кГц, вроде не сильно много, но с 80кГц начинаються пропуски...
Сразу не обратил внимание на цифры. У вас промышлненный энкодер, на двигателе? Тогда никакие прерывания не успеют, нужно на таймере делать. В STM32 есть аппаратная поддержка энкодеров, в DUE по моему нету.
частота с энкодера доходит до 150кГц, вроде не сильно много, но с 80кГц начинаються пропуски...
Сразу не обратил внимание на цифры. У вас промышлненный энкодер, на двигателе? Тогда никакие прерывания не успеют, нужно на таймере делать. В STM32 есть аппаратная поддержка энкодеров, в DUE по моему нету.
AntonULN, на F103 точно есть, сам пользуюсь :) Например в "народном" f103c8t6 4 штуки 16-битных таймера, и каждый умеет быть обработчиком энкодера. То есть можно одновременно 4 мотора обсчитывать не отвлекая на это МК.
Имею "народный" STM32, но руки пока не дошли до нормального разбора данного мк...
т.к. это тема другого форума можно ссылочку (можно несколько) на примеры...тема аппаратного считывания энкодера (да не одного!) очень нужная.. DUE в софтовом считывании грузиться очень сильно (мерил скорость обработки "loop")
случайно это не аппаратный декодер квадратурного сигнала...сам я точно не раскопаю, если кто поможет буду рад :)
AntonULN, похоже оно. Подсказывать вряд ли кто возьмётся, Due не популярная плата. Так что теребите гугля :)
отчитываюсь: поменял digitalRiad на REG_PIOC_PDSR и как говориться "вООоля", пропуски стали уже не на 1800об/мин, а на 2600 об/мин; а на 3000 об/мин загрузка мк уменьшилась ровно в 2 раза!! Возможно мне даже будет этого достаточно :)
Всем спасибо за помощь.