Friday, September 26, 2014

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.

O que era para ser um PWM de 50 Hz com 1% de duty cycle se transformou nesta onda defeituosa.
Mesmo usando todas as configuração de SCHED_RR ou SCHED_FIFO
para os pthreads anomalias na latência continuam ocorrendo
Na configuração do kernel preemptivo de baixa latência existente a promessa de latências menores de que 1 milisegundo. Depois de mais alguns testes e ajustes, foi obtido o resultado esperado.


Soft PWM de 50 Hz via kernel preemptivo de baixa latência.
Espaçamento sem constante.
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.

BLDC ligados nos Leds do WR740N,
mas sem o level shift para 3,3v os motores BLDC não reconheceram o WR740N.
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.

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
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.