Страница 41 из 71
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 09:50
sidor094
sidor094 писал(а):UAVpilot писал(а):В современных мониторах с подключением по DVI/DP/HDMI понятием развёртки можно пренебречь - оно используется лишь в маркетинговосравнительных целях
Если говорить о мерцании экрана с частотой развертки то да.Обновление же экрана происходит точно так-же ,как и в лучквых.Вместе с частотой развертки построчно(даже правильнее сказать попиксельно).
В любом случае у них все равно достаточно длительное послесвечение .Поэтому тянучки связаны не с разверткой ,а с медленным перезарядом емкостей .отсюда првный переход точки от предидущено состояния к нынешнему.
Но все это влияет особенности зрения и мало связано с реакцией игрока на события. Для нажатия на кнопку надо не только заметить изменение изображения но и успеть на него среанировать. Говоря про 100-400 мс я подразумеваю
время между изменением картинки и началом нажатия.То есть не просто заметить событие,но и успеть на него среагировать.Причем это автоматическая реакция.Когда человек уже наработал навык реагирования на данное событие и соответственно время на принятия решения не затрачивается.Неподготовленный человек(тот кто еще не автоматически реагирует на данное событие,а только знает,что нужно делать) добавит к этому еще время на принятие решения.
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 11:45
MX_Master
Сергей Саныч писал(а):У меня в автономном контроллере 3 канала с максимальной частотой шагов 131072 Гц (больше не требовалось). Тактовая частота МК (STM32F072) - 48 МГц. Расчет и вывод - по таймерному прерыванию. На входе - значение частоты в формате с фиксированной запятой, на выходе - последовательность STEP. На расчет и вывод 1 канала тратится 35-50 тактов (без использования ассемблера).
Сергей Саныч, а можно чуток подробнее о вашем способе? С какой частотой вызывается прерывание? Для каждого канала своё прерывание или единое для всех? Каким способом дёргаются пины (бит бандинг или "ручная" правка регистра вывода порта? Используется ли
DMA?
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 15:05
Сергей Саныч
MX_Master писал(а):Сергей Саныч, а можно чуток подробнее о вашем способе?
Прерывание для генерации используется одно с частотой 131072 (2^17) Гц (макс. частота шагов). Бит-бандинг для работы с GPIO не использую, поскольку есть регистр BSRR. DMA не используется.
Алгоритм такой. По прерыванию:
1. В порт, где сосредоточены все Step'ы, выводится по BSRR одной командой промежуточная переменная-заготовка, где установлены биты для тех каналов, куда надо выдать импульсы. Этим формируется передний фронт. Значение ее вычислено в фазе 2 предыдущего прерывания.
2. Производится расчет для всех каналов, надо ли будет делать шаг. В результате заготовка получает новые значения для следующего цикла. Расчет - по алгоритму типа Брезенхомовского.
3. Биты Step всех каналов сбрасываются - одной командой и тоже через BSRR.
Таким образом, время расчета (фаза 2) используется одновременно как задержка, задающая длительность импульсов Step.
Конкретно получается около 2-2,5 мкс, что достаточно для 200-кГц драйверов.
Фрагмент программы постараюсь выложить, как доберусь до рабочего компьютера.
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 15:27
wldev
Сергей Саныч,
Хотел спросить:
1 Какая минимальная частота step?
2 Чем ещё занимается контроллер во время генерации.
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 16:06
MX_Master
Bender, я надеюсь, в новой версии с
STM32F4 ты выводишь шаги аппаратно?

Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 16:24
wldev
MX_Master писал(а):Bender, я надеюсь, в новой версии с
STM32F4 ты выводишь шаги аппаратно?

Нет. Там Макс частота перемещения будет конечно больше.
..для шаговых большая частота и не нужна , а для сервопривод контроллеры могут выдавать квадратурный сигнал ABx4 в котором используется оба фронта в результате чего частота перемещения возрастёт в два раза при том же разрешение.
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 16:31
Сергей Саныч
Bender писал(а):1 Какая минимальная частота step?
Ну, можно и 0Гц выдавать

А вообще, (1/1024)Гц, то есть 1 импульс за 1024 сек. Дискретность задания частоты такая же. Неравномерность частоты - один период прерывания во всем диапазоне, что реальные ШД с драйверами не ощущают вообще никак
Bender писал(а):2 Чем ещё занимается контроллер во время генерации.
По второму прерыванию частотой 1024 Гц - расчетом параметров шаговой последовательности (путь, скорость, ускорение, направление), подсчет времени работы, опрос датчиков и кнопок. Прерывание имеет приоритет ниже, чем то, по которому идет генерация.
В фоновом режиме - отработка управляющих воздействий (кнопки, энкодер), зашитых программ "верхнего уровня" (это не G-код), индикация (OLED-дисплей 128х64).
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 17:35
MX_Master
Для китайского контроллера хочу попробовать ещё один способ. Благо там свободны 10 таймеров..
Короче говоря, для каждого канала
степ/дир берём по отдельному таймеру. Используем всего 1 канал от каждого в режиме
Output Compare или
PWM. Вывести аппаратно с таймера ничего нельзя, поэтому каждый таймер будет дёргать прерывания. На 1 период таймера будет 2 прерывания -
Output Compare и
Counter Update. Внутри каждого дёргаем нужный пин. И внутри любого из этих прерываний обновляем текущую позицию в шагах. Если какой-то канал
степ/дир не используется, полностью отрубаем таймер.
Минус данного способа - в кол-ве прерываний. Чем больше
степ/дир каналов в работе и чем выше частота, тем меньше времени на основной цикл. В котором, кстати, идёт работа с
Ethernet пакетами. Из плюсов способа - можно точно выставить частоту и длительность импульса на каждом канале. Для
LinuxCNC это явный плюс, ведь юзер сможет это всё менять в параметрах
степген'а. Как привык.
Исходников китайской прошивки для
Mach3 нет, но мне кажется, что китайцы таким способом шаги и выводили. Максимальная частота получится фиг знает какая

Делайте ваши ставки

На предстоящей неделе буду пробовать и замерю...
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 18:38
wldev
Я бы сделал для начала как у Сергея Саныча. И довел бы все до готового образца. Чтобы были решены все моменты от протокола и драйвера до вывода шагов. А уже потом постепенно доводил систему...
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 19:00
MX_Master
Сергей, протоколы уже готовы. И на голом
Ethernet, и с
LwIP (UDP), и даже веб-сервер робит. Единственная для меня неизвестность - это софт вывод шагов. Надо придумать одновременно быстрый, точный и лёгкий способ. Проц у
F207 не резиновый

В качестве теста хочу попробовать сервопериодную часть драйвера разместить в МК.
В моём варианте контроллера вывод шагов практически всегда аппаратный. Энкодеры и всё остальное тоже максимально аппаратные. В этом задумка и была. Но у меня там другая трудность - железо

В электронике я зелен.
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 03 ноя 2019, 20:36
Serg
D.L. писал(а):Интересно на что? LCD был сразу подключен по DVI-D.
Тогда это очень странно...
sidor094 писал(а):Да хоть сколько.Вот самый простой алгоритм работы.например у нас выставлен делитель на 100000.Контроллер заканчивает цикл.
У меня стойкое ощущение, что мы о совершенно разных вещах спорим... Наверно лучше продолжить после хотя бы поверхностного ознакомления с устройством LinuxCNC...
sidor094 писал(а):В любом случае у них все равно достаточно длительное послесвечение .Поэтому тянучки связаны не с разверткой ,а с медленным перезарядом емкостей .отсюда првный переход точки от предидущено состояния к нынешнему.
Ёмкости там не при чём. Суть в скорости изменения ориентации (прозрачности) жидких кристаллов. На значительное изменение ориентации пикселя нужно несколько миллисекунд, а вот на поддержание ранее установленной времени практически не требуется. современные карты и мониторы с цифровым подключением умеют этим пользоваться для ускорения "регенерации". Наиболее сильно это проявляется в настоящих OLED мониторах - там изображение "мерцает" с частотой в несколько десятков килогерц (ШИМ управления яркостью). Но это уже совсем далеко от темы.

Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 04 ноя 2019, 09:18
Сергей Саныч
Сергей Саныч писал(а):Фрагмент программы постараюсь выложить
Код: Выделить всё
// Генерация импульсов Step по таймерному прерыванию (частота 131072 Гц)
// Частота задается элементом Channels[x].Vstep
// Формат - 32-битный в доп. коде со знаком и с фикс. запятой (22.10)
// Справка. Операции сложения/вычитания с фикс. запятой производятся точно так же,
// как с целыми числами. Отличие только в интерпретации значения. В данном случае
// самый младший бит имеет "цену" 1/1024 Гц.
// Элемент Channels[x].gencnt - накопительный счетчик. Если при очередном прибавлении Vstep в gencnt меняется значение бита 27, то надо генерировать очередной Step.
// Channels[0].StepCurPos - счетчик шагов перемещения с учетом направления, которое задается знаком Vstep (Физический сигнал Dir формируется отдельно).
void TIM7_IRQHandler(void)
{
int_fast32_t t;
static uint32_t stepout; // Заготовка для вывода Step'ов
GPIOC->BSRR = stepout;// Выдача Step-ов
stepout = 0; // Зачистка заготовки
// Генерация шагов
t = Channels[0].gencnt;
Channels[0].gencnt += Channels[0].Vstep;
if((t ^ Channels[0].gencnt) & (1<<27)) { // Для Fbase = 131072
stepout |= SM1_STEP_Pin << 16; // Заготовка вывода шагов по BSRR (инверсно)
if(Channels[0].Vstep < 0) // Подсчет
Channels[0].StepCurPos--;
else
Channels[0].StepCurPos++;
}
t = Channels[1].gencnt;
Channels[1].gencnt += Channels[1].Vstep;
if((t ^ Channels[1].gencnt) & (1<<27)) { // Для Fbase = 131072
stepout |= SM2_STEP_Pin << 16; // Заготовка вывода шагов по BSRR (инверсно)
if(Channels[1].Vstep < 0) // Подсчет
Channels[1].StepCurPos--;
else
Channels[1].StepCurPos++;
}
t = Channels[2].gencnt;
Channels[2].gencnt += Channels[2].Vstep;
if((t ^ Channels[2].gencnt) & (1<<27)) { // Для Fbase = 131072
stepout |= SM3_STEP_Pin << 16; // Заготовка вывода шагов по BSRR (инверсно)
if(Channels[2].Vstep < 0) // Подсчет
Channels[2].StepCurPos--;
else
Channels[2].StepCurPos++;
}
GPIOC->BSRR = SM1_STEP_Pin | SM2_STEP_Pin | SM3_STEP_Pin; // Сброс всех Step'ов
TIM7->SR &= ~TIM_SR_UIF; // Сброс флага прерывания
}
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 04 ноя 2019, 12:28
dpss-2
MX_Master писал(а):Проц у F207 не резиновый
Мир не заканчивается на F207. Есть, например, 28 серия у Техаса, где эвивалентная частота тактирования ШИМ достигает пары гигагерц за счет использования коммутируемых задержек, есть всевозможные бюджетные FPGA. Когда нибудь захочется несколько каналов, как у Сименса, с возможностью параллельной работы и синхронизации. Тоже все в одну STM-ку будете втискивать?
"Глобус трещит, сова пищит"

Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 04 ноя 2019, 14:05
Serg
dpss-2 писал(а):Мир не заканчивается на F207.
В данном случае (в этом ответвлении этой темы) мир ограничен вот такой "железкой":
Re: Контроллер для LinuxCNC (Ethernet + STM32) #727 
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 04 ноя 2019, 19:39
going
MX_Master писал(а): ....быстрый способ подсчитать какую часть времени процессора съедают ...
powertop покажет сколько времени процессора потрачено программой за 1 сек.
MX_Master писал(а): сколько кушает программный ногодрыг
Это не только прерывания, а также программное расширение таймера до 1 нс.
Небольшой кусок вывода powertop
Код: Выделить всё
554,3 µs/s 55,0 Timer tick_sched_timer
2,1 ms/s 17,1 Process /usr/bin/konsole -session 1014d100d5ec000152765945700000025040010_1572718172_59924
28,7 µs/s 15,9 Timer ehci_hrtimer_func
7,1 ms/s 11,3 Process /usr/bin/Xorg -br :0 vt7 -nolisten tcp -seat seat0 -auth /var/lib/kdm/AuthFiles/A:0-JYSrZb
83,7 µs/s 11,1 Process [xfsaild/sdb7]
75,2 µs/s 9,2 Process [rcu_sched]
330,0 µs/s 8,6 Interrupt [0] HI_SOFTIRQ
3,1 ms/s 7,3 Process qdbus
4,6 ms/s 6,7 Process ksysguardd
389,2 µs/s 4,6 Interrupt [7] sched(softirq)
75,8 µs/s 4,7 Interrupt [25] i915
40,5 µs/s 4,3 Process /usr/sbin/haveged -w 1024 -v 0 -F
6,4 ms/s 1,6 Process plasmashell
517,7 µs/s 3,8 Process /usr/lib/udisks2/udisksd --no-debug
51,0 µs/s 3,6 Process [i915/signal:0]
82,3 µs/s 3,4 kWork cache_reap
411,6 µs/s 1,0 Process /usr/lib/mission-control-5
5,6 µs/s 1,0 kWork intel_unpin_work_fn
2,7 µs/s 1,0 Timer sched_rt_period_timer
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 04 ноя 2019, 21:18
MX_Master
Спасибо, а для микроконтроллера как?

Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 04 ноя 2019, 22:43
D.L.
MX_Master писал(а):Спасибо, а для микроконтроллера как?
Устанавливаем лог. 1 на свободную ногу на входе в прерывание, и сбрасываем на выходе.
И дальше смотрим логическим анализатором или осциллографом длительность импульса.
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 04 ноя 2019, 23:28
MX_Master
Накатал для теста простой софт генератор шагов на прерываниях. Частота проца
120 МГц. Запустил всего 1 канал вывода шагов на частоте
192192 Гц. Используются 2 прерывания, каждое на частоте 192192 Гц. Вывод довольно точный. Но у процессора это отнимает целую треть всего времени. Оценку времени сделал простую. В основном цикле прибавляю по единице к переменной. Смотрю какое число набегает за минуту со включенным выводом шагов и без него.
Прерывания, учитывая все накладные расходы, это слишком дорогое удовольствие для процессора. На частотах порядка 200 КГц можно юзать одно-два прерывания, а всё остальное надо делать программно внутри них. Тогда у процессора останется хотя бы какое-то время на разные подсчёты в сервоцикле и основной программе. Категорически непонятно зачем китайцы в своём контроллере выводят шаги программно. Это ужасно неэффективно

Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 05 ноя 2019, 04:52
Сергей Саныч
MX_Master писал(а):На частотах порядка 200 КГц можно юзать одно-два прерывания, а всё остальное надо делать программно внутри них.
Да. Кроме того, надо правильно распределить приоритеты, чтобы прерывания не мешали друг другу и не "наступали себе на хвост". Поэтому на генерацию - одно прерывание, на сервоцикл - второе, все остальное - в фоне.
Насчет "неэффективности" - а много ли времени займут "разные подсчеты"? И что еще МК делать? Да пусть хоть полностью будет загружен, лишь бы успевал вовремя делать всё, что надо.
Полностью аппаратный вывод расточителен с точки зрения количества потребных таймеров - на каждый канал надо минимум две штуки - один на генерацию, второй на подсчет шагов. Ещё и не всякие таймеры из STM-овского зоопарка подойдут.
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Добавлено: 05 ноя 2019, 06:31
MX_Master
Для проца всегда есть работа. Поэтому, если есть возможность не грузить проц, надо так и сделать.
По два таймера на канал - это в идеале. Я уже давно придумал способ, где используется только 1 таймер для вывода и DMA в роли счетчика. Шина к памяти и периферии при этом нагружены сильно, но на F103C8T6 таким способом я стабильно выводил по мегагерцу на каждом из 4-х каналов. А на F407 - по 2 МГц. Стессна, при условии, что всё разведено на пины аппаратных таймеров. Однако, в китайском контроллере всё иначе. Зато 10 таймеров полностью свободны.
Надо попробовать ещё один способ. На этот раз с DMA. Посижу сегодня вечером над реализацией.