UART генератор импульсов
- Mamont
- Мастер
- Сообщения: 2005
- Зарегистрирован: 10 дек 2015, 12:21
- Репутация: 391
- Настоящее имя: Виталий
- Откуда: РБ Минск
- Контактная информация:
UART генератор импульсов
А чтоб не скучно было зимой, задумал сделать генератор импульсов.
Данные поступают с компа по медленному UART (более чем достаточно скорости 115200), буфферизируются, делятся и выдуваются с помощью микроконтроллера в реальном масштабе времени.
Траекторию движения и ускорения рассчитывает комп, квантует отрезками по ~2 мс. Собирает в пакеты по 16 отрезков и закидывает в порт. Пакеты естественно пронумерованы и с контрольной суммой.
Контроллер дробит 2мс отрезок на 2(4), чтобы при ускорениях скорость изменялась поплавнее. С помощью своих таймеров достаточно точно отсчитывает временные отрезки.
Максимальная выходная частота импульсов до 64000/с, количество осей - 4 (потому что в выбранном контроллере только 5 таймеров).
Количество импульсов на отрезок предполагается не целое. Не будет такого что будут закидываться [-2-2-2-3-2-2-3-2-2-3-] , а будет 2_77/256 = 2,30078125 при теоретически требуемых 2.3
Очевидно что потребуется еще и программа для ПК, раскуривающая G коды и строящая траекторию. Сделаем и ее.
Выход сигналов с контроллера Step-dir или CW-CCW (мне он больше нравится), аппаратные входы в контролер - ептег, 4-хоума, общий лимит. После срабатывания ептега сразу все останавливается, сбросить состояние аварии через команду от компа. Хоумы и лимиты при подтверждении пакета передаются в ПК.
Контролер 16-битный PIC (нужна не битность, а чтоб таймеров было много)
Где апаратный RS-232, там и логический USB-UART. Т.е. можно в качестве панели задействовать планшет
Данные поступают с компа по медленному UART (более чем достаточно скорости 115200), буфферизируются, делятся и выдуваются с помощью микроконтроллера в реальном масштабе времени.
Траекторию движения и ускорения рассчитывает комп, квантует отрезками по ~2 мс. Собирает в пакеты по 16 отрезков и закидывает в порт. Пакеты естественно пронумерованы и с контрольной суммой.
Контроллер дробит 2мс отрезок на 2(4), чтобы при ускорениях скорость изменялась поплавнее. С помощью своих таймеров достаточно точно отсчитывает временные отрезки.
Максимальная выходная частота импульсов до 64000/с, количество осей - 4 (потому что в выбранном контроллере только 5 таймеров).
Количество импульсов на отрезок предполагается не целое. Не будет такого что будут закидываться [-2-2-2-3-2-2-3-2-2-3-] , а будет 2_77/256 = 2,30078125 при теоретически требуемых 2.3
Очевидно что потребуется еще и программа для ПК, раскуривающая G коды и строящая траекторию. Сделаем и ее.
Выход сигналов с контроллера Step-dir или CW-CCW (мне он больше нравится), аппаратные входы в контролер - ептег, 4-хоума, общий лимит. После срабатывания ептега сразу все останавливается, сбросить состояние аварии через команду от компа. Хоумы и лимиты при подтверждении пакета передаются в ПК.
Контролер 16-битный PIC (нужна не битность, а чтоб таймеров было много)
Где апаратный RS-232, там и логический USB-UART. Т.е. можно в качестве панели задействовать планшет
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: UART генератор импульсов
Еще один PlanetCNC наметился 
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Mamont
- Мастер
- Сообщения: 2005
- Зарегистрирован: 10 дек 2015, 12:21
- Репутация: 391
- Настоящее имя: Виталий
- Откуда: РБ Минск
- Контактная информация:
Re: UART генератор импульсов
А мы сделаем свой Планет, с Блекджеком и Блэкшлюхамиaftaev писал(а):Еще один PlanetCNC наметился
-
Duhas
- Мастер
- Сообщения: 1961
- Зарегистрирован: 10 окт 2015, 23:25
- Репутация: 285
- Настоящее имя: Андрей
- Откуда: Красноярск
- Контактная информация:
Re: UART генератор импульсов
кого простите!? О_оMamont писал(а):После срабатывания ептега
- Mamont
- Мастер
- Сообщения: 2005
- Зарегистрирован: 10 дек 2015, 12:21
- Репутация: 391
- Настоящее имя: Виталий
- Откуда: РБ Минск
- Контактная информация:
Re: UART генератор импульсов
Е_стоп=ептег= ѣѣ (дабл "ять")
-
Duhas
- Мастер
- Сообщения: 1961
- Зарегистрирован: 10 окт 2015, 23:25
- Репутация: 285
- Настоящее имя: Андрей
- Откуда: Красноярск
- Контактная информация:
Re: UART генератор импульсов
нет во время моей юности конечно был был моден албанский, но у вас какие то свои извращения.
- AndyBig
- Мастер
- Сообщения: 3971
- Зарегистрирован: 07 мар 2014, 04:01
- Репутация: 1121
- Откуда: юг России
- Контактная информация:
Re: UART генератор импульсов
Может быть проще сделать плагин к Мачу?Mamont писал(а):Очевидно что потребуется еще и программа для ПК, раскуривающая G коды и строящая траекторию. Сделаем и ее.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: UART генератор импульсов
Ну, разве только для этого.Mamont писал(а):А чтоб не скучно было зимой
Чудес не бывает. Бывают фокусы.
- Mamont
- Мастер
- Сообщения: 2005
- Зарегистрирован: 10 дек 2015, 12:21
- Репутация: 391
- Настоящее имя: Виталий
- Откуда: РБ Минск
- Контактная информация:
Re: UART генератор импульсов
После некоторого знакомства с Мачой, такая теоритическая возможность прорисовалась: считывать координаты с DRO осей, разницу посчитать, сформировать пакет в удобоваримом формате, переслать по сериал-порту и отправить в паузу на 1...2мс.AndyBig писал(а):Может быть проще сделать плагин к Мачу?Mamont писал(а):Очевидно что потребуется еще и программа для ПК, раскуривающая G коды и строящая траекторию. Сделаем и ее.
Генератор пауз можно и внешний сделать, контроллер будет дергать пины, а пауза зацикливается пока пин не изменится.
Загвоздка в том, что Мач, когда занят обработкой траектории, не охотно обновляет данные в DRO, вроде раз в 5-10мс
Плугин я делал в виде программы на VB на кнопку.. т.е. кнопку нажали и прога начала выполнятся, работает в бесконечном цикле
Для мач имеет намного больший смысл для ЛПТ сделать фильтратор-разглаживатель импульсов. Но сам Мач далек от совершенства в плане надежности, уже пару раз зависал, одну заготовку испортил, когда поехал по странной траектории (после чего несколько раз прогонял по воздуху с той же УП, все нормально)
Последний раз редактировалось Mamont 07 дек 2016, 16:03, всего редактировалось 1 раз.
- AndyBig
- Мастер
- Сообщения: 3971
- Зарегистрирован: 07 мар 2014, 04:01
- Репутация: 1121
- Откуда: юг России
- Контактная информация:
Re: UART генератор импульсов
Зачем такие извращения? В Маче же есть возможность работы с контроллерами движенияMamont писал(а):считывать координаты с DRO осей, разницу посчитать, сформировать пакет в удобоваримом формате, переслать по сериал-порту и отправить в паузу на 1...2мс.
- Mamont
- Мастер
- Сообщения: 2005
- Зарегистрирован: 10 дек 2015, 12:21
- Репутация: 391
- Настоящее имя: Виталий
- Откуда: РБ Минск
- Контактная информация:
Re: UART генератор импульсов
хм... буду искать, читатьAndyBig писал(а):Зачем такие извращения? В Маче же есть возможность работы с контроллерами движенияMamont писал(а):считывать координаты с DRO осей, разницу посчитать, сформировать пакет в удобоваримом формате, переслать по сериал-порту и отправить в паузу на 1...2мс.
- michael-yurov
- Почётный участник

- Сообщения: 11730
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4703
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: UART генератор импульсов
Не проще! Только кажется, что проще.Mamont писал(а):Для мач имеет намного больший смысл для ЛПТ сделать фильтратор-разглаживатель импульсов.
Проще сделать именно внешний контроллер для Mach3.
Mach3 уже дает данные по количеству необходимых импульсов разбитые на 1 или 2 мс.
Бери эти данные, да генерируй импульсы.
- Mamont
- Мастер
- Сообщения: 2005
- Зарегистрирован: 10 дек 2015, 12:21
- Репутация: 391
- Настоящее имя: Виталий
- Откуда: РБ Минск
- Контактная информация:
Re: UART генератор импульсов
Где я написал что проще? Не проще, а нужнее.
- michael-yurov
- Почётный участник

- Сообщения: 11730
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4703
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
- AndyBig
- Мастер
- Сообщения: 3971
- Зарегистрирован: 07 мар 2014, 04:01
- Репутация: 1121
- Откуда: юг России
- Контактная информация:
Re: UART генератор импульсов
Совсем не факт, что самописный планировщик будет лучше и надежнее МачаMamont писал(а):Но сам Мач далек от совершенства в плане надежности, уже пару раз зависал, одну заготовку испортил, когда поехал по странной траектории (после чего несколько раз прогонял по воздуху с той же УП, все нормально)
- Mamont
- Мастер
- Сообщения: 2005
- Зарегистрирован: 10 дек 2015, 12:21
- Репутация: 391
- Настоящее имя: Виталий
- Откуда: РБ Минск
- Контактная информация:
Re: UART генератор импульсов
Вообщем математика вырисовывается такая:
Допустим надо сделать на данный квант времени (1мс) 4.7 импульса. Остаток с предыдущего кванта 0.8 импульса
(имеем в своем распоряжении пять 16-битных таймеров, которые с ядром работают на 32мгц)
В регистр автоперезагрузки таймера записываем 65535 - 32000/4.7 = 58726.
А в стартовое значение таймера = 65535-32000/4.7*(1-0.8) = 64173
Если в данный квант времени должно выполнится меньше одного шага, допустим 0.5 (т.е. ниодного полного), в таймер записывается 0. И прерывание от этого таймера не вызовется в этом кванте
При переполнения таймера вызывается прерывание, дергается ножка, обновляется регистр сколько осталось сделать целых шагов
После переполнения системного таймера, отсчитывающего кванты по 1мс, вызывается прерывание. Если какая то ось должна не успела сделать последний целый шаг, сразу доделывается этот шаг.
После этого временного кванта остаток шагов будет 0.3 (4.7 текущих+0.8с предыдущего - 5 сделанных полных шагов)
В прерываниях по быстрому закидываются заранее рассчитанные данные. После завершения выполнения прерывания системного таймера в основной проге рассчитываются эти новые коэффициенты.
Благодаря это гарантируется отсутствие рассогласования осей и потери шагов, с минимальными неравномерностями на границах миллисекундных интервалов
Допустим надо сделать на данный квант времени (1мс) 4.7 импульса. Остаток с предыдущего кванта 0.8 импульса
(имеем в своем распоряжении пять 16-битных таймеров, которые с ядром работают на 32мгц)
В регистр автоперезагрузки таймера записываем 65535 - 32000/4.7 = 58726.
А в стартовое значение таймера = 65535-32000/4.7*(1-0.8) = 64173
Если в данный квант времени должно выполнится меньше одного шага, допустим 0.5 (т.е. ниодного полного), в таймер записывается 0. И прерывание от этого таймера не вызовется в этом кванте
При переполнения таймера вызывается прерывание, дергается ножка, обновляется регистр сколько осталось сделать целых шагов
После переполнения системного таймера, отсчитывающего кванты по 1мс, вызывается прерывание. Если какая то ось должна не успела сделать последний целый шаг, сразу доделывается этот шаг.
После этого временного кванта остаток шагов будет 0.3 (4.7 текущих+0.8с предыдущего - 5 сделанных полных шагов)
В прерываниях по быстрому закидываются заранее рассчитанные данные. После завершения выполнения прерывания системного таймера в основной проге рассчитываются эти новые коэффициенты.
Благодаря это гарантируется отсутствие рассогласования осей и потери шагов, с минимальными неравномерностями на границах миллисекундных интервалов
- michael-yurov
- Почётный участник

- Сообщения: 11730
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4703
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: UART генератор импульсов
Насколько я знаю, все контроллеры для mach3 выполняют целое количество шагов в течение временного интервала.
И mach3 сообщает данные в виде целого числа импульсов.
И контроллеры используют алгоритм Брейзинхема для генерации импульсов.
Дробное количество импульсов за период существенно усложнило бы задачу, но, почти не дает преимуществ.
На мой взгляд, полезнее было бы использовать более мелкий микрошаг.
И mach3 сообщает данные в виде целого числа импульсов.
И контроллеры используют алгоритм Брейзинхема для генерации импульсов.
Дробное количество импульсов за период существенно усложнило бы задачу, но, почти не дает преимуществ.
На мой взгляд, полезнее было бы использовать более мелкий микрошаг.
- Mamont
- Мастер
- Сообщения: 2005
- Зарегистрирован: 10 дек 2015, 12:21
- Репутация: 391
- Настоящее имя: Виталий
- Откуда: РБ Минск
- Контактная информация:
Re: UART генератор импульсов
Мач точно не испльзует алгоритм Брезентхейма. Для шаговых двигателей он не покатит. Насколько я понял с педивикии, для рисования отрезков используется ведущая переменная (с наибольшей дельтой и ведомая).
Изменение ведущей происходит кратно интервалу времени, а ведомой - по мере накопления ошибки, но синхронно с ведущей:
_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х
_____Х_____Х_____Х___________Х_____Х_____Х___________Х_____Х___________Х_____Х_____Х
3-3-2-3... такие неравномерности движения прокатят для шаговых движков только на невысоких скоростях. Когда требуется постоении линии близкой к 45 градусов на предельных скоростях, ведомая ось застопорится.
Сегодня подключу осцилограф к лпт и сделаю несколько скринсейвов с него (есть подозрение что и ДИР не постоянный, а дергается, даже когда совершает монотонное движение в одну сторону)
Изменение ведущей происходит кратно интервалу времени, а ведомой - по мере накопления ошибки, но синхронно с ведущей:
_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х_____Х
_____Х_____Х_____Х___________Х_____Х_____Х___________Х_____Х___________Х_____Х_____Х
3-3-2-3... такие неравномерности движения прокатят для шаговых движков только на невысоких скоростях. Когда требуется постоении линии близкой к 45 градусов на предельных скоростях, ведомая ось застопорится.
Сегодня подключу осцилограф к лпт и сделаю несколько скринсейвов с него (есть подозрение что и ДИР не постоянный, а дергается, даже когда совершает монотонное движение в одну сторону)
- michael-yurov
- Почётный участник

- Сообщения: 11730
- Зарегистрирован: 26 июл 2012, 00:10
- Репутация: 4703
- Настоящее имя: Михаил Львович
- Откуда: Новоуральск
- Контактная информация:
Re: UART генератор импульсов
Про mach3 - не знаю. А контроллеры - очень даже используют.Mamont писал(а):Мач точно не испльзует алгоритм Брезентхейма.
+/- 0,5 шага не смертельны.Mamont писал(а):такие неравномерности движения прокатят для шаговых движков только на невысоких скоростях.
Ну, во первых - с чего бы?Mamont писал(а):ведомая ось застопорится.
А во вторых - речь не про "ведомую" и "ведущую" ось, а про несущую частоту и генерацию шагов при накоплении ошибки более 1 (0,5) шага.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: UART генератор импульсов
Модификаций алгоритма Брезенхема много. Не знаю, как в Маче, а в LCNC он активно применяется как в аппаратных, так и в программных реализациях шагогенераторов. Нет там понятия "ведущей" и ведомой" осей, тем более, что осей там может быть до 9 и более. Используется он для генерации частот. Заметная неравномерность импульсов появляется только на частотах, близких к базовой (для программных реализаций на PC - десятки кГц, для реализаций на МК и ПМЛ - сотни кГц и выше). При работе с микрошагом такая неравномерность совершенно не заметна.
Чудес не бывает. Бывают фокусы.