Выбор контроллера (18+ ШИМ, беспроводная связь, 3.3 логика, встроенный BEC)

Приветствую!

Вопрос на перспективу… Хотелось бы со временем перекатиться с ардуины на что-то поинтереснее. На данный момент ищу компактную плату разработки (не более 80х50 мм). От нее мне нужно:

  • 3.3 логика
  • не менее 18 ШИМ для сервоприводов (можно с костылями)
  • не менее 1 i2c
  • любая беспроводная связь, позволяющая обмениваться двум таким МК данными напрямую
  • крайне желательно наличие встроенного BEC, поддерживающего до 12V входящего. Если сможет держать вдовесок мелкий монохромный oled дисплей, то совсем прекрасно.
  • желательна загрузка по USB, но могу и программатор приобрести
  • желательна поддержка arduino ide, но готов и в CubeIDE перекатиться, дело привычки

Вроде бы под пожелания подходит WeAct S3 Mini / LOLIN S3 Mini (обе на ESP32-S3), правда там, судя по всему, либо 3.3 либо 5 вольт надо подавать, но никак не 12. И с библиотекой Servo максимум 16 сервоприводов (думаю, на частоте 240 можно сделать блокирующий на 2.5мс вывод ШИМ на таймере, с достаточным разрешением, с пере-вызовом через 17,5мс). Может есть что-нибудь более подходящее под мои хотелки?

Скажите, а у вашей ШИМ , которая на 16 моторчиков подается, одна и та же частота, просто коэффициент заполнения (duty) разный или частоты тоже разные?

У ESP32S3 есть 8 каналов ШИМ, но только 4 таймера их обслуживают, так что не более 4 разных частот.

У ESP32S3, как ни странно, дела хуже обстоят с ШИМ, чем в оригинальном ESP32. У старичка 16 каналов ШИМ, у S3 - 8.

Если ваша библиотека как-то делает 16 приводов на S3, то скорее всего ее можно допилить (а может даже и не нужно), чтобы она делала 18 на ESP32.

Но это надо в код смотреть библиотеки.

Помимо модуля LEDC (который обычно все и используют для ШИМ), в ESPшке есть еще Motor Contol PWM. Отдельный шибко умный модуль, в котором можно более качественно ШИМ генерить. И по таймингам и по плавности переходных процессов.

Наверно, ESP32S3 не лучший выбор для 18 шим каналов. Т.е. сделать, конечно, можно. Но проще будет выбрать контроллер, в котором 18 каналов есть уже из коробки.

Если же все-таки возьметесь делать на ESP32, то берите именно его, а не S3. Там изначально 16 LEDC каналов

про 16 серво в стандартной библиотеке написано на сайте ардуино. Мне 18 нужно.

Я думал закостылить: запустить два таймера, таймер 1 чтобы на максимальной (спорно, еще не считал оптимальных значений) частоте работал и ничего не вызывал, таймер 2 чтобы на частоте цикла серво, и вызывал функцию, которая “повесит” контроллер на 2.5мс (максимальная длина импульса серво, таймер 1 должен переполняться как раз к этому времени в идеале). А в функции сделать repeat с условием выхода - достижением таймера 1 некоторого значения. И в этом цикле через порты поднимать/гасить каналы в зависимости от сравнения значения таймера 1 с значением ШИМ каждого из серво. На достаточно высокой частоте не должно быть заметно погрешностей из-за времени, затраченного на сами сравнения и записи в регистры портов. Главное чтобы частота таймера 2 была кратна частоте таймера 1.

Возможно очень дебильный план)))

Повторюсь, если есть более подходящая плата разработки - с радостью рассмотрю

Ну да… ESP32 вполне себе достойный выбор. А чтобы 16 серво дрыгать, то я бы в довесок взял вот такой расширитель ШИМ на чипе PCA9685:

По I2C управлять всеми 16 ШИМами. Можно цепочкой друг за другом вешать такие же расширители - I2C адрес выставляется перемычками.

1 лайк

На AVR у меня один 16битный таймер обслуживает 5 сервоприводов с разрешением 10 бит на любых пинах. Можно и 7-8. Думаю на ARM, учитывая частоты и количество таймеров, можно сделать ещё лучше.
Но, конечно же, лучше аппаратный расширитель. Оно проще.

1 лайк

трогал такие, было дело. Для сервоприводов плохой вариант. Чип задумывался как драйвер светодиодов, в связи с чем на 500-2500нс приходится слишком маленькое разрешение. Либо я не знаю о каких-то командах для его конфигурирования, тщетно искал инфу об этом.