Вопрос

Я использую Beaglebone, а не Beaglebone Black.

Я просто попытался вывести ШИМ-сигнал и ожидал, что потенциальные частоты на таком быстром устройстве составят несколько мегагерц.
Я выяснил, что 100 Гц - это точный максимум, который я могу установить через sysfs.
Я начал копаться в Интернете в поисках примеров, и они не упоминали ограничение, но они также не показывали значение быстрее 100 Гц.

Пример:

root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 10000000 >  period_ns 
root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 1000000 >  period_ns 
-sh: echo: write error: Invalid argument
root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 200 >  period_freq 
-sh: echo: write error: Invalid argument
root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 101 >  period_freq 
-sh: echo: write error: Invalid argument
root@beaglebone:/sys/class/pwm/ehrpwm.0:0# echo 100 >  period_freq 
root@beaglebone:/sys/class/pwm/ehrpwm.0:0#

Любой 10-центовый AVR может выполнять более быструю ШИМ, чем это.
Есть ли какой-то трюк, который я пропустил?
Действительно ли мне нужно создавать пользовательский PWM путем ручного переключения GPIO, если я хочу более высокую частоту, чем 100 Гц?!

Это было полезно?

Решение

На самом деле я нашел решение сразу после того, как открыл свой вопрос.
Я опубликую это здесь, так как думаю, что это действительно может вызвать интерес не только у меня :)

Частота PWM, конечно, не ограничена, как на устройстве с частотой 1 ГГц, драйвер ядра просто работает не так, как можно было бы ожидать.

Если вы вводите значение duty_percent (например, 1 процент), то драйвер, похоже, просто вычисляет из него значение duty_ns и впоследствии забывает о процентах.
Обычный пользователь подумал бы, что он находится в "процентном режиме", но на самом деле файл percentage просто привязан к оболочке, чтобы помочь.
То же самое относится и к частоте!
Если вы сейчас измените частоту на более высокое значение, то ядро проверит, вписывается ли период цикла duty_ns в новый общий period_ns!
Он игнорирует, что вы на самом деле задаете процент!

Поэтому, конечно, у вас не может быть периода включения, который больше, чем весь период, поэтому он терпит неудачу.

Длинный текст краткое резюме:
Всегда устанавливайте значение duty_cycle равным нулю перед установкой частоты, если предыдущее значение не вписывается в новый период, это позволяет избежать разочарований.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top