Controlador LMD12800

Tempo de leitura: 5 minutes
  • Apresentaremos o controlador LMD12800.
  • Vamos descrever características.
  • Veremos um programa para controlar a velocidade
  • Faremos um exemplo de freio elétrico.

 

MAIS CONTROLADORES DE MOTORES

Um cliente me contou sobre um problema que ele teve com um controlador de motor, já de uma certa potência, e como o freio não funcionava bem, o que estava causando alguns problemas para ele porque o motor ia para onde Deus mandava, o que era sempre muito além de onde deveria ter parado.

Como nunca tinha usado persianas motorizadas de 24V e 80 Watts (das quais não é conveniente que seus dedos fiquem presos) resolvi fazer alguns testes por vários motivos. Em primeiro lugar, porque adoro brincar com motores e se forem grandes, tanto melhor. Em segundo lugar, porque até agora eu só tinha usado motores de brinquedo, como para pequenos robôs com Arduino, mas nunca um motor sério e já de uma certa potência e fiquei curioso. E, em terceiro lugar, porque, embora eu tenha usado e visto vários tutoriais de como controlar um motor DC do Arduino com um controlador como o L293D ou o L298N, eu não tinha certeza de como controlar o que esses clientes usavam, o LMD18200. isso parecia sério.

Como você vai entender a coisa toda me fez sorrir e lá fui eu começar a fazer os testes. A primeira coisa a pesquisar na Internet por algo sobre Arduino e o LMD 18200…. Pouco menos que nada (começamos mal). A próxima coisa a olhar para o Datasheet do LMD 18200. Isso foi muito mais fácil.

Lendo um pouco, vi logo que era um motor driver do tipo H-Bridge, do tipo que já conhecemos, mas com a particularidade de poder suportar até 3A e uma tensão de até 55V, o que o torna integrado ideal para controlar motores DC de média-baixa potência, mas já estamos falando de 150W. Em outras palavras, seria ótimo quando precisamos governar motores sérios, como mover uma pequena correia transportadora ou algo parecido.

Meu cliente me passou um motor de 24V e até 5A junto com uma fonte de alimentação de 24V e um controlador LMD12800 embutido em um pequeno cartão para maior facilidade de uso, (o que eu nunca tinha visto na vida), e do qual praticamente fiz não encontrar nenhuma informação na internet. Mas quando os testes com gadgets nos detiveram? Não?

Olhando em volta, imediatamente vi alguns rótulos bastante familiares no controlador:

Ummmhhh! Bem à direita da foto V+ e GND. A alimentação do motor 24V e abaixo de OUT1 e OUT2, os terminais do motor. Até aqui tudo normal, ver à direita…. GND, nós conhecemos este. PWM, ok, a velocidade do motor é controlada com um sinal PWM como de costume. DIR: uma rápida olhada no Datasheet nos informa que HIGH indica um sentido de rotação e LOW o oposto. Tudo normal…. Mas o que é esse FREIO?

Nova visita ao Datasheet e verifica-se que é um freio elétrico que rege a rotação do motor e que trava quando colocamos o BRAKE em HIGH. Olhe para você, eu nunca tinha usado algo assim antes, você tem que tentar isso.

 

ESQUEMA DE CONEXÃO

Vamos montar um pequeno circuito com um Arduino uno como controlador, mais uma placa controladora do motor e o motor…. E um joystick XY, ​​para poder aumentar ou diminuir a velocidade de rotação e um botão de pressão que, quando pressionado, aciona o freio.

Tudo parece normal, então é hora de passar para a parte de programação para testar o controle. Vamos ver como.

 

PROGRAMANDO O CONTROLADOR LMD12800

Em uma primeira aproximação poderíamos ler o joystick diretamente e tornar a velocidade do motor diretamente igual à posição do mesmo. Ou seja, acima de 500 a velocidade aumenta e abaixo diminui (já que o joystick dá leituras entre 0 e 1024, com o centro, 512, na posição de repouso. pulso muito bom o suficiente para torná-lo um pouco estável, e também tem a desvantagem de que, quando você solta o joystick, o motor permanece girando a 50% da velocidade, o que parece impraticável

Em vez disso, a ideia é ler o joystick vertical, e aumentar ou diminuir uma variável que representa a velocidade do motor, para que quando o joystick for solto, a velocidade se estabeleça e se mantenha.

Bem, dito isso, vamos ao que interessa. Pela primeira vez não há necessidade de usar bibliotecas. Vamos lidar com o controlador bareback, mas vamos definir algumas variáveis ​​instrumentais, para definir os pinos a serem usados ​​e seus nomes:

#define PWM 9
#define DIR 8
#define BRAKE 10
#define SWITCH 2

int Speed = 0 ;
int freio = 1 ;   // Para arrancar sem freio

O manual do LMD18200 nos diz que devemos indicar a velocidade do motor com um sinal PWM, largura de pulso modulada, e é por isso que vamos usar o pino 9 do nosso Arduino UNO (Lembre-se que nem todos os pinos do UNO são capazes de este tipo de sinais)

Vamos definir os pinos de entrada e saída em setup():

void setup()
{   Serial.begin(115200);
    pinMode(PWM, OUTPUT);
    pinMode(DIR, OUTPUT);
    pinMode(BRAKE, OUTPUT);

    pinMode( SWITCH, INPUT_PULLUP);
}

A única coisa que vale a pena comentar é que vamos ler um botão integrado no joystick e para isso precisamos de um resistor Pull Up, que, ao invés de incluí-lo no circuito externo, instruímos nosso Arduino a colocá-lo internamente. . E com isso, podemos passar para loop(). Começamos lendo o joystick:

int valor = analogRead(A1);

Agora estamos interessados ​​que se o joystick estiver acima de, digamos, 600 (de 1024 possíveis) aumentamos a velocidade e se estiver abaixo de 400, diminuímos. Isso nos deixa com uma faixa de segurança de 401 a 599 em que a velocidade não varia, principalmente ao soltar o joystick, que ficará acima de 500 (meia)

if ((valor > 600)  && (Speed < 1013 ))    // para não exceder 1023
     Speed = Speed +10 ;
else if( valor <400 && Speed > 10)
     Speed = Speed - 10 ;
delay(200);   // Para evitar mudanças bruscas de velocidade

A função do last delay() é evitar que, se mantivermos o joystick na posição de aceleração, ele não o faça muito rápido (ou seja, para que a aceleração seja moderada, mas você pode brincar com esse valor) . Agora temos que definir a velocidade do motor de acordo com o valor da variável Speed:

analogWrite(PWM, Speed);
delay(50);

Com isso já temos a variação de velocidade do motor funcionando, mas agora temos que acionar o freio ao pressionar o joystick:

bool freio = !digitalRead(SWITCH); // Preste atenção aqui

Lemos o Joystick Switch e o associamos, invertido, à variável booleana freio.

    • Caso a negação da leitura o incomode: Tenha em mente que o botão retornará HIGH quando não for pressionado (lembre-se que colocamos um Pull Up) e retornará LOW enquanto o botão estiver pressionado.
    • Como eu quero que o freio seja True quando o botão for pressionado e False quando não for pressionado, não temos escolha a não ser inverter o valor da leitura direta.

Agora temos que frear o motor com o pino BRAKE, quando a variável do freio for positiva:

if (freio)
{ pinMode(BRAKE, HIGH);        // Nós ordenamos a frenagem
  Speed = 0 ;                  // Para o motor: Velocidade = 0
}

E com isso temos tudo, o que foi mais fácil do que você temia? Aqui está o programa completo: freio