Control de motor de disco duro


          Los motores de disco duro son del tipo brushless, es decir giran sin contacto eléctrico. Esto les permite girar a muy altas revoluciones. Normalmente tienen 3 hilos de entrada, a veces 4 que suele ser masa y no se necesita conectar.

          La parte estática del motor (stator) genera campos magnéticos rotatorios que inducen el giro del rotor. Estos campos magnéticos se generan aplicando tensión a los tres conectores en una secuencia precisa. Además, este voltaje ha de aplicarse con unos intervalos precisos de mayora menor ya que el motor debe arrancar a velocidad lenta y alcanzar la máxima progresivamente.

          Veamos primero el motor del HD y circuito montado.

  
     El disco duro sin los brazos lectores. Los discos de datos y el motor .
           Los tres contactos del HD. El montaje con Arduino y un módulo controlador de motores basado en el chip L298. El motor consume en el arranque a baja velocidad más de dos amperios y al final baja a más de un amperio. Es demasiado para el pequeño disipador del módulo y se calienta demasiado, habría que cambiarlo para un uso continuado del motor. En su lugar, también pondrían usarse tres MOSFET (con disipadores).
           El motor montado (al revés de lo normal). El montaje completo. He añadido otro Arduino con un sensor óptico como tacómetro.
           Por último el código que permite alcanzar más de 3500 rpm. Se comienza el ciclo de magnetización con intervalos de varios milisegundos y se va disminuyendo hasta pocos microsegundos.
//Control motor HD
//www.jopapa.me
//2018
int Rojo = 3;
int Azul = 5;
int Negro = 6;
int PriDelay = 32000;

void setup() {
  pinMode(Rojo, OUTPUT);
  pinMode(Azul, OUTPUT);
  pinMode(Negro, OUTPUT);
}

void loop() { 
if (PriDelay > 20000){
  PriDelay = PriDelay - 300; 
}

if (PriDelay > 3500) {
  PriDelay = PriDelay - 50;
}

if (PriDelay > 1400) {
  PriDelay = PriDelay - 5;
}
  motor();
}

void motor(){
    digitalWrite(Rojo, HIGH);
    digitalWrite(Azul, LOW);
    digitalWrite(Negro, LOW);
    CalRetardo(PriDelay);

    digitalWrite(Rojo, LOW);
    digitalWrite(Azul, HIGH);
    digitalWrite(Negro, LOW);
    CalRetardo(PriDelay);
   
    digitalWrite(Rojo, LOW);
    digitalWrite(Azul, LOW);
    digitalWrite(Negro, HIGH);
    CalRetardo(PriDelay);
}

void CalRetardo(unsigned long retar) {
if ( retar > 16380) {
  delay (retar/1000);
  } else {   
  delayMicroseconds(retar);
  }
}




Menu