Согласно этому :
Библиотека Servo поддерживает до 12 двигателей на большинстве плат Arduino и до 48 на Arduino Mega. На платах, отличных от Mega, использование библиотеки отключает функцию AnalogWrite() (PWM) на контактах 9 и 10, независимо от того, есть ли сервопривод на этих контактах. На Mega можно использовать до 12 сервоприводов без вмешательства в функциональность ШИМ; использование двигателей от 12 до 23 отключит ШИМ на контактах 11 и 12.
Однако, согласно этому :
Цифровые контакты ввода/вывода 14 (из которых 6 обеспечивают выход PWM)
Так как же Uno может управлять более чем 6 сервоприводами, если у него есть только 6 цифровых контактов ввода-вывода, которые могут обеспечивать выход ШИМ?
Библиотека Servo не использует ШИМ. Когда вы вызываете функцию write() , она вычисляет ширину импульса в микросекундах и сохраняет ее в глобальном массиве. Затем есть один таймер, который регулярно запускает прерывание, которое изменяет выходные сигналы в соответствии с желаемой шириной импульса каждого канала.
Вы можете найти исходный код ниже: ссылка Github
6 выводов PWM используют встроенный UART на ATmega328P для получения выходного сигнала. Это делает импульсы очень быстрыми для более качественного «аналогового» выхода. Поскольку сервоприводы взаимодействуют с достаточно низкой скоростью, ими можно управлять с помощью программных прерываний. Программные прерывания не связаны с кодом, который вы выполняете, и запускают код, включенный в библиотеку сервоприводов. Этот код использует стандартные средства для изменения состояния контактов. Делая это с помощью прерываний, а не с помощью UART, вы тратите некоторое время на обработку, но получаете возможность управлять большим количеством сервоприводов.
пользователь41158
Грапсус
Джон Ватте
比尔盖子