WR740N e Motores DC- latência do kernel com pthreads
Experimentado colocar o PWM para funcionar nos Leds do WR740N para controlar os motores do Drone.
Mas OpenWRT não compila o módulo de PWM nos GPIOs porque não existem timers de hardware livres neste no SOC ar9331.
Uma solução alternativa é implementar o PWM por software usando pthreads. Durante a depuração começam a aparecer problemas. O escalonador de processos com a configuração padrão do Openwrt não é preemptiva, e acaba causando anomalias no PWM que podem ser percebidas olhando o piscado irregular dos leds, e também usando o Buspirate com PirateScope.
Quando o PWM desejado é de mais 100 Hz é preciso mudar também a frequência do kernel durante o build. O problema agora é instalar um level shift já que os ESCs do drone não funcionaram com esse sinal que tem pico em 2V.
UPDATE: Durante os testes quando a conexão WiFi do WR740N é muita usada ou ocorre uma desconexão, o PWM por software fica defeituoso mesmo no kernel preemptivo de baixa latência. Portanto, no openwrt / linux não dá para fazer um PWM por software muito confiável. A próxima alternativa é implementar o PWM por HW (arduino) controlado por uma conexão I2C nos leds do WR740N.
UPDATE 2: Os pinos dos leds são compartilhados com a configuração da CPU, após o boot podem ser usados, mas durante o boot alterar os valores dos gpios pode levar o sistema a estados indeterminados (isso ocorre em alguns pinos das placas Beaglebone também). Sendo assim, vou abandonar o uso do wr740n como placa mãe do drone. alguns outros modelos possuem gpios livres e não compartilhados. No futuro irei testar.
Mas OpenWRT não compila o módulo de PWM nos GPIOs porque não existem timers de hardware livres neste no SOC ar9331.
Uma solução alternativa é implementar o PWM por software usando pthreads. Durante a depuração começam a aparecer problemas. O escalonador de processos com a configuração padrão do Openwrt não é preemptiva, e acaba causando anomalias no PWM que podem ser percebidas olhando o piscado irregular dos leds, e também usando o Buspirate com PirateScope.
Soft PWM de 50 Hz via kernel preemptivo de baixa latência. Espaçamento sem constante. |
BLDC ligados nos Leds do WR740N, mas sem o level shift para 3,3v os motores BLDC não reconheceram o WR740N. |
I2C do tplink como master. I2C da Tiva como slave. tplink envia por I2C os valores de PWM para que a Tiva gere o PWM por HW. Funcionou perfeitamente |