Controle de sentido de rotação de Motor DC com ponte H

Sou iniciante e estou tentando fazer um projeto que tem que mudar o sentido de rotação de um motor dc, por meio de uma chave de duas posições, utilizando ponte H, composta de transistores TIP122 e diodos 1N4007, além disso tem que realizar o controle de velocidade com um potenciômetro. Peguei alguns retalhos de códigos na internet e tente fazer o programa, mas estou tendo dificuldade. Segue abaixo o código e em anexo o esquema do circuito que montei.

int PonteEntrada1 = 3; //Q1
int PonteSaida1 = 9; //Q4
int PonteEntrada2 = 5; //Q2
int PonteSaida2 = 6; //Q3
const int chave = 13;
bool chaveIsOn;
int potPin = 0; // Potenciometro ligado no pino analogico A0
int val;
int val2;

void setup()
{
pinMode(PonteEntrada1,OUTPUT);  // Seta o pino como saida
pinMode(PonteSaida1,OUTPUT);     // Seta o pino como saida
pinMode(PonteEntrada2,OUTPUT);  // Seta o pino como saida
pinMode(PonteSaida2,OUTPUT);     // Seta o pino como saida
pinMode(chave, INPUT);

parar(); // Coloca todos os pinos dos motores em zero
}

void loop()
{
chaveIsOn = digitalRead(chave);
val2 = analogRead(potPin);
val = map(val2,0,1023,0,510);
if (chaveIsOn)
{
if(val >= 256)
{
val= val-255; // para: val==256; val = 1; val==257; val = 2; val==258; val = 3; ..... val==510; val = 255 ( pwm maximo)*/
digitalWrite(PonteSaida1, LOW);  // O pino 9 colocado em nivel baixo que no motor, apos ponte H, se torna (-)*/
analogWrite(PonteEntrada1, val); // O pino 3 recebe o valor pwm
digitalWrite(PonteSaida2, LOW);  // O pino 6 colocado em nivel baixo que no motor, apos ponte H, se torna (-)*/
analogWrite(PonteEntrada2, val);  // O pino 5 recebe o valor pwm
delay(30);
chaveIsOn = digitalRead(chave);
if (!chaveIsOn)
{
break;
}
}
}
else
{
if(val <= 255)
{
val= 255-val; // para: val==254; val = 1; val==253; val = 2; val==252; val = 3; ..... val==0; val = 255 ( pwm maximo)

digitalWrite(PonteEntrada1, LOW); // O pino 3 recebe o valor pwm
analogWrite(PonteSaida1, val);      // O pino 9 colocado em nivel baixo que no motor, apos ponte H, se torna (-)*/
digitalWrite(PonteEntrada2, LOW); // O pino 5 recebe o valor pwm
analogWrite(PonteSaida2, val);      // O pino 6 colocado em nivel baixo que no motor, apos ponte H, se torna (-)*/
delay(30);
chaveIsOn = digitalRead(chave);
if (chaveIsOn)
{
break;
}
}
}
}

void parar()
{
digitalWrite(PonteEntrada1, LOW);
digitalWrite(PonteSaida1, LOW);
digitalWrite(PonteEntrada2, LOW);
digitalWrite(PonteSaida2, LOW);
}

Exibições: 2296

Anexos

Responder esta

Respostas a este tópico

boa tarde RLCF.

      Analisei a sua intenção, e em seguida o seu código.

      Ficou claro o que vc pretende fazer em termos do controle do Motor via "Ponte H".

      Já o seu código estava um tanto confuso, provavelmente por causa do que você mesmo relatou: que pegou alguns "retalhos" de código na Internet. Normal isso, já que nem sempre encontra-se na Internet exatamente o que queremos. O importante foi sua inciativa de fazer isso funcionar, e da forma como você deseja.

     Assim, organizei seu código e ajustei alguns pontos nele, para funcionar da forma como vc descreveu:

     1) por meio de um potenciômetro vc controla a velocidade, entre a mínima (zero) e a máxima do Motor (essa depende do Motor e da tensão que alimenta o mesmo via Ponte H).

     2) por meio de uma chave você seleciona a direção de giro do Motor.

     Dá uma olhada no código que anexei. Espero que atenda sua expectativa, e também permita você aprender mais e ir adiante com sua proposta.

     Uma dica muito importante: se possível coloque resistores na base dos TransistoresTIP122. Assim você evita queda de tensão interna nos MOSFETs das saídas digitais do Arduino, as quais controlam esses transistores (os seus TIPs). O povo não vê essa queda de tensão interna, pois ela ocorre dentro da porta digital do ATmega328, e por isso "eles" acham que está tudo bem. Mas não está. A queda de tensão interna não pode ocorrer. Quando ela ocorre, o MOSFET da saída digital começa a aquecer, o que é totalmente anormal. Depois de algum tempo, pode ocorrer dessas saídas ficarem danificadas, já que isso não é previsto para acontecer nessas saídas. O resistor, deve ser ligado entre a saída digital (o pino do Arduino) e a base dos Transistores. Como vc tem 4 transistores, então são necessários 4 resistores. Estes TIP122 são do tipo "Darlington", e possuem ganho muito alto (normalmente acima de 1000), o que permite que se use uma ampla faixa para o valor dos resistores. Por exemplo, você pode testar com 1 kohm, e verificar se está funcionando bem (o Motor). Fazendo isso, seu Arduino vai agradecer.

     Caso tenha alguma dúvida, estou à disposição para esclarecer.

     Abrçs,

     Elcids

Anexos

boa noite RLCF.

     Estou atualizando o post.

     Simulei o Sistema no Proteus, com exatamente o mesmo código que disponibilizei no post anterior. Funcionou como descrito e esperado. Claro que no simulador a velocidade demora mais a mudar, devido às interações da simulação. Mas respondeu tanto ao nível ajustado no Potenciômetro, como ao comando da Chave da direção do giro.

     O circuito é o mostrado a seguir:

      Observe que conforme sugeri anteriormente, utilizei resistores de 1k na base dos transistores. Aconselho sempre fazer isso. Mesmo no caso de transistores tipo "Darlington" (caso do TIP 122), onde o ganho é muito alto e isto reflete uma maior impedância vista entre a base do transistor e seu emissor (o famigerado HFE x r'e). Fazendo isso, você evita o problema que descrevi no post anterior (a queda de tensão no MOSFET interno na saída digital do Arduino). Assim, se "amanhã" você tiver que usar outros transistores que não sejam "Darlington", não ocorrerá o problema que descrevi, pois o resistor impedirá este problema.

     Na prática, se alguém achar que isso impactou na velocidade máxima do Motor (em geral o impacto é menor que 1%), basta reduzir o valor do resistor de base (para por exemplo algo entre 330 ohms e 1k), assim garantindo a corrente necessária para atingir a velocidade máxima (mas sem "forçar" a corrente de base). Mas sempre usar o resistor.

    Outro benefício do resistor de base, é que ele ajuda a proteger a saída digital do Arduino, contra "spikes" que possam retornar do circuito indutivo do Motor. É bom lembrar que alguns spikes sempre "retornam", pois os Diodos da Ponte H que "absorvem" ou desviam os spikes, nem sempre são rápidos o suficiente para proteger contra os spikes de frequências mais altas (lembrar que a onda aplicada é um PWM, ou seja, uma onda quadrada, e portanto "composta" de uma quantidade infinita de harmônicas). Mesmo spikes muito estreitos são capazes de danificar as saídas digitais do Arduino, então como eu disse anteriormente: seu Arduino agradece o uso dos resistores.

      Detalhe final: alterei ligeiramente o circuito da chave de direção, acrescentando um capacitor e mudando a ligação do resistor já existente (também alterado de 10k para 200k). Isto funcionará como um "anti-bouncing" muito eficiente, e evitará decisões "malucas" por parte do Programa, quando a chave estiver mudando de posição, exatamente naquele pequeno intervalo de tempo em que ela não está ligada nem à VCC nem à GND.

     No anexo, está incluso novamente o código "ino", além do design do circuito no Proteus (incluindo a Lib para simulação do Arduino).

     Quaisquer dúvidas, fico à disposição.

     Abrçs,

     Elcids

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço