banner
Centro de notícias
Excelente serviço

ESP32 em MicroPython: PWM e o ciclo de trabalho

Oct 02, 2023

O hardware PWM disponível no ESP32 é um pouco mais complicado do que você imagina e algumas coisas podem ser melhor alcançadas usando o RMT. Este extrato é deProgramando o ESP32 em MicroPython,parte da I Programmer Library e mostra como usar o hardware PWM.

Compre na Amazon.

Prefácio

O ESP32 possui duas implementações de hardware PWM. Um é destinado ao uso no controle de motores e possui recursos extras, como zona morta e frenagem automática. Isso não é suportado pelo MicroPython e se você quiser usá-lo, precisará mudar para C. O segundo, LEDC, foi projetado especificamente para acionar LEDs com recursos como escurecimento automático e recursos mais exóticos. Embora o MicroPython suporte as operações básicas do LEDC, ele não fornece acesso a todos os seus recursos adicionais.

Um gerador PWM pode ser atribuído a qualquer pino GPIO. O número de geradores PWM que um ESP32 possui depende de seu modelo exato. Eles vêm em dois grupos – rápidos e lentos. O tipo rápido possui recursos de escurecimento automático e é capaz de alterar suavemente a frequência e o ciclo de trabalho. O tipo lento não possui esses recursos e cabe ao software alterar sua frequência e ciclo de trabalho. Cada grupo também possui um número definido de temporizadores que determinam quantas frequências diferentes podem ser geradas e um determinado número de canais.

A placa de desenvolvimento mais comum que utiliza EP32 possui dois grupos, um rápido e outro lento, de PWM com oito canais em cada grupo. O ESP32-S2 possui apenas um grupo rápido, mas é idêntico. O ESP32-C3, baseado em RISC, é igual ao ESP32-S2, mas com apenas seis canais. Todos os dispositivos ESP32 possuem quatro temporizadores em cada grupo, o que significa que você pode definir quatro frequências diferentes.

A distinção entre os dois grupos é irrelevante do ponto de vista do MicroPython, pois ele não faz uso dos recursos extras do grupo rápido. O que isso significa é que, do ponto de vista do MicroPython, um ESP32 possui 16 canais PWM que podem funcionar em oito frequências diferentes. Todos os canais podem funcionar em diferentes ciclos de trabalho.

Você não precisa saber como funciona o hardware PWM, mas isso ajuda a entender algumas das restrições.

Para criar um objeto PWM você deve passar ao seu construtor um objeto Pin. Por exemplo:

cria um objeto PWM associado ao GPIO4. Você pode definir a frequência usando:

que define a frequência em Hz. O hardware PWM não está habilitado neste momento. Para iniciá-lo gerando um sinal é necessário definir o ciclo de trabalho. Isso é feito usando:

onde o imposto é um valor na faixa de 0 a 65.535, correspondendo a 0 a 100%.

Há também:

que define o tempo em que a linha fica alta em nanossegundos. Isso não é tão útil para uso geral e se você especificar um tempo maior que o período definido, você gerará uma exceção.

Alternativamente, você pode usar o construtor para especificar todas as características do PWM:

No momento em que este artigo foi escrito, havia um bug no MicroPython 1.19 que fazia com que o ciclo de trabalho fosse definido incorretamente se a frequência fosse definida usando freq(). Uma solução é sempre usar o construtor para definir uma frequência inicial.

A implementação MicroPython de PWM aloca temporizadores aos canais de forma inteligente. Se você criar um objeto PWM trabalhando em uma frequência específica, ele primeiro verificará se há um temporizador no mesmo grupo trabalhando nessa frequência. Se houver, ele o alocará ao objeto PWM. Se não houver um temporizador funcionando naquela frequência, então um temporizador livre será alocado e configurado para funcionar na nova frequência. Se não houver mais temporizadores livres e nenhum estiver em execução na frequência necessária, uma exceção será lançada. O que isso significa é que você pode alocar frequências sem se preocupar até esgotar todos os temporizadores e então definir as frequências que já usou. Isso significa que para um ESP32 você pode configurar até oito frequências diferentes para os 16 canais diferentes.