Pergunta

Estou usando o Beaglebone e não o Beaglebone Black.

Acabei de tentar gerar um PWM e esperava frequências potenciais de alguns megaherz em um dispositivo tão rápido.
Descobri que 100HZ é o máximo exato que posso definir através do sysfs.
Comecei a procurar exemplos online e eles não mencionaram um limite, mas também não mostraram um valor mais rápido que 100 Hz.

Exemplo:

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#

Qualquer AVR de 10 centavos pode fazer um PWM mais rápido que isso.
Existe algum truque que eu perdi?
Eu realmente preciso criar um PWM personalizado alternando manualmente o GPIO se eu quiser uma frequência mais rápida que 100 HZ?!

Foi útil?

Solução

Na verdade, encontrei a solução logo após abrir minha pergunta.
Vou postá-lo aqui porque acho que isso pode realmente fazer com que mais do que eu me pergunte :)

É claro que a frequência PWM não é limitada como em um dispositivo de 1 GHz, o driver do kernel simplesmente não está funcionando da mesma maneira que seria de esperar.

Se você inserir um valor duty_percent (como 1%), o driver parece apenas calcular o valor duty_ns e esquecer a porcentagem depois.
Um usuário normal pensaria que está no "modo percentual", mas na verdade o arquivo percentual está apenas vinculado a um wrapper para ajudar.
O mesmo vale para a frequência!
Se você alterar a frequência para um valor mais alto, o kernel verificará se o período do ciclo duty_ns se ajusta ao novo período total_ns!
Ele ignora que você realmente definiu uma porcentagem!

Então é claro que você não pode ter um período que seja maior que o período inteiro, então ele falha.

Resumo curto em texto longo:
Sempre defina duty_cycle como zero ANTES de definir a frequência se o valor anterior não couber no novo período, isso evita frustração.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top