UART генератор импульсов

Контроллеры, драйверы, датчики, управляющие устройства.
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11730
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: UART генератор импульсов

Сообщение michael-yurov »

Сергей Саныч писал(а):Не знаю, как в Маче, а в LCNC он активно применяется
Учитывая, что mach3 слеплен из кусков EMC2, авторских ошибок и виндовых библиотечных элементов - он не сильно отличается по логике работы.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: UART генератор импульсов

Сообщение Сергей Саныч »

Mamont писал(а):такие неравномерности движения прокатят для шаговых движков только на невысоких скоростях.
На невысоких скоростях неравномерностей практически не будет. Точнее, они останутся равными периоду базовой частоты. Скажем, при базовой 30 кГц неравномерность генерации частоты шагов порядка 100 имп/сек будет не более 0,3 %
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Mamont
Мастер
Сообщения: 2005
Зарегистрирован: 10 дек 2015, 12:21
Репутация: 391
Настоящее имя: Виталий
Откуда: РБ Минск
Контактная информация:

Re: UART генератор импульсов

Сообщение Mamont »

В самом начале были мысли делать более простой, дробно-инкрементальный. Когда достаточно одного таймера
Допустим основная частота 100кгц. В этих периодах каждой координате добавляется дельта шага. Она дробная, допустим 0.123 шага.
0.123
0.246
0.369
0.492
0.615
0.738
0.861
0.984
1.107 -делаем шаг. остается 0.107
0.23
....
И так далее. Комп присылает новые дельты, которые будут исполнятся 100 шагов. Так получаем 1мс на каждый шаг.

Допустим шаги идут в районе частотой 15кгц, импульсы идут с шагом 60-70-70-60-70-70-....[мкс] неравномерность ~15%. может и сбойнуть (а может и не)

Если позволяет загрузка контролера, 100кгц можно и поднять.

Ну и опять таки, загрузка контролера- все время он только и будет занят работой сумирования-сумирования-сумирования.
А потом если что пенять , ай контролер слабый, надо АРМ или ПЛИСку. В задуманом алгоритме контролер будет занят вычислениями только на границах стыков милисикундных интервалов.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7488
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3113
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: UART генератор импульсов

Сообщение MX_Master »

И какой МК выбран под это дело?
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11730
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: UART генератор импульсов

Сообщение michael-yurov »

Mamont писал(а):Ну и опять таки, загрузка контролера- все время он только и будет занят работой сумирования-сумирования-сумирования.
А потом если что пенять , ай контролер слабый, надо АРМ или ПЛИСку. В задуманом алгоритме контролер будет занят вычислениями только на границах стыков милисикундных интервалов.
Куда лучше равномерно распределенная по времени простая и быстрая операция сложения целых чисел, чем операция деления "на границах стыков".
К тому же в первом случае будет легко подсчитать сгенерированные импульсы. А во втором - потребуется обработка прерываний (что накладно в плане производительности).
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: UART генератор импульсов

Сообщение Сергей Саныч »

Mamont писал(а):неравномерность ~15%. может и сбойнуть (а может и не)
На такой частоте (15 кГц) даже не почувствует :)

По Брезенхему это будет выглядеть примерно так:
Берем базовую частоту и вычитаем из нее нужную частоту шагов.
Если результат очередного вычитания меньше или равен 0, то генерируем шаг, а к результату прибавляем значение базовой частоты.
Поехали:

100000-15000=85000
85000-15000=70000
55000
40000
25000
10000
10000-15000=-5000 Шаг! И -5000+100000=95000
95000-15000=80000
65000
50000
35000
20000
5000
-10000 Шаг! и -10000+100000=90000
90000-15000=75000
60000
45000
30000
15000
0 Шаг! и 0+100000=100000
85000
...

Результат тот же, зато нет вычислений с плавающей точкой. Операций деления и умножения тоже нет - только сложение-вычитание. Не надо считать период.
Последний раз редактировалось Сергей Саныч 08 дек 2016, 10:26, всего редактировалось 1 раз.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: UART генератор импульсов

Сообщение Сергей Саныч »

Mamont писал(а):Ну и опять таки, загрузка контролера- все время он только и будет занят работой сумирования-сумирования-сумирования.
Большинство современных МК делает эти операции (целочисленные) за 1 такт. Насчет "все время" - одна или две операции на ось за цикл прерывания с базовой частотой. Меньше 1 процента процессорного времени при тактовой 32 МГц. Тем более, что эти операции размазаны по времени. Ну и накладные расходы на обработку одного прерывания с постоянной частотой куда как меньше, чем на обработку четырех-пяти прерыванй, которые между собой никак не связаны.
Последний раз редактировалось Сергей Саныч 08 дек 2016, 10:32, всего редактировалось 1 раз.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: UART генератор импульсов

Сообщение Сергей Саныч »

Mamont писал(а):В задуманом алгоритме контролер будет занят вычислениями только на границах стыков милисикундных интервалов.
А так - можно будет в фоновом режиме подвести итоги прошедшей миллисекунды (сколько шагов фактически прошли по сравнению с требуемым количеством) и подготовить значение частоты для следующей :)
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Mamont
Мастер
Сообщения: 2005
Зарегистрирован: 10 дек 2015, 12:21
Репутация: 391
Настоящее имя: Виталий
Откуда: РБ Минск
Контактная информация:

Re: UART генератор импульсов

Сообщение Mamont »

Суммировать дробно_целые (речь не идет о цифрах с плавающей запятой) и целые - один фиг
Те же 0.123 можно представить как 0.123*100000 = 12300
1 -> 100000
12300
24600
36900
....
Суть не меняется.
В любом случае периоды следования импульсов будут кратны 10мкс интервалу (100кгц).
MX_Master писал(а):И какой МК выбран под это дело?

PIC24FJ32GA002 (до 16мгц) или PIC24HJ128GP502 (до 40мгц)
Просто они куплены и лежат в коробке. Первый куплен был раньше, под одни задачи, второй , пошустрее купил под эту задачу.

В случае успешной реализации выложу HEX файлик, схему подключения и протокол обмена с ПК.

Сергей Саныч писал(а):А так - можно будет в фоновом режиме подвести итоги прошедшей миллисекунды (сколько шагов фактически прошли по сравнению с требуемым количеством) и подготовить значение частоты для следующей :)
Так и будет. Прерывание завершено, основной цикл проги рассчитал данные на следующий период. А в этом прерывании данные запишутся в таймеры
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: UART генератор импульсов

Сообщение Morroc »

Mamont писал(а):В случае успешной реализации выложу HEX файлик, схему подключения и протокол обмена с ПК.
С чем то готовым из ПО его можно будет использовать или это такая будет... вещь в себе ?
Аватара пользователя
Mamont
Мастер
Сообщения: 2005
Зарегистрирован: 10 дек 2015, 12:21
Репутация: 391
Настоящее имя: Виталий
Откуда: РБ Минск
Контактная информация:

Re: UART генератор импульсов

Сообщение Mamont »

Morroc писал(а):
С чем то готовым из ПО его можно будет использовать или это такая будет... вещь в себе ?
ПО. ну хз, можно сделать плагин к мачу. Я планирую сделать свой простой ехе, могу выложить ( рано делить шкуру неубитого мамонта)
Чем проще, тем меньше ошибок делается

Потыкался осциллографом при работе с мач.
Да, все события квантованы по предустановленной частоте.
Вдобавок сам мач накидывает прилично нестабильности.
Вложения
pic_64_1_.jpg (1872 просмотра) <a class='original' href='./download/file.php?id=97065&mode=view' target=_blank>Загрузить оригинал (135.42 КБ)</a>
pic_64_3_.jpg (1872 просмотра) <a class='original' href='./download/file.php?id=97066&mode=view' target=_blank>Загрузить оригинал (138.71 КБ)</a>
Аватара пользователя
Mamont
Мастер
Сообщения: 2005
Зарегистрирован: 10 дек 2015, 12:21
Репутация: 391
Настоящее имя: Виталий
Откуда: РБ Минск
Контактная информация:

Re: UART генератор импульсов

Сообщение Mamont »

Несмотря на кажующуюся простоту алгоритма, реализация на асме немного вынесла мозги. Пришлось бокалом пенистого подправить
Пока реализовал без дробления шага.
Взамен этого комп должен выдавать данные приращений по милисекундным интервалам.

Частота выходных импульсов до 32кгц. дробность - 1/1024 шага (можно перебить коэффициенты, тогда будет или 64кгц 1/512 или 128кгц 1/256шага)


Пример комп заслал число +12345. Остаток дробного шага с предыдущего интервала 289.

Таймер периода шагов контролер в этом отрезке 32768000(*)/12345 = 2654. .

(*)32768000=32000*1024. (контроллер жужжать будет на 32мгц, за 1мс насчитает 32000 тиков. 1 целый шаг = 1024)

В исходное значение таймера впишем 2654*(1024-289)/1024 = 1904.
остаток новой дробной части (12345+289)%1024 = 346
Аватара пользователя
Mamont
Мастер
Сообщения: 2005
Зарегистрирован: 10 дек 2015, 12:21
Репутация: 391
Настоящее имя: Виталий
Откуда: РБ Минск
Контактная информация:

Re: UART генератор импульсов

Сообщение Mamont »

Моделирование в протеусе обнадежило, приятная четкость и стабильность частоты.
При одновременном возникновении двух шагов, задержка 0.48мкс , а так менее 0.1мкс

Пока поддерживается линейная интерполяция четырех осей. Для пятой оси надо шаманить что-то еще
Сделать осталось UART конвейер данных и проводить уже в натурные испытания.
Ответить

Вернуться в «Электроника»