sidor094 писал(а):Если говорить о мерцании экрана с частотой развертки то да.Обновление же экрана происходит точно так-же ,как и в лучквых.Вместе с частотой развертки построчно(даже правильнее сказать попиксельно).UAVpilot писал(а):В современных мониторах с подключением по DVI/DP/HDMI понятием развёртки можно пренебречь - оно используется лишь в маркетинговосравнительных целях
В любом случае у них все равно достаточно длительное послесвечение .Поэтому тянучки связаны не с разверткой ,а с медленным перезарядом емкостей .отсюда првный переход точки от предидущено состояния к нынешнему.
Но все это влияет особенности зрения и мало связано с реакцией игрока на события. Для нажатия на кнопку надо не только заметить изменение изображения но и успеть на него среанировать. Говоря про 100-400 мс я подразумеваю
время между изменением картинки и началом нажатия.То есть не просто заметить событие,но и успеть на него среагировать.Причем это автоматическая реакция.Когда человек уже наработал навык реагирования на данное событие и соответственно время на принятия решения не затрачивается.Неподготовленный человек(тот кто еще не автоматически реагирует на данное событие,а только знает,что нужно делать) добавит к этому еще время на принятие решения.
Ethernet контроллер для LinuxCNC (STM32, FPGA)
-
- Мастер
- Сообщения: 826
- Зарегистрирован: 20 фев 2014, 09:13
- Репутация: 81
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Сергей Саныч, а можно чуток подробнее о вашем способе? С какой частотой вызывается прерывание? Для каждого канала своё прерывание или единое для всех? Каким способом дёргаются пины (бит бандинг или "ручная" правка регистра вывода порта? Используется ли DMA?Сергей Саныч писал(а):У меня в автономном контроллере 3 канала с максимальной частотой шагов 131072 Гц (больше не требовалось). Тактовая частота МК (STM32F072) - 48 МГц. Расчет и вывод - по таймерному прерыванию. На входе - значение частоты в формате с фиксированной запятой, на выходе - последовательность STEP. На расчет и вывод 1 канала тратится 35-50 тактов (без использования ассемблера).
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2857
- Откуда: Тюмень
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Прерывание для генерации используется одно с частотой 131072 (2^17) Гц (макс. частота шагов). Бит-бандинг для работы с GPIO не использую, поскольку есть регистр BSRR. DMA не используется.MX_Master писал(а):Сергей Саныч, а можно чуток подробнее о вашем способе?
Алгоритм такой. По прерыванию:
1. В порт, где сосредоточены все Step'ы, выводится по BSRR одной командой промежуточная переменная-заготовка, где установлены биты для тех каналов, куда надо выдать импульсы. Этим формируется передний фронт. Значение ее вычислено в фазе 2 предыдущего прерывания.
2. Производится расчет для всех каналов, надо ли будет делать шаг. В результате заготовка получает новые значения для следующего цикла. Расчет - по алгоритму типа Брезенхомовского.
3. Биты Step всех каналов сбрасываются - одной командой и тоже через BSRR.
Таким образом, время расчета (фаза 2) используется одновременно как задержка, задающая длительность импульсов Step.
Конкретно получается около 2-2,5 мкс, что достаточно для 200-кГц драйверов.
Фрагмент программы постараюсь выложить, как доберусь до рабочего компьютера.
Чудес не бывает. Бывают фокусы.
- wldev
- Мастер
- Сообщения: 1639
- Зарегистрирован: 24 янв 2012, 16:04
- Репутация: 510
- Настоящее имя: Сергей Бочаров
- Откуда: Новосибирск
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Сергей Саныч,
Хотел спросить:
1 Какая минимальная частота step?
2 Чем ещё занимается контроллер во время генерации.
Хотел спросить:
1 Какая минимальная частота step?
2 Чем ещё занимается контроллер во время генерации.
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Bender, я надеюсь, в новой версии с STM32F4 ты выводишь шаги аппаратно?
- wldev
- Мастер
- Сообщения: 1639
- Зарегистрирован: 24 янв 2012, 16:04
- Репутация: 510
- Настоящее имя: Сергей Бочаров
- Откуда: Новосибирск
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Нет. Там Макс частота перемещения будет конечно больше.MX_Master писал(а):Bender, я надеюсь, в новой версии с STM32F4 ты выводишь шаги аппаратно?
..для шаговых большая частота и не нужна , а для сервопривод контроллеры могут выдавать квадратурный сигнал ABx4 в котором используется оба фронта в результате чего частота перемещения возрастёт в два раза при том же разрешение.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2857
- Откуда: Тюмень
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Ну, можно и 0Гц выдавать А вообще, (1/1024)Гц, то есть 1 импульс за 1024 сек. Дискретность задания частоты такая же. Неравномерность частоты - один период прерывания во всем диапазоне, что реальные ШД с драйверами не ощущают вообще никакBender писал(а):1 Какая минимальная частота step?
По второму прерыванию частотой 1024 Гц - расчетом параметров шаговой последовательности (путь, скорость, ускорение, направление), подсчет времени работы, опрос датчиков и кнопок. Прерывание имеет приоритет ниже, чем то, по которому идет генерация.Bender писал(а):2 Чем ещё занимается контроллер во время генерации.
В фоновом режиме - отработка управляющих воздействий (кнопки, энкодер), зашитых программ "верхнего уровня" (это не G-код), индикация (OLED-дисплей 128х64).
Чудес не бывает. Бывают фокусы.
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Для китайского контроллера хочу попробовать ещё один способ. Благо там свободны 10 таймеров..
Короче говоря, для каждого канала степ/дир берём по отдельному таймеру. Используем всего 1 канал от каждого в режиме Output Compare или PWM. Вывести аппаратно с таймера ничего нельзя, поэтому каждый таймер будет дёргать прерывания. На 1 период таймера будет 2 прерывания - Output Compare и Counter Update. Внутри каждого дёргаем нужный пин. И внутри любого из этих прерываний обновляем текущую позицию в шагах. Если какой-то канал степ/дир не используется, полностью отрубаем таймер.
Минус данного способа - в кол-ве прерываний. Чем больше степ/дир каналов в работе и чем выше частота, тем меньше времени на основной цикл. В котором, кстати, идёт работа с Ethernet пакетами. Из плюсов способа - можно точно выставить частоту и длительность импульса на каждом канале. Для LinuxCNC это явный плюс, ведь юзер сможет это всё менять в параметрах степген'а. Как привык.
Исходников китайской прошивки для Mach3 нет, но мне кажется, что китайцы таким способом шаги и выводили. Максимальная частота получится фиг знает какая Делайте ваши ставки На предстоящей неделе буду пробовать и замерю...
Короче говоря, для каждого канала степ/дир берём по отдельному таймеру. Используем всего 1 канал от каждого в режиме Output Compare или PWM. Вывести аппаратно с таймера ничего нельзя, поэтому каждый таймер будет дёргать прерывания. На 1 период таймера будет 2 прерывания - Output Compare и Counter Update. Внутри каждого дёргаем нужный пин. И внутри любого из этих прерываний обновляем текущую позицию в шагах. Если какой-то канал степ/дир не используется, полностью отрубаем таймер.
Минус данного способа - в кол-ве прерываний. Чем больше степ/дир каналов в работе и чем выше частота, тем меньше времени на основной цикл. В котором, кстати, идёт работа с Ethernet пакетами. Из плюсов способа - можно точно выставить частоту и длительность импульса на каждом канале. Для LinuxCNC это явный плюс, ведь юзер сможет это всё менять в параметрах степген'а. Как привык.
Исходников китайской прошивки для Mach3 нет, но мне кажется, что китайцы таким способом шаги и выводили. Максимальная частота получится фиг знает какая Делайте ваши ставки На предстоящей неделе буду пробовать и замерю...
- wldev
- Мастер
- Сообщения: 1639
- Зарегистрирован: 24 янв 2012, 16:04
- Репутация: 510
- Настоящее имя: Сергей Бочаров
- Откуда: Новосибирск
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Я бы сделал для начала как у Сергея Саныча. И довел бы все до готового образца. Чтобы были решены все моменты от протокола и драйвера до вывода шагов. А уже потом постепенно доводил систему...
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Сергей, протоколы уже готовы. И на голом Ethernet, и с LwIP (UDP), и даже веб-сервер робит. Единственная для меня неизвестность - это софт вывод шагов. Надо придумать одновременно быстрый, точный и лёгкий способ. Проц у F207 не резиновый В качестве теста хочу попробовать сервопериодную часть драйвера разместить в МК.
В моём варианте контроллера вывод шагов практически всегда аппаратный. Энкодеры и всё остальное тоже максимально аппаратные. В этом задумка и была. Но у меня там другая трудность - железо В электронике я зелен.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Тогда это очень странно...D.L. писал(а):Интересно на что? LCD был сразу подключен по DVI-D.
У меня стойкое ощущение, что мы о совершенно разных вещах спорим... Наверно лучше продолжить после хотя бы поверхностного ознакомления с устройством LinuxCNC...sidor094 писал(а):Да хоть сколько.Вот самый простой алгоритм работы.например у нас выставлен делитель на 100000.Контроллер заканчивает цикл.
Ёмкости там не при чём. Суть в скорости изменения ориентации (прозрачности) жидких кристаллов. На значительное изменение ориентации пикселя нужно несколько миллисекунд, а вот на поддержание ранее установленной времени практически не требуется. современные карты и мониторы с цифровым подключением умеют этим пользоваться для ускорения "регенерации". Наиболее сильно это проявляется в настоящих OLED мониторах - там изображение "мерцает" с частотой в несколько десятков килогерц (ШИМ управления яркостью). Но это уже совсем далеко от темы.sidor094 писал(а):В любом случае у них все равно достаточно длительное послесвечение .Поэтому тянучки связаны не с разверткой ,а с медленным перезарядом емкостей .отсюда првный переход точки от предидущено состояния к нынешнему.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2857
- Откуда: Тюмень
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Сергей Саныч писал(а):Фрагмент программы постараюсь выложить
Код: Выделить всё
// Генерация импульсов 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; // Сброс флага прерывания
}
Чудес не бывает. Бывают фокусы.
-
- Мастер
- Сообщения: 628
- Зарегистрирован: 02 сен 2018, 15:15
- Репутация: 305
- Настоящее имя: Alex
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Мир не заканчивается на F207. Есть, например, 28 серия у Техаса, где эвивалентная частота тактирования ШИМ достигает пары гигагерц за счет использования коммутируемых задержек, есть всевозможные бюджетные FPGA. Когда нибудь захочется несколько каналов, как у Сименса, с возможностью параллельной работы и синхронизации. Тоже все в одну STM-ку будете втискивать?MX_Master писал(а):Проц у F207 не резиновый
"Глобус трещит, сова пищит"
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
В данном случае (в этом ответвлении этой темы) мир ограничен вот такой "железкой": Re: Контроллер для LinuxCNC (Ethernet + STM32) #727dpss-2 писал(а):Мир не заканчивается на F207.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- going
- Мастер
- Сообщения: 523
- Зарегистрирован: 29 сен 2013, 20:55
- Репутация: 129
- Настоящее имя: Леонид
- Откуда: г.Киров
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
powertop покажет сколько времени процессора потрачено программой за 1 сек.MX_Master писал(а): ....быстрый способ подсчитать какую часть времени процессора съедают ...
Это не только прерывания, а также программное расширение таймера до 1 нс.MX_Master писал(а): сколько кушает программный ногодрыг
Небольшой кусок вывода 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
Платы: BPI-M3, BPI-A64, OPI-PC2
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Спасибо, а для микроконтроллера как?
-
- Мастер
- Сообщения: 474
- Зарегистрирован: 25 авг 2018, 10:11
- Репутация: 152
- Настоящее имя: Дмитрий
- Откуда: Киров
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Устанавливаем лог. 1 на свободную ногу на входе в прерывание, и сбрасываем на выходе.MX_Master писал(а):Спасибо, а для микроконтроллера как?
И дальше смотрим логическим анализатором или осциллографом длительность импульса.
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Накатал для теста простой софт генератор шагов на прерываниях. Частота проца 120 МГц. Запустил всего 1 канал вывода шагов на частоте 192192 Гц. Используются 2 прерывания, каждое на частоте 192192 Гц. Вывод довольно точный. Но у процессора это отнимает целую треть всего времени. Оценку времени сделал простую. В основном цикле прибавляю по единице к переменной. Смотрю какое число набегает за минуту со включенным выводом шагов и без него.
Прерывания, учитывая все накладные расходы, это слишком дорогое удовольствие для процессора. На частотах порядка 200 КГц можно юзать одно-два прерывания, а всё остальное надо делать программно внутри них. Тогда у процессора останется хотя бы какое-то время на разные подсчёты в сервоцикле и основной программе. Категорически непонятно зачем китайцы в своём контроллере выводят шаги программно. Это ужасно неэффективно
Прерывания, учитывая все накладные расходы, это слишком дорогое удовольствие для процессора. На частотах порядка 200 КГц можно юзать одно-два прерывания, а всё остальное надо делать программно внутри них. Тогда у процессора останется хотя бы какое-то время на разные подсчёты в сервоцикле и основной программе. Категорически непонятно зачем китайцы в своём контроллере выводят шаги программно. Это ужасно неэффективно
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2857
- Откуда: Тюмень
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Да. Кроме того, надо правильно распределить приоритеты, чтобы прерывания не мешали друг другу и не "наступали себе на хвост". Поэтому на генерацию - одно прерывание, на сервоцикл - второе, все остальное - в фоне.MX_Master писал(а):На частотах порядка 200 КГц можно юзать одно-два прерывания, а всё остальное надо делать программно внутри них.
Насчет "неэффективности" - а много ли времени займут "разные подсчеты"? И что еще МК делать? Да пусть хоть полностью будет загружен, лишь бы успевал вовремя делать всё, что надо.
Полностью аппаратный вывод расточителен с точки зрения количества потребных таймеров - на каждый канал надо минимум две штуки - один на генерацию, второй на подсчет шагов. Ещё и не всякие таймеры из STM-овского зоопарка подойдут.
Чудес не бывает. Бывают фокусы.
- MX_Master
- Мастер
- Сообщения: 7478
- Зарегистрирован: 27 июн 2015, 19:45
- Репутация: 3099
- Настоящее имя: Михаил
- Откуда: Алматы
- Контактная информация:
Re: Контроллер для LinuxCNC (Ethernet + STM32)
Для проца всегда есть работа. Поэтому, если есть возможность не грузить проц, надо так и сделать.
По два таймера на канал - это в идеале. Я уже давно придумал способ, где используется только 1 таймер для вывода и DMA в роли счетчика. Шина к памяти и периферии при этом нагружены сильно, но на F103C8T6 таким способом я стабильно выводил по мегагерцу на каждом из 4-х каналов. А на F407 - по 2 МГц. Стессна, при условии, что всё разведено на пины аппаратных таймеров. Однако, в китайском контроллере всё иначе. Зато 10 таймеров полностью свободны.
Надо попробовать ещё один способ. На этот раз с DMA. Посижу сегодня вечером над реализацией.
По два таймера на канал - это в идеале. Я уже давно придумал способ, где используется только 1 таймер для вывода и DMA в роли счетчика. Шина к памяти и периферии при этом нагружены сильно, но на F103C8T6 таким способом я стабильно выводил по мегагерцу на каждом из 4-х каналов. А на F407 - по 2 МГц. Стессна, при условии, что всё разведено на пины аппаратных таймеров. Однако, в китайском контроллере всё иначе. Зато 10 таймеров полностью свободны.
Надо попробовать ещё один способ. На этот раз с DMA. Посижу сегодня вечером над реализацией.