Учитывая, что mach3 слеплен из кусков EMC2, авторских ошибок и виндовых библиотечных элементов - он не сильно отличается по логике работы.Сергей Саныч писал(а):Не знаю, как в Маче, а в LCNC он активно применяется
UART генератор импульсов
- michael-yurov
 - Почётный участник

 - Сообщения: 11730
 - Зарегистрирован: 26 июл 2012, 00:10
 - Репутация: 4703
 - Настоящее имя: Михаил Львович
 - Откуда: Новоуральск
 - Контактная информация:
 
Re: UART генератор импульсов
- Сергей Саныч
 - Мастер
 - Сообщения: 9116
 - Зарегистрирован: 30 май 2012, 14:20
 - Репутация: 2858
 - Откуда: Тюмень
 - Контактная информация:
 
Re: UART генератор импульсов
На невысоких скоростях неравномерностей практически не будет. Точнее, они останутся равными периоду базовой частоты. Скажем, при базовой 30 кГц неравномерность генерации частоты шагов порядка 100 имп/сек будет не более 0,3 %Mamont писал(а):такие неравномерности движения прокатят для шаговых движков только на невысоких скоростях.
Чудес не бывает. Бывают фокусы.
						- Mamont
 - Мастер
 - Сообщения: 2005
 - Зарегистрирован: 10 дек 2015, 12:21
 - Репутация: 391
 - Настоящее имя: Виталий
 - Откуда: РБ Минск
 - Контактная информация:
 
Re: UART генератор импульсов
В самом начале были мысли делать более простой, дробно-инкрементальный. Когда достаточно одного таймера
Допустим основная частота 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кгц можно и поднять.
Ну и опять таки, загрузка контролера- все время он только и будет занят работой сумирования-сумирования-сумирования.
А потом если что пенять , ай контролер слабый, надо АРМ или ПЛИСку. В задуманом алгоритме контролер будет занят вычислениями только на границах стыков милисикундных интервалов.
			
			
									
									
						Допустим основная частота 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 генератор импульсов
И какой МК выбран под это дело?
			
			
									
									
						- michael-yurov
 - Почётный участник

 - Сообщения: 11730
 - Зарегистрирован: 26 июл 2012, 00:10
 - Репутация: 4703
 - Настоящее имя: Михаил Львович
 - Откуда: Новоуральск
 - Контактная информация:
 
Re: UART генератор импульсов
Куда лучше равномерно распределенная по времени простая и быстрая операция сложения целых чисел, чем операция деления "на границах стыков".Mamont писал(а):Ну и опять таки, загрузка контролера- все время он только и будет занят работой сумирования-сумирования-сумирования.
А потом если что пенять , ай контролер слабый, надо АРМ или ПЛИСку. В задуманом алгоритме контролер будет занят вычислениями только на границах стыков милисикундных интервалов.
К тому же в первом случае будет легко подсчитать сгенерированные импульсы. А во втором - потребуется обработка прерываний (что накладно в плане производительности).
- Сергей Саныч
 - Мастер
 - Сообщения: 9116
 - Зарегистрирован: 30 май 2012, 14:20
 - Репутация: 2858
 - Откуда: Тюмень
 - Контактная информация:
 
Re: UART генератор импульсов
На такой частоте (15 кГц) даже не почувствуетMamont писал(а):неравномерность ~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 генератор импульсов
Большинство современных МК делает эти операции (целочисленные) за 1 такт. Насчет "все время" - одна или две операции на ось за цикл прерывания с базовой частотой. Меньше 1 процента процессорного времени при тактовой 32 МГц. Тем более, что эти операции размазаны по времени. Ну и накладные расходы на обработку одного прерывания с постоянной частотой куда как меньше, чем на обработку четырех-пяти прерыванй, которые между собой никак не связаны.Mamont писал(а):Ну и опять таки, загрузка контролера- все время он только и будет занят работой сумирования-сумирования-сумирования.
					Последний раз редактировалось Сергей Саныч 08 дек 2016, 10:32, всего редактировалось 1 раз.
									
			
									Чудес не бывает. Бывают фокусы.
						- Сергей Саныч
 - Мастер
 - Сообщения: 9116
 - Зарегистрирован: 30 май 2012, 14:20
 - Репутация: 2858
 - Откуда: Тюмень
 - Контактная информация:
 
Re: UART генератор импульсов
А так - можно будет в фоновом режиме подвести итоги прошедшей миллисекунды (сколько шагов фактически прошли по сравнению с требуемым количеством) и подготовить значение частоты для следующейMamont писал(а):В задуманом алгоритме контролер будет занят вычислениями только на границах стыков милисикундных интервалов.
Чудес не бывает. Бывают фокусы.
						- Mamont
 - Мастер
 - Сообщения: 2005
 - Зарегистрирован: 10 дек 2015, 12:21
 - Репутация: 391
 - Настоящее имя: Виталий
 - Откуда: РБ Минск
 - Контактная информация:
 
Re: UART генератор импульсов
Суммировать дробно_целые (речь не идет о цифрах с плавающей запятой) и целые - один фиг
Те же 0.123 можно представить как 0.123*100000 = 12300
1 -> 100000
12300
24600
36900
....
Суть не меняется.
В любом случае периоды следования импульсов будут кратны 10мкс интервалу (100кгц).
PIC24FJ32GA002 (до 16мгц) или PIC24HJ128GP502 (до 40мгц)
Просто они куплены и лежат в коробке. Первый куплен был раньше, под одни задачи, второй , пошустрее купил под эту задачу.
В случае успешной реализации выложу HEX файлик, схему подключения и протокол обмена с ПК.
			
			
									
									
						Те же 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 генератор импульсов
С чем то готовым из ПО его можно будет использовать или это такая будет... вещь в себе ?Mamont писал(а):В случае успешной реализации выложу HEX файлик, схему подключения и протокол обмена с ПК.
- Mamont
 - Мастер
 - Сообщения: 2005
 - Зарегистрирован: 10 дек 2015, 12:21
 - Репутация: 391
 - Настоящее имя: Виталий
 - Откуда: РБ Минск
 - Контактная информация:
 
Re: UART генератор импульсов
ПО. ну хз, можно сделать плагин к мачу. Я планирую сделать свой простой ехе, могу выложить ( рано делить шкуру неубитого мамонта)Morroc писал(а):
С чем то готовым из ПО его можно будет использовать или это такая будет... вещь в себе ?
Чем проще, тем меньше ошибок делается
Потыкался осциллографом при работе с мач.
Да, все события квантованы по предустановленной частоте.
Вдобавок сам мач накидывает прилично нестабильности.
- Mamont
 - Мастер
 - Сообщения: 2005
 - Зарегистрирован: 10 дек 2015, 12:21
 - Репутация: 391
 - Настоящее имя: Виталий
 - Откуда: РБ Минск
 - Контактная информация:
 
Re: UART генератор импульсов
Несмотря на кажующуюся простоту алгоритма, реализация на асме немного вынесла мозги. Пришлось бокалом пенистого подправить
Пока реализовал без дробления шага.
Взамен этого комп должен выдавать данные приращений по милисекундным интервалам.
Частота выходных импульсов до 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
			
			
									
									
						Пока реализовал без дробления шага.
Взамен этого комп должен выдавать данные приращений по милисекундным интервалам.
Частота выходных импульсов до 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 генератор импульсов
Моделирование  в протеусе обнадежило, приятная четкость и стабильность частоты.
При одновременном возникновении двух шагов, задержка 0.48мкс , а так менее 0.1мкс
Пока поддерживается линейная интерполяция четырех осей. Для пятой оси надо шаманить что-то еще
Сделать осталось UART конвейер данных и проводить уже в натурные испытания.
			
			
									
									
						При одновременном возникновении двух шагов, задержка 0.48мкс , а так менее 0.1мкс
Пока поддерживается линейная интерполяция четырех осей. Для пятой оси надо шаманить что-то еще
Сделать осталось UART конвейер данных и проводить уже в натурные испытания.