Как Arduino Uno может поддерживать до 12 сервоприводов, если у него всего 6 цифровых контактов PWM?

Согласно этому :

Библиотека Servo поддерживает до 12 двигателей на большинстве плат Arduino и до 48 на Arduino Mega. На платах, отличных от Mega, использование библиотеки отключает функцию AnalogWrite() (PWM) на контактах 9 и 10, независимо от того, есть ли сервопривод на этих контактах. На Mega можно использовать до 12 сервоприводов без вмешательства в функциональность ШИМ; использование двигателей от 12 до 23 отключит ШИМ на контактах 11 и 12.

Однако, согласно этому :

Цифровые контакты ввода/вывода 14 (из которых 6 обеспечивают выход PWM)

Так как же Uno может управлять более чем 6 сервоприводами, если у него есть только 6 цифровых контактов ввода-вывода, которые могут обеспечивать выход ШИМ?

Ответы (2)

Библиотека Servo не использует ШИМ. Когда вы вызываете функцию write() , она вычисляет ширину импульса в микросекундах и сохраняет ее в глобальном массиве. Затем есть один таймер, который регулярно запускает прерывание, которое изменяет выходные сигналы в соответствии с желаемой шириной импульса каждого канала.

Вы можете найти исходный код ниже: ссылка Github

То есть он по сути имитирует ШИМ? В чем тогда смысл цифровых выводов с ШИМ-каналами?
Как правило, сервоимпульсы имеют длину около 1 мс. Следовательно, они должны управляться частотами около 1 кГц, которые очень легко генерировать с помощью программного обеспечения на любом выходе с микропроцессором, работающим на частоте в несколько МГц. Выходы AVR PWM генерируются специальным оборудованием и могут достигать частоты ЦП, но количество каналов ограничено. Я предполагаю, что авторы модуля Servo решили использовать один таймер, чтобы обрабатывать столько каналов, сколько контактов, и сохранить оборудование ШИМ для других целей.
ШИМ выходов Arduino предназначен для выходов переменной мощности с рабочими циклами от 0 до 100%. ШИМ-управление в стиле RC имеет очень ограниченный диапазон рабочих циклов — 1000 мкс при 50 Гц составляет 5%, 2000 мкс при 50 Гц — 10%. Воспринимайте RC PWM как «последовательность импульсов», а не как традиционную «PWM».
@user41158 user41158 Если у вас неограниченное время процессора, вы можете использовать любой цифровой выход в качестве ШИМ и управлять им в программном обеспечении, а не только ШИМ, теоретически вы можете создавать любые цифровые системы связи, написав программу и переключая эти выходы, это называется « бит- стучать ». Но на практике процессорное время не безгранично и аппаратные задачи лучше решать аппаратно. Для сервоуправления частота ШИМ довольно низка, поэтому целесообразно побитно программировать ШИМ для создания дополнительных выходов.

6 выводов PWM используют встроенный UART на ATmega328P для получения выходного сигнала. Это делает импульсы очень быстрыми для более качественного «аналогового» выхода. Поскольку сервоприводы взаимодействуют с достаточно низкой скоростью, ими можно управлять с помощью программных прерываний. Программные прерывания не связаны с кодом, который вы выполняете, и запускают код, включенный в библиотеку сервоприводов. Этот код использует стандартные средства для изменения состояния контактов. Делая это с помощью прерываний, а не с помощью UART, вы тратите некоторое время на обработку, но получаете возможность управлять большим количеством сервоприводов.

Можете ли вы объяснить (или дать ссылку) больше? Как UART используется для ШИМ?
Я думаю, было бы лучше сказать, что библиотека PWM может использовать контакты ввода-вывода UART, если это необходимо. библиотека PWM не будет использовать сам UART, но контакты, используемые UART, также могут использоваться в качестве стандартного цифрового ввода-вывода, если это не требуется для UART.