banner

Controle de velocidade de Motor DC com ESP32


Voltamos hoje a falar da Ponte H e sobre como controlar a velocidade de um motor DC com um ESP32 LoRa com display. Vou te apresentar uma opção de controle de velocidade de uma ponte H usando MOSFET’s e aplicar esse controle em um motor para avaliar o seu comportamento. Particularmente, gosto muito do motor de vidro de carro, pois ele consome uma corrente razoável, de cerca de 2 amperes, mas ele tem muita força por torque. Sem contar que ele tem uma rosca sem fim com uma engrenagem que o faz ter uma boa resistência mecânica.


Se você ainda não viu, assista agora esse vídeo: Super Driver de 1 a 200 amperes para Motor DC, no qual eu ensino sobre a Ponte H com MOSFET’s.


Demonstração




Recursos usados


  •          Um ESP WiFi LoRa 32
  •         Quatro IRF1404
  •         Três BC337
  •         Um CD4011
  •         Resistores
  •         Dois capacitores eletrolíticos 1uF
  •          Dois diodo 1N4148
  •          Cabo USB para o ESP
  •          Fonte 12V para a carga utilizada
  •          Carga (usamos um motor de vidro elétrico)
  •          Protoboard
  •          Fios
  •          Tacômetro ou outro método para medir RPM




Esquema

·         Este é o esquema utilizado neste exemplo e é o mesmo apresentado no vídeo sobre ponte H com MOSFET.




Esquema - Ponte H

·         A ponte H terá quatro IRF1404 dispostos de modo que a ativação de um par deverá permitir o fluxo de corrente em um sentido e a ativação do par oposto deverá inverter o sentido.
·         Indicamos o par que deve ser ativado ao mesmo tempo pelas entrada DIR A e DIR B, indicando a mudança de direção do motor.




Esquema – O dobrador de tensão

·         Este é um circuito baseado em diodos e capacitores bastante conhecido na eletrônica.
·         Funciona basicamente como um “bomba” de elétrons, empurrando elétrons pelos capacitores a fim de criar uma tensão superior pelo acúmulo de cargas.
·         A princípio, um dobrador de tensão deverá entregar em sua saída o dobro da tensão de entrada.
·         Na prática, devido às quedas de tensão, o valor obtido foi de 21,5V aproximadamente. Mas era o bastante para a ativa dos MOSFET’s.




Esquema – Ativação – Hardware

  • Ao contrário do ultimo vídeo, desta vez incluímos o circuito de controle dos estados da ponte H, para expandir o exemplo anterior e garantir uma etapa física de proteção contra o estado proibido.
  • As entradas de controle serão denominadas:
    • EN (do termo ENABLE – HABILITAR), conectado ao GPIO17 do ESP
    • DIR (DIREÇÃO), conectado ao GPIO2 do ESP.
  • Usaremos um PWM aplicado ao pino EN para controlar a quantidade de energia entregue ao motor e consequentemente sua velocidade.
  • LEMBRE-SE: NÃO DEVE HAVER ATIVAÇÃO SIMULTÂNEA DE DIR A E DIR B





Captura dos estados de saída do circuito de controle




Procedimento

  • Vamos escrever um código que nos permita obter o valor do RPM para vários valores de PWM.
  • Para isso vamos medir o RPM usando Tacômetro digital.
  • Para cada valor de PWM, vamos medir o RPM do motor durante 20 segundos.




Avaliando o comportamento do motor






Código-Fonte: Curva média




Função de ajuste de velocidade

·         Usando os métodos que já apresentamos em outras oportunidades, podemos obter uma curva média, que represente o comportamento do motor em questão e a partir daí, relacionar um valor de PWM e RPM.



Mode: normal
Polynomial degree 6, 25 x,y data pairs
Correlation coefficient (r^2) = 9,999194679032e-01
Standard error = 1,643952462530e-01
Output form: C/C++ function:

double f(double x) {
    return  -5,900718562093e+01
         +   1,080432239400e-01 * x
         +   8,360068942087e-06 * pow(x,2)
         +  -4,690449122452e-08 * pow(x,3)
         +   2,352218983798e-11 * pow(x,4)
         +  -4,810573531109e-15 * pow(x,5)
         +   3,614465424238e-19 * pow(x,6);
}

Copyright © 2012, P. Lutus -- http://www.arachnoid.com. All Rights Reserved.



Código-Fonte: #Includes e #Defines

//Bibliotecas para utilização do display OLED
#include <Wire.h>  // Necessário apenas para o Arduino 1.6.5 e posterior
#include "SSD1306.h" // o mesmo que #include "SSD1306Wire.h"

//Os pinos do OLED estão conectados ao ESP32 pelos seguintes GPIO's:
//OLED_SDA -- GPIO4
//OLED_SCL -- GPIO15
//OLED_RST -- GPIO16

#define SDA    4
#define SCL   15
#define RST   16 //RST pode ser ajustado por software


Código-Fonte: Objetos, Constantes e variáveis

SSD1306  display(0x3c, SDA, SCL, RST); //Instanciando e ajustando os pinos do objeto "display"

//PWM usado como oscilador do dobrador de tensão
const int freq_osc = 1000; //Frequencia do PWM
const int canal_osc = 0; // canal do PWM oscilador
const int pin_osc = 21; //GPIO utilizada para o oscilador
const int ciclo = 2048; //ciclo de trabalho de 50%

//PWM usado para controle de velocidade
const int freq_vel = 200; //Frequencia do PWM do controle de velocidade
const int canal_vel = 1; // canal do PWM controle de velocidade
const int pin_EN = 17; //Habilita ou desabilita a ponte (controla a velocidade)
const int pin_DIR = 2; //Controla direção

//Resolução dos PWM's
const int resolucao = 12; // Resolução (4096 estados)

//Intervalo para mudança do PWM
const int intervalo = 200; 

//Constante que determinar o valor mínimo para o PWM
const int min_vel = 0;

// Variável usada para alternar a direção
boolean dir = false;

// variável para armazenar a velocidade atual
int velocidade = 0;


Código-Fonte: Setup()

void setup()
{
  //seta a direção dos GPIO
  pinMode(pin_osc, OUTPUT);
  pinMode(pin_DIR, OUTPUT);
  pinMode(pin_EN, OUTPUT);

  // Ajusta o PWM do oscilador do dobrador
  ledcSetup(canal_osc, freq_osc, resolucao);
  ledcAttachPin(pin_osc, canal_osc);
  ledcWrite(canal_osc, ciclo);

  // Ajusta o PWM de controle de velocidade
  ledcSetup(canal_vel, freq_vel, resolucao);
  ledcAttachPin(pin_EN, canal_vel);
  ledcWrite(canal_vel, velocidade);

  //Ajusta a direção para LOW inicialmente
  digitalWrite(pin_DIR, dir);

  // Inicia o display
  display.init();

  display.flipScreenVertically(); //Vira a tela verticalmente
  display.clear();
  //ajusta o alinhamento para a esquerda
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  //ajusta a fonte para Arial 16
  display.setFont(ArialMT_Plain_16);
}



Código-Fonte: Loop()

void loop()
{
  //Varia os estados do PWM do máximo até o valor mínimo em passos de 136.5 unidades
  //para que todo o intervalo tenha 30 valores (4095 / 30 = 136.5 )
  for (velocidade = 4095; velocidade >= min_vel ; velocidade = velocidade - 136.5)
  {

    ledcWrite(canal_vel, velocidade);//ajusta o PWM para o novo valor de velocidade
    display.clear(); //limpa o buffer do display
    display.drawString(0, 0, String(velocidade)); //escreve a velocidade no buffer
    display.display(); ///mostra no display
    delay(intervalo); //aguarda o intervalo
  }
  
  dir = !dir; //inverte a variável de controle de direção
  digitalWrite(pin_DIR, dir); // ajusta o pino de direção com o novo valor

  //Varia os estados do PWM do mínimo até o valor máximo em passos de 136.5 unidades
  //para que todo o intervalo tenha 30 valores (4095 / 30 = 136.5 )
  for (velocidade = min_vel; velocidade <= 4095 ; velocidade = velocidade + 136.5)
  {
    ledcWrite(canal_vel, velocidade); //ajusta o PWM para o novo valor
    display.clear();//limpa o buffer do display
    display.drawString(0, 0, String(velocidade)); //escreve a velocidade no buffer
    display.display(); //mostra no display
    delay(intervalo); //aguarda o intevalo
  }
}





Faça o download dos arquivos





Um comentário:

  1. Ótima aula Fernando!

    Tenho uma dúvida, eu poderia fazer o mesmo projeto com Ponte H L298N e um step motor? Ou um uln2003 e um step motor.

    Desde já obrigado!

    ResponderExcluir

Tecnologia do Blogger.