• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Программные прерывания RTLхххх

Pyroprinter

New member
Добрый день.
Интересует программное прерывание 50кГц минимум.
Искал пару дней, ничего не нашел.
Даташит только усиливает комплекс неполноценности
Может кто просветит примером или статьей?
p.s. под Arduino IDE идеально, наверное это уже дерзость.
 

pvvx

Активный участник сообщества
Добрый день.
Интересует программное прерывание 50кГц минимум.
Искал пару дней, ничего не нашел.
Даташит только усиливает комплекс неполноценности
Может кто просветит примером или статьей?
p.s. под Arduino IDE идеально, наверное это уже дерзость.
На RTL серии "A" предел тактирования таймеров в 32 768 Гц.
Включаете к примеру UARTx, не включая выводы GPIO. Передаете посимвольно на X*10 baud в каждом прерывании TX UART.
По аналогии можно взять и SPI, и I2S. Получите прерывания до предела производительности CPU.
При работающем WiFi доступен 64-х битный счетчик в 1 us и стандартный регистр кол-ва тактов CPU со старта. Так-же есть прерывания по изменению на GPIO.

На RTL серии "B" есть ещё пачка быстрых аппаратных таймеров и проблем никаких нет. Но сделаны они быстрыми для работы c DMA - например для измерения длительностей каждого внешнего импульса или для генерации на GPIO последовательности импульсов PWM загружаемых по DMA... Можно использовать тупое прерывание по тикам таймера на частотах за 10 кГц - но это забить производительность CPU ненужной задачей.


Вообще прерывания менее 1 ms не нужны ни в какой пользовательской задаче у WiFi-SoC.
Что-то криво продумано в использовании и алгоритмах по решению задачи.
Шевелить ногами в WiFi-SoC - моветон.
Или вы решили не использовать RF часть и сделать из него прикладной MCU?
Для этого есть масса специализированных "ногодрыгательных" MCU.
 
Последнее редактирование:

Pyroprinter

New member
Спасибо за ответ. Можно уточнить как ?
По аналогии можно взять и SPI, и I2S. Получите прерывания до предела производительности CPU.
"
Уточняю задачу. Необходимы программные прерывания с частотой не ниже 50кГц, для управления шаговыми двигателями. Это уже давно мной реализовано под Windows. Перенес критическую часть(realtime) кода на ардуино и это нормально работает через usb. Теперь хочу понять, можно ли реалтайм чаcть реализовать на базе RTLxxxx и пользоваться wifi. Для реализации задачи необходимо:
1. Нормальная работа по tcp - предполагаю, что тут все в порядке :)
2. Программные прерывания не ниже 50кГц для формирования сигналов управления драйверами шаговых двигателей - не нашел ответа, а желательно примера. Вроде проц позволяет кучу разных прерываний.

Мне кажется, что "железо" RTLxxxx позволяет это сделать по характеристикам.
Можно ссылку или пример для понимания выше написанного?
 

pvvx

Активный участник сообщества
Тут не понятно, как вы в RTOS среде, распределяющей потоки с шагом 1 ms, хотите получить большую частоту обновления для исполнительного устройства.
Это как-бы первый вопрос.
Какие-то примеры для Ameba Arduino для сервоприводов были. Надо поискать - может вам подойдет.
Ameba Arduino: Peripherals & Examples – Realtek IoT/Arduino Solution
Реализаций управления шаговыми двигателями много... Каждый раз используются разные драйверы.
 

pvvx

Активный участник сообщества
2. Программные прерывания не ниже 50кГц для формирования сигналов управления драйверами шаговых двигателей - не нашел ответа, а желательно примера. Вроде проц позволяет кучу разных прерываний.
Да хотябы через ж. :) Назначаете вывод на TX UART требуемой частоты, соединяете TX - к пину c IRQ и получаете прерывание по изменению сигнала на пине.
RTL00MP3/RTL00_SDKV35a/example_sources/uart_clock at master · pvvx/RTL00MP3 · GitHub
:)
2. Программные прерывания не ниже 50кГц для формирования сигналов управления драйверами шаговых двигателей - не нашел ответа, а желательно примера. Вроде проц позволяет кучу разных прерываний.
Сказано уже - у серии RTL "A" таймеры тактируются частотой 32 768 Гц. Т.е. чаше 32 кГц вы не получите от них прерываний.
Остальные устройства, дающие прерывания тактируются и от 166666667 Гц и на них можно построить любые вызовы в этом диапазоне.
Вы не указали зачем вам "Прерывания в 40 кГц". Счетчиком считать время в 25 мкс? Пином дергать? Или что?
 
Последнее редактирование:

Pyroprinter

New member
pvvx спасибо огромное за ответы.
На RTL серии "A" предел тактирования таймеров в 32 768 Гц.
Серия "А" в топку :), пока.
Тут не понятно, как вы в RTOS среде, распределяющей потоки с шагом 1 ms, хотите получить большую частоту обновления для исполнительного устройства.
Я выясняю возможно ли это. Если возможно, то тогда буду брать конкретное устройство и впадать в дзен :p. На ардуино можно сделать программное прерывание хоть на 500кГц, но тогда основной цикл loop можно остановить.
Да хотябы через ж. :) Назначаете вывод на TX UART требуемой частоты, соединяете TX - к пину c IRQ и получаете прерывание по изменению сигнала на пине.
RTL00MP3/RTL00_SDKV35a/example_sources/uart_clock at master · pvvx/RTL00MP3 · GitHub
:)
посмотрел...ну... если нормально не получится можно будет попробовать через Ж :)
Вы не указали зачем вам "Прерывания в 40 кГц". Счетчиком считать время в 25 мкс? Пином дергать? Или что?
Я просил 50кГц :) а еще лучше 100кГц
Это необходимо для управления группой шаговых двигателей. В памяти создается кольцевой буфер со значениями выходов и временными задержками через которые эти значения должны появляться. В прерывании проверяется наступило время "выплюнуть" очередное значение на выход или нет. Чем выше частота прерывания, тем более плавное управление железом.
Правильно ли я понимаю? Вы предлагаете выставить счетчик на 25мкс и в цикле loop(основном) проверять его значение? Видимо и так можно(это лучше чем вариант "Ж" :)), но если есть возможность сделать по-человечески прерывание и в нем дергать ноги при необходимости, то формируемые сигналы на выходах будут намного правильнее по временным интервалам, а это очень критично на больших скоростях. Я доступно описал задачу?
Остальные устройства, дающие прерывания тактируются и от 166666667 Гц и на них можно построить любые вызовы в этом диапазоне.
Ну вот... А это можно подробнее?
 

pvvx

Активный участник сообщества
pvvx спасибо огромное за ответы.

Серия "А" в топку :), пока.

Я выясняю возможно ли это. Если возможно, то тогда буду брать конкретное устройство и впадать в дзен :p. На ардуино можно сделать программное прерывание хоть на 500кГц, но тогда основной цикл loop можно остановить.
Это на чем? На ESP8266 переполнение стека или потеря прерываний при пустом прерывании уже на сотне кГц при 160 MГц CLK CPU...
[/QUOTE]Я просил 50кГц :) а еще лучше 100кГц[/QUOTE]Это наверно к заказу за оплату... ;)
Это необходимо для управления группой шаговых двигателей. В памяти создается кольцевой буфер со значениями выходов и временными задержками через которые эти значения должны появляться. В прерывании проверяется наступило время "выплюнуть" очередное значение на выход или нет. Чем выше частота прерывания, тем более плавное управление железом.
Правильно ли я понимаю? Вы предлагаете выставить счетчик на 25мкс и в цикле loop(основном) проверять его значение? Видимо и так можно(это лучше чем вариант "Ж" :)), но если есть возможность сделать по-человечески прерывание и в нем дергать ноги при необходимости, то формируемые сигналы на выходах будут намного правильнее по временным интервалам, а это очень критично на больших скоростях. Я доступно описал задачу?
Угу - доступно. И тут вывод - не выйдет. Ядро у данного SoC одно, и оно должно обслуживать WiFi с запретами на время более низких приоритетов задач, да выполнять передачу beacon с точностью 1 us.
Ну вот... А это можно подробнее?
Подробнее - это уже рабботать на вас надо. Мне пока не надо было извращений на 100 тысяч прерываний в секунду. Если вы посчитаете, то это будет для RTL8710AF 80 000 000 / 100 000 = 800 тактов. Т.е. прерывание каждые 800 тактов CPU... Когда ему работать-то?
GPIO у Cortex M3 включено через НЧ шину...
У ESP8266 на один вывод в GPIO или чтение регистра контролеров уходит до 12 тактов при 160 МГц.

Вы в курсе, что 486 Intel не успевал обслуживать UART на малых скоростях - принимать из порта 115200/10=11520 байт, пока в UART не поставили аппаратное FIFO?

Любой такой ногодрыг решается исключительно через DMA и аппаратный контроллер. Например, если к RTL8195A подключить CY7С68013 в USB2.0, то он возможно успеет дрыгать ногами порта на 8 бит на ней в 20 МГц... Но не процом по прерываниям.
 
Последнее редактирование:

Pyroprinter

New member
PVVX ОГРОМНОЕ СПАСИБИЩЕ !
На ESP8266 переполнение стека или потеря прерываний при пустом прерывании уже на сотне кГц при 160 MГц CLK CPU...
Это диагноз-приговор.
Нет смысла дальше городить огород. ESP or RTL будет обслуживать протокол и отдавать данные на ардуину.
 

A_D

Active member
Это диагноз-приговор.
Нет смысла дальше городить огород. ESP or RTL будет обслуживать протокол и отдавать данные на ардуину.
зачем так усложнять...если заместо дурины ставится одна микруха PCA9685 и управляется по i2c. Получите необходимую точность и плавность. ;)
 

pvvx

Активный участник сообщества
зачем так усложнять...если заместо дурины ставится одна микруха PCA9685 и управляется по i2c. Получите необходимую точность и плавность. ;)
А может там "шаговик" собственной разработки. Их ныне много развелось... Велосипеды делают...
Контролеры шаговиков с ценником в дцать т.руб всего (обычно) до 10 кГц. :)
А тут 100 кГц просят...
STSPIN820 - Advanced 256 microsteps integrated motor driver with step-clock and direction interface - STMicroelectronics

TB6600 одной оси 4A Шаговые двигатели драйвер контроллера 9 ~ 40 В микро шаг ЧПУ купить на AliExpress
 
Последнее редактирование:

Pyroprinter

New member
А может там "шаговик" собственной разработки. Их ныне много развелось... Велосипеды делают...
Контролеры шаговиков с ценником в дцать т.руб всего (обычно) до 10 кГц. :)
А тут 100 кГц просят...
Для одной координаты конечно хватит 15кГц... но это не наш случай :)
У нас обычные шаговики. Но они управляют 4х координатным станком. Им необходимы разгоны, торможения, синхронная работа относительно друг-друга. Кроме того параметры координат неравнозначны. Ну к примеру одна координата линейная, а другая радиальная... не говоря о времени разгона и максимальной скорости. Чтоб все это не пошло в разнос все изменения накладываются на несущую частоту... чем она выше, тем все красивее работает :)
 

Pyroprinter

New member
У меня уже давно все решено. Просто хотел сделать управление по wifi. Не знал потянет ли камень еще и обслуживание моего буфера. Ответ получил - НЕТ. Ок, сделаем как планировалось в начале. Разделить задачи по камням. Оно так правильней :)
 

pvvx

Активный участник сообщества
У меня уже давно все решено. Просто хотел сделать управление по wifi. Не знал потянет ли камень еще и обслуживание моего буфера. Ответ получил - НЕТ. Ок, сделаем как планировалось в начале. Разделить задачи по камням. Оно так правильней :)
А не пойдет ли всё это всё в разнос при WiFi? Радио связь никогда не было 100%.
Для диагностики под контролем ещё можно её использовать, но на постоянку да в пром. применении то как?
 

Pyroprinter

New member
А не пойдет ли всё это всё в разнос при WiFi? Радио связь никогда не было 100%.
Для диагностики под контролем ещё можно её использовать, но на постоянку да в пром. применении то как?
Это мое производство... я его люблю и по-немногу модернизирую. Управлять по воздуху железом это так волшебно, что трудности меня не пугают. Если понадобится, буду протокол помехочуствительный делать.
 

sharikov

Active member
Можно попытаться использовать I2S - прикрутить к нему сдвиговые регистры. Но придется экспериментировать.
 

pvvx

Активный участник сообщества
Можно попытаться использовать I2S - прикрутить к нему сдвиговые регистры. Но придется экспериментировать.
Дрова шаговиков работают по SPI. Ставится по драйверу на движок и вперед.
Можно тут выбрать драйверы Stepper Motor Drivers - STMicroelectronics с SPI.
X-NUCLEO-IHM01A1...IHM14A1
 
Последнее редактирование:

rst

Member
Для одной координаты конечно хватит 15кГц... но это не наш случай :)
У нас обычные шаговики. Но они управляют 4х координатным станком. Им необходимы разгоны, торможения, синхронная работа относительно друг-друга. Кроме того параметры координат неравнозначны. Ну к примеру одна координата линейная, а другая радиальная... не говоря о времени разгона и максимальной скорости. Чтоб все это не пошло в разнос все изменения накладываются на несущую частоту... чем она выше, тем все красивее работает :)
Вы путаете всех здесь:
Вам нужны не высокочастотные прерывания, а нужна просто возможность выдать на некие выводы последовательность импульсов с изменяющейся частотой (линейно или по другому закону) и длительностью (линейно или по другому закону).
А уже придуманные прерывания - это способ реализации, причём самый тупой и дубовый - ногодрыгательный.
Такое управление шаговым движком нормально можно сделать на связке DMA->1_или_несколько_таймеров_с_ШИМ:
Рассчитывается 2 блока значений для регистров сравнения таймеров для формирования ими например серии импульсов нужной частоты за 2 периода частоты (2мс). Запускается DMA (с двойной буферизацией или связным списком или ещё как) так, чтобы оно передавало один блок значений, потом генерило прерывание и передавало следующий блок (без остановки). В ISR этого прерывания блок, только что переданный заполняется новыми рассчитываемыми значениями (например: нужно торможение - значит рассчитывается последовательность значений длительностей импульсов с линейно понижающейся частотой). DMA заканчивает передачу текущего блока и начинает передавать только что посчитанный блок, предварительно сгенерив прерывание, в ISR которого заполняется рассчитанными значениями новый освобождённый блок.
Никаких диких 50кГц и больше прерываний тут не нужно если думать головой - сильно сомневаюсь что в станке есть какие-то события на которые нужно реагировать быстрее чем 1мс. 1кГц прерываний (прерываний о завершении очередного блока DMA) тут будет за глаза.
В этом прерывании считаются все необходимые датчики и принимаются решения о изменении частоты ШИМов.
 

rst

Member
Дрова шаговиков работают по SPI.
Автору нужна линейно (или по другому закону) плавно меняющаяся частота и длительность импульсов. На SPI это не реализовать никак.
Но запросто делается на таймере имеющем теневые регистры сравнения и периода. Любой таймер умеющий ШИМ такие регистры имеет.
Далее - подключаем к этому таймеру DMA, считаем блок значений этих регистров (сравнения и периода) изменяющихся по заданному периоду, стартуем DMA и наслаждаемся плавно меняющимися оборотами двигателя. И без всяких диких высокочастотных прерываний и с почти ненагруженным ядром CPU.
 

pvvx

Активный участник сообщества
Автору нужна линейно (или по другому закону) плавно меняющаяся частота и длительность импульсов. На SPI это не реализовать никак.
Но запросто делается на таймере имеющем теневые регистры сравнения и периода. Любой таймер умеющий ШИМ такие регистры имеет.
Далее - подключаем к этому таймеру DMA, считаем блок значений этих регистров (сравнения и периода) изменяющихся по заданному периоду, стартуем DMA и наслаждаемся плавно меняющимися оборотами двигателя. И без всяких диких высокочастотных прерываний и с почти ненагруженным ядром CPU.
И делают это обычно на дополнительном MCU, чтобы исключить зависимости от других системных и иных процессов, тормозящих обработку. Тем самым всё упрощается.
Но тут, на сайте, в основном присутствуют люди, занимающиеся "спортивным интересом" и танцами с бубном вокруг Ардуино...
 
Сверху Снизу