Разгони свой ПЛК110 М02 бесплатно и без S M S.
10-ая версия pru_stepper_v10.zip
Теперь-то уж наверняка должны заработать 2 ШД: выходы осциллографом не смотрел, но в КДС блоки работают как надо.
* Помним, что одновременно могут работать следующие комбинации выходов: 1 и 3, 1 и 4, 2 и 3, 2 и 4.
* За частоту PRU взята 200MHz (совпадает с тестами dima64)
* Убран выходной параметр "READY". Вместо него стоит проверять STATE=STOP_STEPPER.
* Добавлен выходной параметр "CURRENT_SPEED : REAL"
* Изменён тип параметра "STATE" на enum PRU_STEPPER_STATE
Спасибо прибористу за ПЛК -- нашёл причину неработоспособности прошлых версий программы.
Причин несколько:
1) Похоже, PRU0.prg/PRU1.prg не поддерживают программы более 2048 байт. Это большая печаль, т.к. в спецификации TI написано, что процессор поддерживает программы до 4096 байт. Как я добавил в программу обсчёт минимальной скорости, то программа стала чуть больше 2048 и, соответственно, работать не работала.
Можно смеяться, можно плакать, но если в *.prg формате действительно ограничение на 2048 байт, то это ещё одна грабля, про которую Владислав ничего не сказал.
Блин. Ну был бы описан формат *.prg -- было бы наверняка понятно, что "больше 2048 в него не влезет".
А так получается, я методом тыка исследую и догадываюсь, что всё дело в размере программы.
Я немного упростил программу, добавил небольшую оптимизацию в компилятор, и программа стала занимать 1964 байта.
2) Как оказалось, в PRU1 регистр счётчика выполненных команд находится по адресу 0x780C, а не по адресу 0x7800.
Я про эту догадку уже говорил:
но потом Владислав уверил меня, что в документации TI ошибка, а регистр у каждого PRU находится по адресу 0x7800
Как оказалось, документация TI говорит правду, и регистр находится по своему адресу у каждого PRU.
Т.е. для PRU0 и PRU1 должны быть разные программы.
После того, как разобрались с проблемами, давайте разгоним наш ПЛК.
Осциллографом до прибориста я не дотянусь, но я сделал замер "средней скорости генерации импульсов" через TIME().
PRU программа возвращает количество сделанных импульсов, а мы делим на "время генерации" и получаем фактическую частоту.
Вот демонстрация: http://recordit.co/XLaOe3LOYE (то же самое в виде анимированного gif: http://g.recordit.co/XLaOe3LOYE.gif )
По факту, частота немного отличается от заданной. Например, вместо 500'000 показывает где-то 495'126 Гц. Но тут, возможно у меня ошибка. Например я могу неправильно учитывать то, сколько тактов работают команды с памятью. Ещё, возможно, задержки в самом TIME() или чём-то таком.
За частоту PRU я выбрал 200МГц. Надо всё-таки перепроверить это хозяйство осциллографом.
По факту, ПЛК разогнался до 2'200'000 Гц, что, на мой взгляд, хорошее достижение, с учётом того, что ОВЕН пишет 100кГц.
Сколько из этих 2МГц смогут передаться через быстрые выходы, конечно, вопрос открытый.