我使用的是Beaglebone而不是Beaglebone Black。
我只是试图输出一个PWM,我期望在这样一个快速的设备上有一些兆赫的潜在频率 我发现100HZ是我可以通过sysfs设置的最大值 我开始在网上挖掘示例,他们没有提到限制,但他们也没有显示比100HZ更快的值。
示例:
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都可以做到比这更快的PWM 我错过了一些技巧吗? 如果我想要比100 HZ更快的频率,我真的必须通过manuallz切换GPIO来创建自定义PWM吗?
答案 0 :(得分:2)
我在打开问题后不久就找到了解决方案 我会在这里发布,因为我认为这实际上可能不仅仅是让我怀疑:)
PWM频率当然不限于1GHZ器件上的频率,内核驱动器的工作方式与人们预期的不同。
如果你输入一个duty_percent值(比如1%),那么驱动程序似乎只是从中计算出duty_ns值而忘记了之后的百分比。
普通用户会认为他处于"百分比模式"但实际上百分比文件只是绑定到一个包装器来帮助
频率相同!
如果您现在将频率更改为更高的值,那么内核会检查duty_ns循环周期是否适合新的total_ns!
它忽略了你实际上设置了一个百分比!
所以当然你不能有一个大于整个时期的开期,所以它失败了。
长文简短摘要:
始终将duty_cycle设置为零在设置频率之前,如果之前的值不适合新的时间段,这可以避免挫败感。