7 de dezembro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

PWM na RPi Pico – Como configurar

PWM na RPi Pico

PWM na RPi Pico é moleza, como tudo em Python. E vamos ver nesse artigo como usar PWM na RPi Pico com o firmware MicroPython, que faz parte dessa primeira série com Pico, que inclusive tem uma playlist própria no canal. Só tem uma coisa; com MicroPython temos uma liberdade extra, então temos que saber bem o conceito pra usar direito.

Duty Cycle

O duty cycle é a fração de um período de sinal. Comumente o duty cycle é expressado em porcentagem. O período é o intervalo de tempo para a conclusão de 1 ciclo. Trocando em miúdos, o duty cycle determina o tempo de duração do estado do pino em 1 (ou “HIGH”, ou “LIGADO”). Por essa razão ele normalmente é expressado em porcentagem, já que o limite é finito dentro do tempo.

Frequency

A frequência é o número de vezes que se repete um evento dentro de um período. Isso é pra tudo; por exemplo um motor DC com 1000RPM: A frequência é de 1000 voltas por minuto. Isso representará o número de vezes em que o estado deverá mudar de 0 para 1 no PWM na RPi Pico.

Ciclo de trabalho e Frequência

Supondo que a frequência seja de 100 vezes por segundo, não podemos especificar um duty cycle com intervalos de, por exemplo, 100ms. Não cabe 100 vezes o desligamento de intervalos de 100ms em 1000ms. Por essa razão é comum expressar o duty cycle em porcentagem.

Podemos variar os dois para ter um controle melhor, como é o caso do servo motor. Inclusive, recomendo esse vídeo com gerador PWM. Ou se prefere uma boa leitura, esse artigo bem detalhado sobre PWM.

Configurando PWM na RPi Pico

Na RPi Pico podemos fazer ajustes finos, variando a frequência, o ciclo de trabalho e o atraso. É bom fazer umas experimentações para perceber o que dá pra fazer. No livro tem um exemplo funcional, mas não considero claro. Dei uma pequena adaptada, sem mexer na lógica original, apenas para fazer a execução a partir da IDE Thonny:

from time import sleep
 from machine import Pin, PWM
 def runNow():
  pwm = PWM(Pin(25))
  pwm.freq(1000)
  duty = 0
  direction = 1
  tudo = 0
  for _ in range(8 * 256):
     duty += direction
     if duty > 255:
         duty = 255
         direction = -1
     elif duty < 0:
         duty = 0         
         direction = 1
     pwm.duty_u16(duty * duty)
     tudo = duty * duty
     if tudo > 60000:
         print(tudo)
     sleep(0.001)
 if name == 'main':
     runNow()

Clicando no botão de executar ele deverá rodar e com isso será feito um fade do LED builtin. Repare no código que tem um print do duty, que era pra ver até onde ia, pois não estava acreditando no valor: 60025, rodando esse código.

Onde comprar?

Se ainda não tem a sua, aproveite o preço na Robocore e pegue sua RPi Pico já para acompanhar os artigos. Mesmo que não curta Python, em breve começaremos a série em C. Imperdível! Se perdeu o “fio da meada”, dê uma verificada nesses artigos sobre RPi Pico.

As frequências que consegui rodar foram 8 de mínima e 1000 de máxima. Vou juntar mais uns dois artigos e faço um vídeo mostrando tudo. Por enquanto são 5 vídeos disponíveis na playlist do Raspberry Pi Pico, não perca; e se inscreva no canal!