Да, может.
Вид для печати
Хороший вопрос. Можно и его сделать WORD.
Тут нужно подумать.Цитата:
Например 200 кГц за 1 секунды.
Не хочется сейчас брать и менять на DWORD.
Одному нужно одно, а другому другое.
Скорее всего, само вычисление так и оставить WORD'ом, просто считать, что передаётся "ускорение, делённое на 4".
Т.е. значение accel_ramp=1 будет означать ускорение 4 Гц/сек2, значение accel_ramp=65535 будет означать 65535*4=262140 Гц/сек2
Вряд ли кто-то сильно заметит разницу между ускорением 100 и 101 Гц/сек2.
Но вот чтобы не приходилось в КДС программе "предварительно делить на 4", нужно сделать так, чтобы на КДС стороне это было REAL, а непосредственно перед передачей в PRU оно само делилось на что там нужно. Что-нибудь в таком духе.
Я думаю пока переделывать ничего не надо.
Не могу найти где в этой теме писалось о быстром ШИМ.
Какой вопрос?
Вот про ШИМ: https://hardella.com/docs/pru/examples/fast-pwm/
В Hardella есть блок и для дельта-сигма модуляции (про неё было тут: http://www.owen.ru/forum/showthread....l=1#post229447 )
Блок называется PDM_DW: https://hardella.com/docs/pru/standard-library/#pdm_dw
Есть потребность в быстром ШИМ. В связи с этим есть такие вопросы:
1) какие .exp файлы надо импортировать в проект CoDeSys;
2) как обратиться к ФБ ШИМ в программе CoDeSys.
При работе с ФБ ШД обращение такое:
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_stepper_accel_ramp := 50000,
STEPPER1_PRU1_stepper_decel_ramp := 50000,
STEPPER1_PRU1_stepper_max_speed := 10000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := 1000,
STEPPER1_PRU1_stepper_enable := TRUE
);
А как будет в случае с ШИМ ? Там в теле будет всего 2 строчки. Нужно имя программы и что внутри.
Типа так ?
PWM_DWConfig_Pru0MemoryTransfer(
PWM_DW_PRU0_value := 100,
PWM_DW_PRU0_period := 200
);
value и period мерятся в мкс ?
Примерно так, но:
1) value и period измеряются в "количестве PRU циклов".
value задаёт то, сколько PRU циклов будет TRUE на выходе ШИМ, а (period-value) определяет то, сколько потом будет циклов с FALSE.
2) микросекунды настраиваются в PRU Configuration. Там указывается длительность PRU цикла. У PRU0 и PRU1 может быть разная длительность цикла.
Интервал ШИМ будет period * длительность_pru_цикла.
Например, если указать длительность PRU цикла 1 мкс, указать period=100, value=30, то на выходе будет так:
30 мкс TRUE
70 мкс FALSE
30 мкс TRUE
70 мкс FALSE
30 мкс TRUE
70 мкс FALSE
...
Если указать длительность PRU цикла 0.5 мкс, указать period=100, value=30, то на выходе будет так:
15 мкс TRUE
35 мкс FALSE
15 мкс TRUE
35 мкс FALSE
15 мкс TRUE
35 мкс FALSE
...
Какие .exp файлы надо импортировать в проект CoDeSys ?
Спасибо, буду пробовать. Хочу использовать быстрый ШИМ для управления частотой вращения вала ШД. Т.е. раскручиваем ШД (кстати, разгонять можно будет по любому закону - хоть по линейному, хоть по криволинейному), а далее меняем частоту вращения во времени. Красота. ;)
А как можно при помощи стандартного блока ШД произвольно регулировать скорость вращения вала ШД во времени ? Постоянно дергать enable ? Но это же не comme il faut. ;)
Почему частота не может быть большой ? 500 кГц - это мало ? Мне за глаза хватит. ;) Не на каждый драйвер ШД можно подать такую частоту.
Нужно ли?
Ну, у основного цикла ПЛК частота порядка 1кГц, т.е. подача команд в PRU будет "не чаще, чем раз 1 миллисекунду".
Конечно, никто не запрещает 2 раза за цикл ПЛК вызвать memoryread/memorywrite, но это всё-таки странновато будет.
С другой стороны, можно сделать гибрид: использовать хвалёный "20мкс таймер" в режиме, скажем "100мкс" (чтобы не влиять на служебные программы ПЛК) и из этого "100мкс цикла" подавать команды в PRU.
Управляющих воздействий раз в 100мкс в целом, должно хватать на довольно большой спектр задач.
Но, конечно, программировать и отлаживать такое сложнее.
А то, что ШД можно будет разгонять по любому закону разве это не фишка ? Иные ШД бывают очень капризные. ;)
Управление ШД посредством быстрого ШИМ весьма перспективно. Можно гибко и плавно управлять частотой вращения вала ШД. Плавное управление частотой вращения вала двигателя посредством стандартного ФБ ШД невозможно. Там будут заметны рывки.
Все путем, Hardella рулит, достойной альтернативы ей на сегодняшний день нет, а реальные проекты уже есть. Вы сделали большое дело. Проект надо несомненно развивать.
Будет замечательно и справедливо если фирма "ОВЕН" окажет материальную поддержку проекту.
Не оскудеет рука дающего. ;)
Есть мудрые люди в фирме "ОВЕН" ?
Ну это как посмотреть.
В режиме "разгон" и в режиме "торможение" частота меняется как раз по линейному закону. Рывков как раз нет.
Вполне возможно стоит не просто ШИМ блоком управлять, а сделать адаптированный блок.
1) Как минимум, нужно добавлять счётчик импульсов. Так, чтобы этот "ШИМ" мог остановиться при достижении нужного количества.
2) Более того, ШИМ в чистом виде будет плохо подходить для управления на больших частотах, т.к. разница в 1 мкс весьма существенно будет изменять частоту.
Например: 11 мкс это 91кГц, 10 мкс это 100кГц, а 9 мкс это уже 110 кГц.
В этом плане текущий блок ШД генерирует импульсы немного разной ширины, чтобы в среднем оказалась нужная частота.
3) Теоретически, можно подумать о блоке, который генерирует переменную частоту, чтобы ему можно было указать начальную-конечную частоту, и чтобы он генерил импульсы. Т.е. вынести "планирование траектории из PRU".
Если посмотреть на 1-2-3 ещё раз, то получится блок, который несильно отличается от текущего. Отличие лишь в том, что вычисление траектории вынесется в КДС код, а в PRU блок будут передаваться команды типа "нач.частота 0, разгон=1кГц/сек", "не меняем частоту, разгон=0кГц/сек", "не меняем частоту, как достигнем 1000 импульсов включаем замедление=1кГц/сек", "как достигнем 1700 импульсов останавливаемся".
Из кусочков линейного ускорения можно будет и S-кривую собрать.
Использовать быстрый ШИМ для управления ЩД для задач позиционирования не целесообразно. Есть задачи, в которых мощный ШД вращает режущий инструмент или заготовку. В таких задачах надо сделать разгон, а далее иметь возможность регулировать скорость вращения. Вот здесь быстрый ШИМ и нужен.
To Vladimir Sitnikov.
Владимир, реально ли на базе встроенного в Hardella блока управления шаговым двигателем сделать его модификацию. Хочу вместо stepper_accel_ramp: WORD и stepper_decel_ramp: WORD сделать один stepper_ramp: DWORD. Вместо stepper_min_speed: DWORD сделать stepper_min_speed: WORD.
Мне надо получить приращение частоты порядка 5...10 кГц/мс.
Не пойму что не так.
Скорее всего при изменении PRU_STEPPER на PRU_STEPPER1 не обновились ссылки в @Export
Простой вариант поправить это удалить и заново добавить @Export.
со stepper.Q возможно аналогичная картина. Т.е. подводим курсор на Q и либо стираем-пишем заново, либо ctrl+пробел и "перевыбираем" Q.
Сейчас уже не помню где автоматическая замена была сделана, а где нет.
Хорошо, попробую.
Вышло обновление Hardella. Если сделать обновление, что будет с ранее созданными проектами ?
Всё будет работать. Для порядка нужно перекомпилировать проект (не проверял нужно ли или нет).
Технически, если сохранить проект в новой версии старая его уже не сможет открыть.
Но то обновление (речь, ведь, про 1.6.2?) довольно давно вышло и там ничего существенно не менялось.
Владимир, у меня 2 вопроса:
1) к примеру задал я stepper_ramp = 50 000 [Гц/сек], означает ли это, что за каждую мс частота будет увеличиваться ровно на
50 Гц ?
2) если задать не большое ускорение stepper_ramp, большую частоту stepper_max_speed и маленькое число импульсов stepper_quantity, то может получиться, что заданное количество импульсов будет отработано на этапе разгона; означает ли это, что как только заданное количество импульсов будет сгенерировано, то частота сразу упадет до нуля без этапа торможения ?
Можно считать и так. Если точнее, то между каждыми двумя импульсами задержка уменьшается более-менее равномерно.
Если указано ненулевое замедление (decel_ramp), то блок совместит этапы ускорения и замедления так, чтобы общее количество импульсов оказалось равным заданному
Вот графики на эту тему. Каждая точка -- импульс. Под частотой понимается 1 / (t2-t1).
Вложение 26718
Вложение 26719
Ясно. Спасибо.