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

10

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

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

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

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

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

user41158
источник

Ответы:

8

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

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

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

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

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