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.
0 Comentários