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
2 Comentários
Ótima aula Fernando!
ResponderExcluirTenho 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!
Vnn
ResponderExcluir