Por Fernando Koyanagi
Objetivo
Nosso objetivo será criar um programa para controlar a
velocidade de rotação do motor que retiramos de um disco rígido.
Utilizaremos: 1 arduino UNO, 1 motor brushless de HD, 3
Transistores Tip122, 3 resistores 1200Ω, 3 diodos 1N4007 e uma
fonte de alimentação 12v / 5v.
Arduino UNO
3
TIP122
4
1N4007
5
Resistor 1k2 Ω
6
Em [Link]
Download arquivo PDF dos diagramas
Download arquivo INO do código fonte
7
Esquema Elétrico
Montagem
Exemplo 1
Vamos fazer um programa para chegar ao máximo
da rotação de nosso motor, ou seja, 5400 rpm.
Obs: utilizando alimentação de 5v
Vamos ao código
Começaremos definindo as constantes que utilizaremos durante nosso código.
//definição dos pinos que cada bobina representa no arduino
#define A 6
#define B 9
#define C 11
//intervalo de delay inicial que irá decair para aumentarmos a aceleração
int intervalo = 6000;
//variável responsável por armazenar o valor que decrementaremos de nosso delay
int decremento = 15;
//variáveis que armazenam os tempo em microssegundos para o delay.
const int DELAY_MINIMO = 450;
const int DELAY_ACEL_MAXIMA = 1200;
const int DELAY_MARCO_UM = 4500;
const int DELAY_MARCO_DOIS = 3200;
const int DELAY_MARCO_TRES = 2200;
Setup
Na função setup(), vamos apenas configurar como OUTPUT os pinos que
utilizaremos para controlar as bobinas e o LED de indicação.
void setup()
{
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);//apaga o LED L
}
Loop
Na função loop(), vamos fazer as chamadas para controle das bobinas e em seguida
configurar a aceleração para ir aumentando a velocidade de giro do motor.
void loop()
{
//chamada da ativação das bobinas
pulso(1);
pulso(2);
pulso(3);
pulso(4);
pulso(5);
pulso(6);
//enquanto o intervalo for maior que DELAY MÁXIMO o decremento é maior que 1 unidade.
if(intervalo > DELAY_ACEL_MAXIMA)
{
//outras faixas de intervalo para ir controlando a aceleração
if(intervalo < DELAY_MARCO_UM)
decremento = 10;
else if(intervalo < DELAY_MARCO_DOIS)
decremento = 5;
else if(intervalo < DELAY_MARCO_TRES)
decremento = 2;
}
else decremento = 1;
//...
Loop (continuação)
//...
//tempo mínimo de delay permitido (quanto menor mais rápido o giro)
if(intervalo > DELAY_MINIMO){
//subtrai de intervalo o valor atual de decremento
intervalo -= decremento;
}
else {
//acende o led L do arduino ao chegar na velocidade máxima permitida
digitalWrite(LED_BUILTIN, HIGH);
}
}
PULSO
void pulso(int bobina)
{
switch(bobina)
{
case 1: //liga a bobina A
digitalWrite(A,HIGH);
break;
case 2://liga a bobina A e B
digitalWrite(A,HIGH);
digitalWrite(B,HIGH);
break;
case 3://liga a bobina B
digitalWrite(B,HIGH);
break;
case 4://liga a bobina B e C
digitalWrite(B,HIGH);
digitalWrite(C,HIGH);
break;
case 5://liga a bobina C
digitalWrite(C,HIGH);
break;
case 6://liga a bobina C e A
digitalWrite(C,HIGH);
digitalWrite(A,HIGH);
break;
}
PULSO (continuação)
//tempo que a(s) bobina(s) ficam ligadas
delayMicroseconds(intervalo);
//desliga todas as bobinas
digitalWrite(A,LOW);
digitalWrite(B,LOW);
digitalWrite(C,LOW);
delayMicroseconds(intervalo);
}
Exemplo 2
Agora vamos fazer algumas modificações em nosso
programa para que nosso motor gire em sua potência
Mínima.
Modificações para 100 rpm
Primeiramente mude o valor da variável “intervalo”
para 45000.
//intervalo de delay inicial que irá decair conforme aceleração
int intervalo = 45000;
Modificações
A seguir na função LOOP, deixa apenas as chamadas para
a função PULSO.
void loop()
{
//chamada da ativação das bobinas
pulso(1);
pulso(2);
pulso(3);
pulso(4);
pulso(5);
pulso(6);
}
Agora é só compilar e executar. O motor ficará girando
em sua potência mínima.
Veja abaixo uma tabela com a configuração para os
valores máximos e mínimos do motor.
Intervalo DELAY_MINIMO Rpm Voltagem
6000 220 5400 12v
41500 Não usa 141 12v
6000 450 5400 5v
45000 Não usa 101 5v
Em [Link]
Download arquivo PDF dos diagramas
Download arquivo INO do código fonte
22