Busca en nuestro Blog. Encontrarás múltiples aplicaciones, soluciones, ejemplos de código. Navega utilizando la nube de etiquetas o busca utilizando criterios específicos

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

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: 
LPD3806 Rotray Encoder >>
Microstep Driver TB6600 9 ~ 42V DC 4A:
Driver Microstep TB6600 >>
Pulses.h (Tools40 library):
Pulses Library - Github Repository >>
Industrial Shields boards:
Cómo utilizar los pines de mapeo de las placas de Industrial Shields 
4,7 KΩ Resistors: 
4K7 Pull-up resistor >>


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 giratorio LDP3806 está compuesto por un disco de cuadratura y un módulo 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. 

Conexiónes


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:
Stepper motor speed control using an Arduino based PLC and a rotary encoder  Final Conection


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

   This program is free software: you can redistribute it and/or modify

   it under the terms of the GNU Lesser General Public License as published by

   the Free Software Foundation, either version 3 of the License, or

   (at your option) any later version.

   This program is distributed in the hope that it will be useful,

   but WITHOUT ANY WARRANTY; without even the implied warranty of

   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

   GNU Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public License

   along with this program.  If not, see <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

   This program is free software: you can redistribute it and/or modify

   it under the terms of the GNU Lesser General Public License as published by

   the Free Software Foundation, either version 3 of the License, or

   (at your option) any later version.

   This program is distributed in the hope that it will be useful,

   but WITHOUT ANY WARRANTY; without even the implied warranty of

   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

   GNU Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public License

   along with this program.  If not, see <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) { \

  digitalWrite(PIN_STEPPER_PUL, HIGH); \

  delayMicroseconds((T) / 2); \

  digitalWrite(PIN_STEPPER_PUL, LOW); \

  delayMicroseconds((T) / 2); \

}

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

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);

}



Por último, este tercer sketch también controla por software el tratamiento de los pulsos de aceleración y desaceleración, pero en este caso se utiliza la biblioteca pulses.h disponible en el repositorio Tools40.

* 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


   This program is free software: you can redistribute it and/or modify

   it under the terms of the GNU Lesser General Public License as published by

   the Free Software Foundation, either version 3 of the License, or

   (at your option) any later version.


   This program is distributed in the hope that it will be useful,

   but WITHOUT ANY WARRANTY; without even the implied warranty of

   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

   GNU Lesser General Public License for more details.


   You should have received a copy of the GNU Lesser General Public License

   along with this program.  If not, see <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() {


}

¿Quieres más información?

Con la tecnología Open Source, puedes ejecutar tus propias instalaciones.

Rellena el formulario y contactaremos contigo lo más pronto posible.

Enviar  Por favor, completa el formulario correctamente.