увеличить количество аппаратных прерываний в ардуино

vortigont

★★★★★✩✩
24 Апр 2020
852
461
Saint-Petersburg, Russia
можно ли объяснить это? что в нём не так, и чем ШИМ в есп от него отличается?
в аврках ШИМ завязан на аппаратные таймеры общего назначания, которых в меге штук 5 что ли. Какие-то уже заняты под millis() и serial, остальные четко раскиданы по определенным пинам. Плюс там еще есть целая пачка ограничений типа phase correct/fast pwm. Настраиваете ШИМ определенной частоты/разрядности - забираете один аппаратный таймер. Детально надо смотреть в документацию.
В есп32 есть 2 отдельных движка для ШИМ - LEDC и MCPWM, у каждого свой отдельный набор таймеров, которые больше ничем не используются. Плюс матричный коммутатор через который можно вывести pwm канал на любой пин (ну почти на любой).

А какое отношение имеет DMA к PWM? Трёхфазным мотором может и AVR управлять.
только то что в атмеге нет ни ДМА ни выделенной pwm периферии. Управлять то можно и с атмеги, кто спорит. Но это будет полупрограммный и сильно ограниченный функционал. В лабе или дома поиграть. Напр в MCPWM есть фунционал "Dead Time Generator" для устранения сквозных токов в Н-мостах, программно это реализовать будет очень и очень непросто.
 
  • Лойс +1
Реакции: Andrey12 и te238s

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
Народ! Мне пришлось тему читать сначала,потому что уже забыл чего,собственно,затевается. Непорядок))
@avan,для начала прикинь,посчитай какая погрешность в микросекундах приемлема в устройстве,отсюда будем отталкиваться.
Максимальное время регистрации прерывания и реакции на него.
 
6 Янв 2020
122
-4
Максимальное время регистрации прерывания и реакции на него
не в бровь, а в глаз...
Сразу и не ответишь.
Каждый из шести моторчиков управляется собственным покупным драйвером, для этого моторчика предназначенным,
поэтому о сквозных токах нам думать не надо.
На каждый из шести драйверов от разрабатываемого контроллера поступает только два управляющих сигнала :
1) ШИМ для управления скоростью (при скважности ШИМ меньше 4% мотор стоит),
2) бит для управления направлением - 0 - влево, 1 - вправо.
Частота у всех ШИМов должна быть одинакова, в районе 3...7 кГц.
Разрядность, не будем щёки надувать, 8 бит=1 байт
От механизма идут импульсы, пропорциональные реальной - фактической скорости вращения, максимум 12 тыщ штук за секунду (при максимальной скорости)
Кроме этого, от механизма приходит импульс, когда вал ротора выходного редуктора (100:1) проходит через нулевое положение - один за 12 тыщ импульсов первых.
Итого контроллеру, по два выходных и два входных сигнала от каждого из шести механизмов, всего 24.

Кроме того, в контроллер по RX приходят 40 раз в секунду руководящие указания, кому и как куда крутиться, а точнее, не это, а куда ракете лететь,
а контроллер, исходя из своих текущих представлений о том, куда и как какой движок повёрнут в данный момент, и пришедших руководящих указаний должен уже вычислить, кому и как куда крутиться, и выдать Бит и ШИМ каждому драйверу.
Я так понимаю, что в идеале это нужно сделать не позже формирования следующего импульса ШИМ, т.е. не позже 1/7000 доли секунды, или 142 мкс.
или немножко раньше, чтобы было время на сования всяких регистров.
Но это в идеале.
Если это не будет получаться, частоту ШИМ можно опустить до 3 кГц, и получим 330 мкс.
На худой конец, можно и 660 мкс.

О прерываниях.
я пришёл к тому, что их хватит и 6-ти - имеющихся INT. Вторые шесть прерываний (которые парами к первым) в 12000 или в 4000 раз реже, поэтому мы их просто проверяем на входах ног внутри обработки соответствующего парного прерывания.
На 6 инт подаются импульсы скорости от 6-ти механизмов, которые приходят максимум 12 тыщ штук за секунду (от каждого из 6 моторчиков).
От каждого моторчика асинхронно относительно других.
(если совсем не будет получаться, можно снизить точность до 4 тыщ импульсов от каждого)
По прерыванию происходит следующее:
  • плюс или минус соответствующему счётчику текущего положения вала моторчика (коих 6), в зависимости от текущего направления вращения (определяемого битом, стоящим на ноге проца)
  • проверка, есть ли импульс от датчика нуля - если есть, счётчик обнуляется.
  • проверка наличия флагов прерываний от других моторчиков, если есть - то обработка тех, кто есть, и выход.
Вне прерывания производятся основные вычисления - кому куда и как крутиться, исходя из.

Может, чего не учёл
 
Изменено:

vortigont

★★★★★✩✩
24 Апр 2020
852
461
Saint-Petersburg, Russia
Скажите какой таймер по вашему занят под serial?
а то "двойку" поставите? :)

Какие-то уже заняты под millis() и serial... Детально надо смотреть в документацию.
сказал по памяти, возможно и ошибся. Ну пусть аппаратно ни один ни под что вообще не занят, это принципиально что-то меняет из тех различий что я указал?
 

poty

★★★★★★✩
19 Фев 2020
2,957
886
@Эдуард Анисимов, дать. Для генерации синусоиды DMA не требуется. И даже для генерации трёхфазной синусоиды. Более того, PWM не требуется.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
@poty,
Один на готовой таблице.
Другой таблица рассчитывается.
Это мною подгоняемый код под мои нужды.
Полностью рабочий оригинал, с которого я пытался запустить двигатель.
Не получилось, потому что код для 3х фазного двигателя, а у меня был BLDC. (Если я термины не перепутал.)
Кстати, двигатели от винчестеров то же BLDC. Гайвер его запускал.
Я то же запускал этим кодом. Но двигатель не развивает максимальных оборотов и нет нормальной мощности на валу.

Оригинал, с которого я пытался взять код называется Invertor.
Все сопутствующие библиотеки я грохнул. Что бы сюда можно было скинуть.
 

Вложения

  • Лойс +1
Реакции: vortigont

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
@poty,DMA для"подсовывания" очередных значений ШИМ синусоиды(или любой формы сигнала) в счетчик вообще без участия ЦП. Очень удобно! Раз запустил и всё,программой меняется только частота синуса,если необходимо.
 

poty

★★★★★★✩
19 Фев 2020
2,957
886
@te238s, и в чём выигрыш? Да, наверное, слегка уменьшает загрузку процессора за счёт бОльшей памяти. Если строить на АВР в форме "прерывание - изменение длительности следующего импульса", то и ШИМ не понадобится. А если не брать, допустим, 3-х фазное питание, то существуют АВР с аналоговым выходом - и это, на самом деле, гораздо более правильный подход, поскольку ШИМ ещё сгладить нужно. Вообще - использовать для генерации чего-либо лучше ЦАП, а не что-нибудь ещё. Ну, за исключением НЧ сигналов без претензий. Поэтому замена фильтров на внешние ЦАП будет сильно эффективнее.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
@avan,да уж,задачка тяжеловата для АВР. Ну частота ШИМ значения тут не имеет,аппаратно хватает. В общем нужно определяться с алгоритмами расчёта. Я бы разделил на две части:
1) каждые 2.5мс по приёму извне задания вычисляем "куда" должны моторы смотреть
2)в прерываниях уже реализуется регулятор. Эта часть нужна максимально быстрая,возможно на ассемблере.
А вообще какого рода приходит задание? Ну,типа "от балды",сначала 0,потом 200,потом 30, или как от энкодера,который невозможно резко повернуть?
Я к тому,что ,к примеру,квадрокоптеру надо 10-100 раз в сек регулировать систему,а отопление лишь 1 раз в минуту.
 
  • Лойс +1
Реакции: avan

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
@poty,ЦАП для звуковой техники возможно и лучше. А как силовые без ШИМ? По определению,на выходе ключи должны работать в ключевом режиме,на то они и ключи)
По поводу ШИМ с DMA. В вакууме да,не напряжно в прерывании быро всё сделать. А если реальный пример взять с кучей работающей периферии? Вот у меня проектик был с 2 ШИМ,системой таймеров,PPM,spi,i2c и ADC. И я страданул немножечко,ломая голову,что принести в жертву точности отработки 4 сервомашинок по PPM. Чем больше прерываний,тем больше вероятность конфликтов.
 

poty

★★★★★★✩
19 Фев 2020
2,957
886
@te238s, а Вы не путайте синусоиду и ШИМ. И ни при чём здесь звуковая техника. "Силовые ключи" для продуцирования синусоиды должны работать либо в линейном режиме, а не ключевом, либо в ключевом с фильтрацией на выходе (ну, можно сказать, если уж упомянула аудио - D-класс), либо с очень высокой частотой, чтобы инерционность питаемой системы позволяла это переварить. Линейный режим жутко неэффективен. Фильтры на выходе - это тоже потеря эффективности. Большие частоты далеко не всегда могут быть "поддержаны" микропроцессором.
Что Вы "всё" собрались в прерывании делать? Для изменения длительности импульса достаточно изменить один (1) регистр.
Куча работающей периферии ни на одном процессоре работать нормально и точно не будет. Для этого ещё со времён Форда придумали модульность. Специфичные узлы выполняют свою функцию гораздо эффективнее "всего и сразу", да и дешевле и поддерживаются лучше.
 
6 Янв 2020
122
-4
DMA для"подсовывания" очередных значений ШИМ синусоиды(или любой формы сигнала) в счетчик вообще без участия ЦП
в данном случае не нужна никакая синусоида. Управляющий скоростью вращения двигателя ШИМ поступает на вход Драйвера в качестве аналогового сигнала, меняющийся в общем случае произвольно.
Насколько я понял из скудного описания Драйвера, ему на вход можно подавать либо прямой аналог от 0 до 5 В, либо ШИМ 3...7 кГц (в другом описании - до 10 кГц).
Поэтому Контроллер, выставивший 6 ШИМов каждый нужной скважности, может считать свою миссию по ШИМам законченной.... до следующего цикла
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
@poty,ну в подавляющем большинстве случаев фильтры не нужны. Сама нагрузка уже фильтр,будь то электродвигатель,нагреватель или светодиод.
И нет путаницы ШИМ и синуса. Взять синус 400 Гц 3 фазы(без разницы сколько,всё равно сдвиг фаз одинаков всегда). Это 400 помноженые на количество значений в таблице. Ладно если синус нужен "грубый" ступеней в 10 на полуволну. Это уже 8000 прерываний в секунду. А если 192 ступени таблица? 153600 в секунду. А с DMA при постоянной частоте прерываний надо...0.
Куча работающей периферии ни на одном процессоре работать нормально и точно не будет.
Странно,создатели stm32f722 об этом не в курсе. Там даже блок-схему смотреть страшно. Для этого и существует DMA. Я же справился,всё заработало и ничего не мешает)
 
6 Янв 2020
122
-4
Я бы разделил на две части:
1) каждые 2.5мс по приёму извне задания вычисляем "куда" должны моторы смотреть
2) в прерываниях уже реализуется регулятор.
2) почему расчёт регулятора нужно засовывать в прерывание?
Я бы считал, что чем быстрее из прерывания вышли, тем лучше, а общий расчёт должен делается вне их, в промежутках между приёмом очередной пачки внешнего управления.
Конечно, в ассемблере - это было бы идеально, но я пока не знаю, как его вставлять в ардуинский Луп.
Тем более, что вычисления нужных параметров управления делается всей группе моторов сразу, а не каждому в отдельности.
В том числе и с учётом их взаимного текущего положения.
Они должны работать согласованной командой (кто-то в фазе, кто-то в противофазе, кто-то - с заданным сдвигом, меняющимся в каждый цикл, не 0, потом двести, разумеется, а плавно монотонно растущим или убывающим).
Предполагается пока 8 режимов (видов) группового управления, в некоторых один ШИМ подаётся нескольким моторам (т.е. этим моторам ставятся одинаковые параметры ШИМа) . В разных режимах комбинация моторов разная.
1) наверное, не 2,5 мс, а 25 мс... Реально будем считать 20.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
2,957
886
@te238s, ну так я и говорю, что встречаетесь с вырожденными случаями. Тогда можно вообще простой меандр подавать. Впрочем, для рассматриваемой задачи Вам уже сказали, что никакого синуса не нужно.
Ваши расчёты прерываний не соответствуют методу "без ШИМ", это раз. Во-вторых, смысла экономить на таких частотах не вижу. В-третьих, генерация синусоиды на неспециализированных процессорах - это так, баловство, не более. Простейшая память (можно даже ПЗУ) + ЦАП с "обработкой" в виде сдвиговых регистров дадут гораздо более качественный синус без всяких изощрений. А вообще - масса других интересных схем.
А создатели STM32 в курсе всего, конечно. Просто не рассчитывали, что кое кто решит вместо использования нужных функций попытаться использовать их все.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
@avan,конечно же,скорее всего в прерывании можно не успеть посчитать.Ошибся,каюсь. Скорей всего вычисления нужно привязывать к приёму очередного задания.

@poty,но ПЗУ и ЦАП дадут именно синус,без несущей высокой частоты. Об этом речь?
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
Скорей всего вычисления нужно привязывать к приёму очередного задания.
В примере, что я скинул, в оригинальном файле, ведётся пересчёт таблицы синусов при повороте енкодера.
DMA не успевает ещё закончить полуволну, а ему уже готовы новые данные.
 
  • Лойс +1
Реакции: te238s

poty

★★★★★★✩
19 Фев 2020
2,957
886
но ПЗУ и ЦАП дадут именно синус,без несущей высокой частоты. Об этом речь?
думаю, дискуссия уже становится нерелевантной данной теме.
Речь о том, что ЕСЛИ есть необходимость формирования синусоиды, то она должна быть БЕЗ "несущей" (меня несколько коробит такое применение термина, но здесь это возможно). В иных случаях лучше использовать прямоугольные импульсы эквивалентной мощности.
Есть ряд случаев, когда требуется получить высокую мощность с высокой эффективностью и принцип действия потребителя исключает использование прямоугольных импульсов. В этом случае целесообразно использовать ШИМ или его "однобитовую" вариацию, но требуется учёт инерционности потребляющей системы.
Самым очевидным преимуществом ШИМ в STM является поддержка Dead интервала. Наверное, полезно для простейших драйверов. Я - сторонник аппаратных решений защиты от сквозных токов, как-то надёжнее.
 
  • Лойс +1
Реакции: te238s

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
Наверное, полезно для простейших драйверов
Не только для простейших. На нём можно делать довольно мощные системы.
Правда есть МК, у которых таймер сразу заточен под управления 3мя фазами. Его достаточно просто включить.
Не помню какой именно.
 
6 Янв 2020
122
-4
Выяснилось, что всё-таки 6-ти аппаратных прерываний мало - нужно хотя бы ещё одно, 7-е.
На самой микросхеме, как писали злые языки, их целых 8.
А на плату Ардуино 2560 Мега выведено только 6.
Как можно воспользоваться 7-м и 8-м, не разводя специальную плату (это целое дело), а пользуясь готовой ардуинкой?
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
@avan, Так вам шашечки или ехать?
У Китайцев есть такая плата Crumbuino. Там все выводы корпуса разведены на пины. Все, до единого. И проблем воспользоваться всеми прерываниями нет.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
312
100
@avan,
На плату Ардуино выведено все что вам надо. В Ардуино IDE в attachInterrupt() используются не все.
Вам уже писали, что если не хватает 5 прерываний то почитайте про PCINT. Их надо или самому настраивать, или искать библиотеки, которые это сделают за вас. Но лучше все обработчики прерываний писать самому и без attachInterrupt а напрямую, если важно быстродействие.
Без чтения даташита обойтись трудно, можно почитать в инете уроки по PCINT, можно почитать книгу Микроконтроллеры AVR семейства Mega. Руководство пользователя. А-В-Евстифеев
 
  • Лойс +1
Реакции: poty и Геннадий П