Beaglebone PWM ограничен 100 Гц?

Я использую 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#

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


person John    schedule 14.04.2014    source источник
comment
Я не уверен, почему вам нужна частота цикла менее 1 Гц. ШИМ - это рабочий цикл и частота. Рабочий цикл — это процент времени включения и времени выключения в 1 цикле. Частота - это количество циклов в 1 секунду. Beaglebone Black лучше всего работает на частоте 2000 Гц, если одновременно работает более 1 канала ШИМ, но у меня он работал на разных частотах.   -  person    schedule 24.05.2016


Ответы (1)


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

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

Если вы введете значение duty_percent (например, 1 процент), то драйвер, похоже, просто вычислит из него значение duty_ns и потом забудет о процентах.
Обычный пользователь подумает, что он находится в «режиме процентов», но на самом деле файл процентов просто привязан к оболочке, чтобы помочь.
То же самое относится и к частоте!
Если вы теперь измените частоту на более высокое значение, тогда ядро ​​​​проверит, соответствует ли период цикла duty_ns новому общему периоду_ns!< br> Он игнорирует то, что вы на самом деле установили процент!

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

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

person John    schedule 14.04.2014
comment
Для полноты: я измерил наименьший возможный размер шага импульса, равный 10 нс. Кроме того, таймер ширины импульса имеет разрешение 16 бит. Так что помните о проблемах с округлением. - person Dietrich; 06.05.2014
comment
Также я думаю, что использование ШИМ для заданий в реальном времени (например, управление полетом) — не очень хорошая идея, если за ним стоит ОС, отличная от RT (например, стандартный Linux). Я отказался от использования ШИМ beaglebone для такой работы, это ненадежно. достаточно о сроках. Хорошее решение — добавить небольшой AVR через I2C или SPI или аналогичный и использовать его для заданий в реальном времени и ШИМ. - person John; 07.05.2014
comment
@Dietrich: вы имеете в виду, что 65535 нс - это максимум, который вы можете установить? - person xmen; 30.08.2014
comment
@xmen WK: (Потребовалось некоторое время, чтобы снова запустить BB ..). Максимальный период, который я мог установить, составлял 1 секунду. Поскольку аппаратные регистры 16-битные и масштабируются по периоду, это означает, что разрешение скважности хуже, чем у 65536-го периода, несмотря на другие значения в интерфейсе SysFs. - person Dietrich; 22.09.2014
comment
@ Дитрих: 16 бит - отстой. Поэтому не могу установить частоту 5 Гц или ниже. Знаете ли вы что-нибудь, что может генерировать ШИМ на низкой частоте, такой как 5 Гц, и рабочем цикле 1000 мкс? - person xmen; 23.09.2014
comment
@xmen WK: Нет, я не знаю решения высокого уровня. Если вы занимаетесь низкоуровневым программированием, прочтите техническое руководство по AM335x. Аппаратное обеспечение ШИМ BB довольно сложное - лишь малая часть используется в драйвере ядра. Если вы можете жить с некоторым дрожанием, вы просто можете написать программу C для вывода GPIO; если это должно быть с меньшим дрожанием, используйте PRU BB. - person Dietrich; 23.09.2014