Вопрос на перспективу… Хотелось бы со временем перекатиться с ардуины на что-то поинтереснее. На данный момент ищу компактную плату разработки (не более 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.
Возможно очень дебильный план)))
Повторюсь, если есть более подходящая плата разработки - с радостью рассмотрю
На AVR у меня один 16битный таймер обслуживает 5 сервоприводов с разрешением 10 бит на любых пинах. Можно и 7-8. Думаю на ARM, учитывая частоты и количество таймеров, можно сделать ещё лучше.
Но, конечно же, лучше аппаратный расширитель. Оно проще.
трогал такие, было дело. Для сервоприводов плохой вариант. Чип задумывался как драйвер светодиодов, в связи с чем на 500-2500нс приходится слишком маленькое разрешение. Либо я не знаю о каких-то командах для его конфигурирования, тщетно искал инфу об этом.