Skip to main content

PWM com LEDC

Seguindo os estudos do ESP-IDF, vamos agora estudar um novo periférico, o LED Control (LEDC), o qual tem a função de controlar a intensidade luminosa do LED e também servir como fonte geradora de sinal pulsado, Pulse Width Modulation (PWM), para diferentes propósitos como: controle de velocidade em motores de corrente contínua (CC), angulação em servomotores, mudança de cores em LED RGB e outras mais aplicações.

Com isso, ao final deste artigo estaremos familiarizados com os recursos oferecidos pelo periférico além de dominar as configurações básicas para implementar em projetos.

Recursos Necessários

Os materiais necessários para realizar esse exemplo são:

  • Placa Franzininho WiFi;
  • Protoboard;
  • LED;
  • Resistor de 220 Ohm;
  • Cabos Jumpers;
  • Computador com ESP-IDF instalado e configurado.

Desenvolvimento

Na placa Franzininho WiFi o periférico LEDC está disposto em dois grupos de oito canais, sendo um grupo operando no High Speed Mode (HSM) e outro em Low Speed Mode (LSM) operando independente uns dos outros . O modo High Speed é implementado em hardware oferecendo mudanças automáticas sem interferir no duty cycle do PWM, ou seja, caso haja alterações na temporização serão atualizadas no próximo estouro do timer. Em contraste isso o modo Low Speed deve ser explicitar o via software as configurações de temporização.

Para utilizarmos esse periféricos precisamos seguir algumas etapas fundamentais para nossa aplicação de estudo que são: Configuração do Temporizador , Configuração do Canal e Alteração do PWM.

  • Configuração do Temporizador : nessa primeira etapa vamos especificar a frequência e a resolução do sinal PWM preenchendo a estrutura de dados ledc_timer_config_t e apontando-a para a função led_timer_config() .

  • Configuração do Canal: nessa segunda etapa iremos direcionar o GPIO que será a saída do sinal PWM, o qual é selecionado dentro da estrutura de configuração do periférico.

  • Alteração do PWM: na última etapa vamos realizar o aumento e a redução do duty cycle na saída da geradora de sinal criando assim o fade no LED externo, o qual será habilitado via hardware pela função ledc_fade_func_install().

Com a finalização das três etapas de configuração o acionamento do periférico LED Control estará em funcionamento, contudo devemos agora seguir para montagem do circuito para concluir o projeto.

Configuração do Periférico LED Control

Esquemático

Nesta parte daremos início a montagem do circuito em protoboard, iremos conectar um dos terminais do resistor no GPIO 2 e outro no LED externo.

Abaixo segue o esquemático proposto :

Imagem do Circuito

Código

/*
Autor: Halysson Junior
Data : 10/04/21

Nesse exemplo foi configurado o periferico LEDC para controlar a intensidade do LED.

*/

// Inclusão de arqivos de cabeçalho
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#include "esp_err.h"

// Definição para configuração do periférico
#define LEDC_GPIO 2
#define LEDC_FADE_TIME 500
#define LEDC_RESOLUTION 1024
#define LEDC_FREQ 5000


void app_main(void) // Main
{

// Estrutura de dados para receber as váriaveis de configuração de frequência (1Hz, 100 Hz e outros), modo (HIGH ou LOW) e selecionar o TIMER (0,1,2)

ledc_timer_config_t timer = { // Configuração do timer

.speed_mode = LEDC_LOW_SPEED_MODE, // Modo de Velocidade -> LOW
.duty_resolution = LEDC_TIMER_10_BIT, // Resolução do do ciclo de trabalho (2^10 = 1024 valores)
.timer_num = LEDC_TIMER_0, // Utilizado o TIMER 0
.freq_hz = LEDC_FREQ, // Frequência de operação do sinal PWM
.clk_cfg = LEDC_AUTO_CLK // Seleção automatica da fonte geradora do clock (interna ou externa)

};


ledc_timer_config(&timer); // Envia o endereço da estrutura timer para a função de configuração do canal PWM

/*
NOTA:
A frequencia e a resolução do ciclo de trabalho são independentes. Para uma elevada frequência do PWM,
terá uma baixa resolução do ciclo de trabalho disponivel e vice-versa
*/

// Estrutura de dados para receber as váriaveis de configuração de frequencia (1Hz, 100 Hz e outros), modo (HIGH ou LOW), selecionar o TIMER (0,1,2)

ledc_channel_config_t channel_LEDC = {
.gpio_num = LEDC_GPIO, // Seleciona o pino para atuar o PWM
.speed_mode = LEDC_LOW_SPEED_MODE, // Modo de Velocidade -> LOW
.channel = LEDC_CHANNEL_0,
.timer_sel = LEDC_TIMER_0,
.duty = 0,
.hpoint = 0

};

ledc_channel_config(&channel_LEDC);


ledc_fade_func_install(0); // Inicializa o serviço do Fade

for(;;){ // Loop

// Define e inicia a função de fade no periférico LEDC
ledc_set_fade_time_and_start( channel_LEDC.speed_mode , channel_LEDC.channel , 0 , LEDC_FADE_TIME , LEDC_FADE_WAIT_DONE);
ledc_set_fade_time_and_start( channel_LEDC.speed_mode , channel_LEDC.channel , LEDC_RESOLUTION , LEDC_FADE_TIME , LEDC_FADE_WAIT_DONE);


}// endLoop

}//endMain

/*
*** Paramentrização da função " ledc_set_fade_time_and_start(); " ***

ledc_set_fade_time_and_start(ledc_mode_tspeed_mode, ledc_channel_tchannel, uint32_t target_duty, uint32_t max_fade_time_ms, ledc_fade_mode_tfade_mode)

ledc_mode_tspeed_mode -> modo do timer utilizado
ledc_channel_tchannel -> indice do canal LEDC (0-7)
uint32_t target_duty -> (2 ** resolução_ciclo_de_trabalho) - 1
uint32_t max_fade_time_ms -> tempo máximo (ms) para o fading
ledc_fade_mode_tfade_mode ->
*/

O programa desenvolvido possui uma estrutura bem simples e não é necessário acrescentar nenhuma biblioteca, apenas a manutenção dos arquivos de cabeçalho já presentes no projeto.

Ao criar um novo projeto no IDF automaticamente já temos arquivos configurados e prontos para programação do dispositivo, desta forma digite e comente as linhas do seguinte código no arquivo main.c :

Você encontra o projeto completo na documentação da Franzininho: PWM_LEDC

Caso ainda não tenha instalado e configurado o IDF no seu computador ou tenha dúvidas sobre as ferramentas, acesse o tutorial de instalação (Clique Aqui).

Compilação

Após a codificação vamos compilar o código, mas antes selecione o set-target para ESP32-S2. Caso não possua a placa Franzininho WiFi altere o target para o modelo de ESP32 utilizando em seu projeto.

idf.py set-target esp32s2

Ao final da compilação o resultado final deve ser semelhante à imagem mostrada abaixo, em caso de erros retorne os passos anteriores e revise seu código.

Imagem do Terminal Visual Code

Após a etapa de compilação vamos enviar o código fonte para nossa placa, no editor pressione o ícone abaixo e aguarde alguns segundos para assim dar início ao upload do programa “PWM” (seta preta) .

Barra inferior do Visual Code

Resultados

Após enviar seu código e com o circuito devidamente montado o LED externo conectado começará a aumentar e diminuir sua intensidade luminosa gradualmente criando o fade desejado. Na figura 5 temos a imagem do osciloscópio mostrando a forma de onda gerada e o duty cycle atuando no momento e na figura 6 o circuito em perfeito funcionamento.

Saída do sinal PWM

Imagem do circuito em funcionamento

Conclusão

Neste exemplo apresentamos tópicos intermediários sobre a manipulação do periférico LED Control, utilizamos conceitos importantes da linguagem C estrutura de dados e ponteiros implementado na configuração do sinal pulsado.

Deve-se deixar claro que o artigo aborda um conteúdo para darmos os primeiros passo com este periférico, encorajamos que o leitor reconfigure a saída do sinal PWM como também acesse a documentação oferecida pela Espressif para compreender como o hardware do chip comporta-se com cada configuração realizada além das funções implementadas em software.

AutorHalysson Junior
Data:22/07/2021