Умножитель частоты шагов на STM32
-
Олег.
- Опытный
- Сообщения: 131
- Зарегистрирован: 20 ноя 2014, 19:18
- Репутация: 14
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Ещё проблема есть, DIR придётся тоже обрабатывать, иначе при реверсе возможны ошибки.
Поломать голову придётся, чтобы множитель сочинить.
В сервоприводах этот множитель фактически присутствует, и работает с некоторой задержкой.
пришлось немного поработать с недоприводом от Festo, входной сигнал менее 30 кГц. ( были причины)
Если фильтр на входной сигнал маловат, привод вибрирует, если великоват, движение плавное, но пролетает позицию и после остановки поправляется на несколько мм.
Другой случай, один из заказчиков ставил этот привод для перемещения ножа и реза в движении, синхронизация по энкодеру на материале. Более менее нормальный результат получился когда энкодер подобрали на 100500 импульсов, под привычный на 1000 импульсов не смогли настроить привод.
Это я к тому, что задачка с множителем не из простых.
Поломать голову придётся, чтобы множитель сочинить.
В сервоприводах этот множитель фактически присутствует, и работает с некоторой задержкой.
пришлось немного поработать с недоприводом от Festo, входной сигнал менее 30 кГц. ( были причины)
Если фильтр на входной сигнал маловат, привод вибрирует, если великоват, движение плавное, но пролетает позицию и после остановки поправляется на несколько мм.
Другой случай, один из заказчиков ставил этот привод для перемещения ножа и реза в движении, синхронизация по энкодеру на материале. Более менее нормальный результат получился когда энкодер подобрали на 100500 импульсов, под привычный на 1000 импульсов не смогли настроить привод.
Это я к тому, что задачка с множителем не из простых.
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
DIR синхронизируется со STEP, тут пока что проблем нетОлег. писал(а):Ещё проблема есть, DIR придётся тоже обрабатывать, иначе при реверсе возможны ошибки.
Поломать голову придётся, чтобы множитель сочинить.
Это для наглядности, на самом деле OUTPUT выполняется позднее, как только все для подсчета получено и обработано. Т.е. как минимум после очередного фронта.Andrey@KZN писал(а):Так на картинке все вторые импульсы выдаются до прихода следующего шага.
Вот мы как раз и рассматриваем случай, когда нового импульса нетMamont писал(а):С предыдущего импульса отсчитывается период, делится надвое. После прихода нового импульса, он выдается, а через половинку предыдущего импульса выдается промежуточный.
Представьте, что был всего 1 импульс на входе (:Mamont писал(а):Надо сделать автоопределение длительности первого импульса, определяется прогой, ее стартовой скоростью и ускорением. После включения питания (или длительного простоя без импульсов) длительность между первым и вторым делится надвое и принимается за базовую. Если она меньше чем находится в памяти, она корректируется. Больше - игнорируется
В работе, после первого импульса, который был после длительного простоя, выдается через базовое время этот импульс
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Эти все слова я давно знаю, а документом является файл .ld для этой платы.sidor094 писал(а):Во всех микросхемах где есть поддержка внешнего озу оно находится в адресном пространстве процессора.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Задумался над тем, что будет, если на входе получен всего 1 шаг.. Каким же должен быть период (Х) для выхода? И когда надо начинать подавать эти 2 шага на выход? Какая-то максимальная задержка ожидания входного шага должна быть?
Т.к. вывод для всех осей синхронизирован, ждать пока для одной оси придёт второй шаг для расчётов - как-то неправильно.
Код: Выделить всё
INPUT ______________|""|______________________
TIME | X |
OUTPUT ______________|"|___|"|_________________
- Mamont
- Мастер
- Сообщения: 2005
- Зарегистрирован: 10 дек 2015, 12:21
- Репутация: 391
- Настоящее имя: Виталий
- Откуда: РБ Минск
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
После первого импульса через базовое время пуляется второй. Базовое время прописано в константах, в епроме.
После первого импульса обнуляется таймер. Если произошло переполнение таймера, а второго импульса нет, считается что следующий импульс тоже первый. Иначе время таймера делится пополам и после второго импульса посылается через это время
А базовое время будеш периодически кооректировать: после первого импульса с длительным простоем по всем осям. Определишь время до второго. Если оно меньше чем прописано в константах, перезапишиваешь. Главное что плата компа но пьяни не выдала импульсов с места в карьер, которые пропишутся в константы умножителя
После первого импульса обнуляется таймер. Если произошло переполнение таймера, а второго импульса нет, считается что следующий импульс тоже первый. Иначе время таймера делится пополам и после второго импульса посылается через это время
А базовое время будеш периодически кооректировать: после первого импульса с длительным простоем по всем осям. Определишь время до второго. Если оно меньше чем прописано в константах, перезапишиваешь. Главное что плата компа но пьяни не выдала импульсов с места в карьер, которые пропишутся в константы умножителя
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Понятно. Значит надо добавить макс. время ожидания.
Re: Умножитель STEP/DIR на Arduino
Я пробовал реализовать умножитель на меге (честный - пропорциональный), но уперся в производительность (слишком затратная операция деления для четырех осей, даже битовый сдвиг) и объем памяти (не хватает памяти для хранения таймеров в буфере, накапливается при долгих разгонах). Заказывал дуе для решения этих проблем, но пока он шел - обзавелся контроллером на 100кГц, т.ч. проблема отпала. Вот последний сохранившийся код, но там были ошибки, я уже не помню в чем, я его еще неделю с тех пор отлаживал пока не забросил.
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Я с вашего кода и начинал изучать сей вопрос (: У вас там получился тестовый вариант на 1 STEP вход. Но раз уж вывод в любом случае будет буферизированный, то надо синхронно отслеживать оба входа - и STEP, и DIR. Ну а раз уж каждый порт по 8 пинов, аккурат хватает на 4 оси. Можно и больше.tmr писал(а):Я пробовал реализовать умножитель на меге (честный - пропорциональный), но уперся в производительность (слишком затратная операция деления для четырех осей, даже битовый сдвиг) и объем памяти (не хватает памяти для хранения таймеров в буфере, накапливается при долгих разгонах). Заказывал дуе для решения этих проблем, но пока он шел - обзавелся контроллером на 100кГц, т.ч. проблема отпала. Вот последний сохранившийся код, но там были ошибки, я уже не помню в чем, я его еще неделю с тех пор отлаживал пока не забросил.
Я использую только 1 таймер и настроил его так, чтобы функционал отслежки запускался с частотой 200 КГц (каждые 5 мкс), а механизм вывода пахал на 1 МГц (каждые 1 мкс). Т.е. желательно при выводе не превышать 16 тактов, а при отслежке 80. Пока что укладываюсь. Но я еще в живую не пробовал, там может все обернутся иначе.
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Учитывая цену всяких микроардуин может проще взять по ардуине на ось ? И места займет тоже немного.
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
С большой вероятностью получится разсинхрон. У нас все оси играют в команде и наш фильтр должен за этим внимательно следить, а иначе кто-то убежит вперед, а кто-то отстанет.Morroc писал(а):Учитывая цену всяких микроардуин может проще взять по ардуине на ось ? И места займет тоже немного.
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Так ли это важно внутри заданного интервала ? А от фронта исходных сигналов все равно далеко не разбегутся. Ну вот разве что ситуации типа "последнего импульса" - тут непонятно.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
У Степмастера два независимых МК обслуживают 4 оси и сколько-нибудь заметного рассинхрона не наблюдается. Хотя там алгоритмы гораздо сложнее, чем пока обсуждавшиеся в этой теме.MX_Master писал(а):С большой вероятностью получится разсинхрон.
Чудес не бывает. Бывают фокусы.
- michael-yurov
- Почётный участник

- Сообщения: 11730
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4703
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Там что-то вроде фильтра низкой частоты второго-третьего порядка (действующего преимущественно на ускорение и на его производную).
В аудиоусилителе в аудиотракте ведь рассинхрона нет, хотя и работают каналы отдельно друг от друга.
Ну и реакция на изменение входящего сигнала в степмастере мгновенная без буферов / задержек.
Небольшое отставание выходных импульсов по сравнению с входными есть, но это неправильно было бы назвать задержкой.
Но требуется одинаковая настройка для всех осей.
Я сначала делал по принципу ПИД регулятора, а потом нашелся способ дающий значительно лучший результат (но, блин, не простой для реализации).
В аудиоусилителе в аудиотракте ведь рассинхрона нет, хотя и работают каналы отдельно друг от друга.
Ну и реакция на изменение входящего сигнала в степмастере мгновенная без буферов / задержек.
Небольшое отставание выходных импульсов по сравнению с входными есть, но это неправильно было бы назвать задержкой.
Но требуется одинаковая настройка для всех осей.
Я сначала делал по принципу ПИД регулятора, а потом нашелся способ дающий значительно лучший результат (но, блин, не простой для реализации).
-
sidor094
- Мастер
- Сообщения: 826
- Зарегистрирован: 20 фев 2014, 09:13
- Репутация: 81
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Рассинхронизация будет как у всех обычных приводов.В пределах настройки каждого канала.То есть при одинаковой настройке рассинхронизации не будет.А при неодинаковой будет наблюдаться небольшая разница при движении.Но накапливаться она не будет.Так как при увеличении рассогласования будет увеличивться и скорость выдачи импульсов.Вообще то можно сделать как в приводах Чем больше отставание ,тем выше частота выдачи импульсов.Я делал программу управляющую шаговым приводом с обратной связью по энкодеру.Работающую по такому принципу.Без задержек же такое управление осуществить очень сложно.Так как предсказать поведение системы чпу не возможно.MX_Master писал(а):С большой вероятностью получится разсинхрон. У нас все оси играют в команде и наш фильтр должен за этим внимательно следить, а иначе кто-то убежит вперед, а кто-то отстанет.
Re: Умножитель STEP/DIR на Arduino
Я бы еще добавил, что касается умножения частоты, то нельзя сказать что "там алгоритмы гораздо сложнее". Всё-таки АПЧ у степмастера это совсем простой алгоритм, в отличии от буферизации.
Что касается предсказания импульса - можно использовать sherline mode (1/2 скважности), хотя это не очень честно
Что касается предсказания импульса - можно использовать sherline mode (1/2 скважности), хотя это не очень честно
- michael-yurov
- Почётный участник

- Сообщения: 11730
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4703
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Да, ладно, Сергей Саныч просто немного польстил мне.tmr писал(а): Я бы еще добавил, что касается умножения частоты, то нельзя сказать что "там алгоритмы гораздо сложнее". Всё-таки АПЧ у степмастера это совсем простой алгоритм, в отличии от буферизации.
Но АПЧ был первоначально. Сейчас по другому.
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Я не думаю, что Михаил будет доволен, если мы сделаем бесплатный аналог степмастера (: Поэтому я делаю заведомо хуже и на одном недорогом МК.
Завтра доделаю вариант с равномерным распределением умноженных STEP/DIR на выходе. Но опять-таки, надо всё тестировать вживую и на разных контроллерах, желательно. А мой наборчик юного МКшника, видимо, надолго застрял в Китае. Может, чтоб не терять время, надо заказать какую-ньть макетку на Кортексе М3 или М4? Заодно подучиться АРМу (:
Завтра доделаю вариант с равномерным распределением умноженных STEP/DIR на выходе. Но опять-таки, надо всё тестировать вживую и на разных контроллерах, желательно. А мой наборчик юного МКшника, видимо, надолго застрял в Китае. Может, чтоб не терять время, надо заказать какую-ньть макетку на Кортексе М3 или М4? Заодно подучиться АРМу (:
- michael-yurov
- Почётный участник

- Сообщения: 11730
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4703
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
У меня покупатели найдутся. Тут не переживай.
Пурики вот сделали, и мне кажется это скорее плюс для меня, чем проблема.
Кто захочет повозиться с паяльником и сделать своими руками - повторит твой проект. А кому работать - купит у меня.
К слову, умножение частоты в СтепМастере - это так, побочная возможность.
Просто потому что легко было добавить ее к функционалу. А штука вполне полезная.
Пурики вот сделали, и мне кажется это скорее плюс для меня, чем проблема.
Кто захочет повозиться с паяльником и сделать своими руками - повторит твой проект. А кому работать - купит у меня.
К слову, умножение частоты в СтепМастере - это так, побочная возможность.
Просто потому что легко было добавить ее к функционалу. А штука вполне полезная.
- MX_Master
- Мастер
- Сообщения: 7488
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3113
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
А, кстати, на каком МК у пуриков сделано? На фотках не видно ничего, разве что примерно.
Я, кстати, безпаяльниковый вариант делаю - только прошивка для конкретной макетки.
Я, кстати, безпаяльниковый вариант делаю - только прошивка для конкретной макетки.
- michael-yurov
- Почётный участник

- Сообщения: 11730
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4703
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: Умножитель STEP/DIR на Arduino
Пурики, наверное, затирают маркировку.MX_Master писал(а):А, кстати, на каком МК у пуриков сделано? На фотках не видно ничего, разве что примерно.