Control de velocidad del motor paso a paso usando un PLC basado en Arduino y un codificador rotatorio

21 de diciembre de 2018 por
Control de velocidad del motor paso a paso usando un PLC basado en Arduino y un codificador rotatorio
Boot & Work Corp. S.L., Support Team

Índice

1. Introducción
2. Requisitos
3. Descripción
4. Conexiones
5. Software
 
6. Casos de estudio

Introducción

En este post controlaremos la velocidad de un motor paso a paso (Nema 17HS16-2004S) utilizando un encoder giratorio (LPD3806-600bm).
Para ello también necesitaremos un controlador para el motor paso a paso que se conectará a nuestro PLC basado en Arduino para la automatización del control de velocidad. Para el software, se implementa una biblioteca pulses.h (software sin usar la biblioteca pulses.h también está conectado). 

Requisitos

Ethernet PLC:
Ethernet PLC >>
Nema 17 Bipolar 45Ncm 4 Wires  Stepper Motor:
Nema 17HS16-2004S Stepper Motor >>
LPD3806-600bm-g5 two phases 5-24 V 600 pulses Encoder: 
Codificador Rotray LPD3806 >>

Microstep Driver TB6600 9 ~ 42V DC 4A:
Conductor Microstep TB6600 >>

Pulses.h library:
Librería Pulses - Repositorio Github >>

Placas Industrial Shields:
Cómo utilizar los pines de mapeo de las placas de Industrial Shields 
4,7 KΩ Resistors: 
4K7 Resistencia de pull-up >>


Descripción

Nema 17 Bipolar 45Ncm 4 Wires Motor paso a paso:  

Un motor paso a paso es un dispositivo electromecánico que convierte una serie de impulsos eléctricos en desplazamientos angulares discretos, lo que significa que es capaz de girar un número de grados (paso o medio paso) dependiendo de sus entradas de control. El motor paso a paso se comporta de la misma manera que un convertidor analógico digital (D / A) y puede ser gobernado por pulsos de sistemas digitales.

En el caso de este post, el motor paso a paso utilizado tiene las siguientes características eléctricas: 

Especificación eléctrica
Bipolar/UnipolarBipolar
Par de sujeción (Ncm)45
Par de sujeción (oz.in)64
Inductancia (mH)2.6
Resistencia de fase (ohm)1.1
Corriente nominal (A)2
Angulo de paso (°)1.8


LDP3806 Codificador rotativo:

También llamado codificador de eje, es un dispositivo electromecánico que convierte la posición angular o el movimiento de un eje o eje en señales de salida analógicas o digitales. Los encoders giratorios se utilizan en una amplia gama de aplicaciones que requieren supervisión o control, o ambos, de sistemas mecánicos.

En el caso de este post, el codificador rotativo LDP3806 está compuesto por un disco de cuadratura, y un módulo de LED/fototransistor.

LDP3806 Especificaciones principales del codificador Giratorio:

  • 600 pulsos/revolución para una sola fase.Por lo tanto,la salida bifásica conduce a 240 pulsos/revolución

  • Velocidad mecánica máxima: 5000 revoluciones/minuto 

  • Frecuencia de respuesta: 0-20KHz

Controlador micropaso:

En términos generales, las placas de controlador de motor paso a paso especializadas sólo requieren dos conexiones (más GND) al Arduino para señales de paso y dirección.

Las placas de conductor de motor paso a paso normalmente especializadas tienen la capacidad de limitar la corriente en el motor que les permite conducirlo con voltajes más altos (hasta 35v para el Pololu A4988) para un mejor rendimiento de alta velocidad. Los conductores suelen tener la capacidad de hacer micropasos. 

Conexiones


Stepper Motor - Driver connections:

Blue     -->      A-
Red      -->      A+
Black   -->      B-
Green  -->      B+ 

Ethernet PLC - Driver connections: 

Q0.0    -->  PUL + (pulses)      
Q0.1    -->  DIR+ (rotational direction)
Q0.2    -->  ENA+ (enable)                     
GND    --> PUL-, DIR -, ENA -

* Señales = 5Vdc
* No utilice Q0.5,Q0.6 o Q0.7, no son salidas digitales puras!

Encoder - Ethernet PLC Connections: 
+24Vdc               -->     Red  
Gnd                     -->     Black   
I0.5 (A Phase)  -->     Green 
I0.6 (B Phase)  -->    Blanco

* I0.5 e I0.6 (Salidas del codificador) deben tener una resistencia pull-up a 24Vdc (se recomiendan resistencias de 4,7k). 
*Recuerde que las entradas digitales del PLC Ethernet deben permitir interrupciones! 
 


 Conexión final:



Software

Con este código, puede controlar la velocidad del paso a paso y la dirección gestionando los pulsos de aceleración de subida y bajada. 
Se han programado tres skecth diferentes.  

En este primer sktech programaremos el encoder para poder controlar la aceleración del motor paso a paso utilizando pines de interrupción del PLC basado en Arduino.
Encontraras el código a continuación:

/*

   Copyright (c) 2018 Boot&Work Corp., S.L. All rights reserved

Este programa es software libre: puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General Reducida de GNU publicada por la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o (a su elección) cualquier versión posterior.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de COMERCIALIZACIÓN o ADECUACIÓN A UN PROPÓSITO PARTICULAR.  Consulta la Licencia Pública General Reducida de GNU para más detalles.

Debería haber recibido una copia de la Licencia Pública General Reducida de GNU junto con este programa.  Si no es así, consulta <http://www.gnu.org/licenses/>.

 */

#define PRINT_COUNTER 0

#define PIN_ENCODER_A 3

#define PIN_ENCODER_B 2

#define ENCODER_PULSES_PER_REV 600

int32_t counter_a = 0;

void count_a() {

  if (digitalRead(PIN_ENCODER_B)) {

    ++counter_a;

  } else {

    --counter_a;

  }

}

////////////////////////////////////////////////////////////////////////////////////////////////////

void setup() {

  Serial.begin(9600L);

  Serial.println("stepper started");

  pinMode(PIN_ENCODER_A, INPUT);

  pinMode(PIN_ENCODER_B, INPUT);

  attachInterrupt(digitalPinToInterrupt(PIN_ENCODER_A), count_a, RISING);

}

////////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {

  static int32_t last_a = 0;

  if (counter_a != last_a) {

    last_a = counter_a;

    Serial.println(last_a);

  }

}

Este segundo código controla por software los pulsos de aceleración y desaceleración.

/*

Copyright (c) 2018 Boot&Work Corp., S.L. All rights reserved

Este programa es software libre: puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General Reducida de GNU publicada por la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o (a su elección) cualquier versión posterior.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de COMERCIALIZACIÓN o ADECUACIÓN A UN PROPÓSITO PARTICULAR.  Consulta la Licencia Pública General Reducida de GNU para más detalles.

Debería haber recibido una copia de la Licencia Pública General Reducida de GNU junto con este programa.  Si no es así, consulta <http://www.gnu.org/licenses/>.

 */


#define PIN_STEPPER_PUL Q0_0

#define PIN_STEPPER_DIR Q0_1

#define PIN_STEPPER_EN  Q0_2

#define STEPPER_PULSES_PER_REV 400UL

#define FREQ (3000UL) // Hz

#define PERIOD (1000UL * 1000UL / (FREQ)) // us

#define NUM_REVOLUTIONS 10UL

#define STEPPER_STEPS ((NUM_REVOLUTIONS) * (STEPPER_PULSES_PER_REV))

#define RAMP_LEN 8

#define pulse(T) 

////////////////////////////////////////////////////////////////////////////////////////////////////

void setup() {

  pinMode(PIN_STEPPER_DIR, OUTPUT);

  pinMode(PIN_STEPPER_PUL, OUTPUT);

  pinMode(PIN_STEPPER_EN, OUTPUT);

  digitalWrite(PIN_STEPPER_DIR, HIGH);

  digitalWrite(PIN_STEPPER_EN, LOW);

}

////////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {

  for (uint32_t i = RAMP_LEN; i > 0; --i) {

    pulse(PERIOD << i);

  }

  for (uint32_t i = 0; i < STEPPER_STEPS - (2 * RAMP_LEN); ++i) {

    pulse(PERIOD);

  }

  for (uint32_t i = 0; i < RAMP_LEN; ++i) {

    pulse(PERIOD << (i + 1));

  }

  delay(1000);

}



Finally, this third sketch also controls by software the treatment of acceleration and deceleration pulses, but in this case the pulses.h library is used.

* IMPORTANTE: Cuando se utiliza este boceto, las conexiones al PLC Ethernet deben modificarse. Vamos a utilizar el pin3 del MDuino en lugar de Q0.0 para la entrada PUL del controlador (Esta modificación nos permite utilizar el temporizador 3 del Arduino Mega).

Si hace clic en este enlace, encontrará una guía de la biblioteca pulses.h library.

/*

Copyright (c) 2018 Boot&Work Corp., S.L. All rights reserved

Este programa es software libre: puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General Reducida de GNU publicada por la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o (a su elección) cualquier versión posterior.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de COMERCIALIZACIÓN o ADECUACIÓN A UN PROPÓSITO PARTICULAR.  Consulta la Licencia Pública General Reducida de GNU para más detalles.

Debería haber recibido una copia de la Licencia Pública General Reducida de GNU junto con este programa.  Si no es así, consulta <http://www.gnu.org/licenses/>.

 */


#define PIN_STEPPER_PUL 3

#define PIN_STEPPER_DIR Q0_1

#define PIN_STEPPER_ENA Q0_2

#define STEPPER_PULSES_PER_REV 400UL


#define FREQ (3000UL) // Hz

#define NUM_REVOLUTIONS 10UL

#define STEPPER_STEPS ((NUM_REVOLUTIONS) * (STEPPER_PULSES_PER_REV))


#include <Pulses.h>


volatile uint32_t stepsCnt = STEPPER_STEPS;

ISR(TIMER3_COMPA_vect) {

  if (stepsCnt) {

    --stepsCnt;

    if (stepsCnt == 0UL) {

      stopPulses(PIN_STEPPER_PUL);

    }

  }

}


////////////////////////////////////////////////////////////////////////////////////////////////////

void setup() {

  pinMode(PIN_STEPPER_DIR, OUTPUT);

  pinMode(PIN_STEPPER_PUL, OUTPUT);

  pinMode(PIN_STEPPER_ENA, OUTPUT);


  digitalWrite(PIN_STEPPER_DIR, HIGH);

  digitalWrite(PIN_STEPPER_ENA, LOW);


  // It depends on the PIN_STEPPER_PUL

  TIMSK3 |= 1 << OCIE3A;


  startPulses(PIN_STEPPER_PUL, FREQ, 3);

}


////////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {


}

Buscar en nuestro blog

Control de velocidad del motor paso a paso usando un PLC basado en Arduino y un codificador rotatorio
Boot & Work Corp. S.L., Support Team 21 de diciembre de 2018
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>