banner

Motor potente de 12V com encoder indutivo e ESP32



Mais um vídeo de motor DC, que é aquele utilizado na ventoinha do carro. E, por que resolvi falar nele? Porque o considero potente. Tem 12V por cerca de 3 amperes e custa menos de R$ 100,00. Vamos, então, neste vídeo, avaliar o comportamento deste motor de ventoinha de arrefecimento automotivo de forma automatizada e traçar uma curva com o perfil de funcionamento deste motor para este exemplo que usa ESP32 LoRa.






Demonstração





Recursos usados

  • Um ESP WiFi LoRa 32
  • Quatro IRF1404
  • Três BC337
  • Um CD4011
  • Resistores
  • Dois capacitores eletrolíticos 1uF
  • Dois diodos 1N4148
  • Cabo USB para o ESP
  • Fonte 12V para a carga utilizada
  • Motor de ventoinha
  • Protoboard
  • Fios
  • Sensor de proximidade indutivo
  • Potenciômetro 10komhs
  • Disco plástico (preso ao eixo)
  • Fita adesiva de alumínio (ou outro metal para detecção)






Esquema

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






Esquema – detecção

  • Para detecção vamos utilizar um sensor de proximidade indutivo.
  • Seu principio de funcionamento baseia-se na mudança do campo magnético (criado pelo próprio sensor), devido a proximidade de um material capaz de alterar o fluxo magnético o bastante para sensibilizar o sensor.
  • Para o modelo utilizado, o LJ8A3-2-Z/BX, temos:
  • Pode ser alimentado por uma tensão de 6V a 36V.
  • ·         A distância de detecção é de 2mm (+-10%).
  • ·         Saída NPN normal aberta (NO).
  • ·         Calibrado para detecção de ferro.
  •  
  • Apesar de ser calibrado para utilização com ferro, podemos aplicá-lo usando outros materiais. Mas isso deverá interferir na sua capacidade de detecção. No caso deste exemplo, usamos uma fita adesiva de alumínio, presa de um lado do disco, que atendeu adequadamente às necessidades.






Procedimento

Vamos escrever um código que nos permita obter o valor do RPM para vários valores de PWM.
Desta vez, ao invés de utilizar o tacômetro digital, vamos usar um sensor de proximidade indutivo. Utilizaremos sua saída digital para detectar a passagem de um pedaço de fita de alumínio fixado ao disco plástico preso ao eixo.
A saída do sensor será conectada a um dos GPIO do ESP, configurado como entrada digital. O período de 100 detecções (100 rotações) será medido, de onde obteremos o período médio de uma rotação.
Sabendo o período médio de uma rotação, poderemos facilmente determinar a frequência da rotação, lembrando que:






Precauções


Ao trabalhar com a ponte, tenha sempre em mente alguns cuidados:
  • Se a fonte de alimentação do motor não tiver uma proteção de sobre corrente, providencie pelo menos um fusível, para o caso de algum acidente ou falha, evitando assim o dano a fonte.
  • Sempre que possível, mantenha a parte lógica do circuito em uma fonte separada da fonte do motor, para minimizar possíveis efeitos indesejados causados pelo ruído elétrico do motor.
  • Embora os IRF1404 possam sustentar altas correntes, mantenha os dispositivos resfriados, através de coolers ou dissipadores (ou ambos). Isso aumentará a vida útil do componente e evitará efeitos adversos causados pela variação de temperatura do componente.
  • Os dispositivos MOSFET são muito sensíveis a descargas eletrostáticas. Sempre que manuseá-los, tome as devidas precauções, como o uso de pulseiras antiestáticas.




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

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 = 50; //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

//Pino de leitura do sensor
const int pin_Leitura = 22; //Captura detecção

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

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

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

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

Setup

void setup()
{
  Serial.begin(115200); //para debug
  //seta a direção dos GPIO
  pinMode(pin_osc, OUTPUT);
  pinMode(pin_DIR, OUTPUT);
  pinMode(pin_EN, OUTPUT);
  pinMode(pin_Leitura, INPUT);

  // 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
  //ajusta o alinhamento para a esquerda
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  //ajusta a fonte para Arial 10
  display.setFont(ArialMT_Plain_10);

  display.clear(); //limpa o buffer do display
  display.drawString(0, 0, "Aquisição"); //escreve a velocidade no buffer
  display.drawString(0, 32, "RPM x PWM"); //escreve a velocidade no buffer
  display.display(); //mostra a mensagem
  delay(10000); //aguarda 10s antes de iniciar
}

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)
  {
    int contador = -1; //define o valor inicial do contador
    unsigned long momento = 0.0; //zera a variável que armazenará o período
    boolean estado = digitalRead(pin_Leitura); //detecta o estado inicial do sensor
    int amostras = 100; //número de amostras para cálculo da média

    ledcWrite(canal_vel, velocidade);//ajusta o PWM para o novo valor de velocidade

    display.clear(); //limpa o buffer do display
    display.drawString(0, 0, "Ajustando PWM: " + String(velocidade)); //escreve a velocidade no buffer
    display.display(); //mostra a mensagem

    delay(2000); //aguarda um instante

    display.clear(); //limpa o buffer do display
    display.drawString(0, 0, "Medindo..."); //indica o incio da medida
    display.display(); //mostra a mensagem

    delay(10000); //aguarda 10s para velocidade se estabilizar

    while (contador < amostras) //inicia a detecção de 100 rotações
    {
      if ((estado == LOW) && (digitalRead(pin_Leitura) == HIGH)) //detecta a mudança para nível alto
      {
        estado = HIGH; //lembre que o nível alto foi detectado
        contador++; //incrementa o contador
        if (contador == 0) //se o contador assumiu zero, indica o início da marcação do tempo
        {
          momento = millis(); //captura o momento
        }
      }
      if ((estado == HIGH) && (digitalRead(pin_Leitura) == LOW)) //detecta  mudança para nível baixo
      {
        estado = LOW; //marca o estado atual
      }
    }
    //envia para a serial os dados obtidos
    Serial.println(String(velocidade) + ";" +  String(60.0 / ((millis() - momento) / 100000.0)));
  }
}





Curva característica deste motor

Esta foi a curva obtida após a coleta de aproximadamente 400 pares de pontos em diversas varreduras realizadas automaticamente e initerruptamente.




FAÇA O DOWNLOAD DOS ARQUIVOS




Nenhum comentário:

Tecnologia do Blogger.