Documentos de Académico
Documentos de Profesional
Documentos de Cultura
OBJETIVO:
Controlar el movimiento de un motor utilizando un encoder por medio de
interrupciones utilizando Arduino.
INTRODUCCIÓN:
Existen diferentes tipos de encoders, su función principal es generar pulsos para que
sean la señal de control para un sistema digital.
TRABAJO PREVIO.
1. Investigar la relación de engranaje en un motorreductor con encoder
2. Investigar como se puede calcular las revoluciones por minuto (rpm) utilizando
las señales del encoder
3. Analizar los programas que están en la tabla 2.1, 2.2 y 2.3
EQUIPO DE LABORATORIO
1 Fuente
1 osciloscopio
DESARROLLO:
1. Realice las conexiones del encoder del motor al Arduino (figura 2.1) conforme a las
hojas de datos de los motores, puede guiarse por los colores de los cables
void setup() {
Serial.begin(9600);
pinMode(ENCA,INPUT);
pinMode(ENCB,INPUT);
}
void loop() {
int a = digitalRead(ENCA);
int b = digitalRead(ENCB);
Serial.print(a*5);
Serial.print(" ");
Serial.print(b*5);
Serial.println();
delay(10);
}
Serial.println(pos);
//delay(500);
}
void readEncoder(){
int b = digitalRead(ENCB);
if(b > 0){
posi++;
}
else{
posi--;
}
}
7. Abra el monitor serial, mueva el disco magnético en un sentido y verifique que aumenta
el contador o disminuye si se mueve en sentido contrario, obtenga evidencias
8. Realice las conexiones del encoder del motor al Arduino (figura 2.2) conforme a las
hojas de datos de los motores, puede guiarse por los colores de los cables
Figura 2.2 Conexiones del encoder del motorreductor con Arduino
void setup() {
Serial.begin(9600);
pinMode(ENCA,INPUT);
pinMode(ENCB,INPUT);
attachInterrupt(digitalPinToInterrupt(ENCA),readEncoder,RISING);
pinMode(PWM,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
Serial.println("target pos");
}
void loop() {
// time difference
long currT = micros();
float deltaT = ((float) (currT - prevT))/( 1.0e6 );
prevT = currT;
// error
int e = pos - target;
// derivative
float dedt = (e-eprev)/(deltaT);
// integral
eintegral = eintegral + e*deltaT;
// control signal
float u = kp*e + kd*dedt + ki*eintegral;
// motor power
float pwr = fabs(u);
if( pwr > 255 ){
pwr = 255;
}
// motor direction
int dir = 1;
if(u<0){
dir = -1;
}
Serial.print(target);
Serial.print(" ");
Serial.print(pos);
Serial.println();
//delay(100);
}
void setMotor(int dir, int pwmVal, int pwm, int in1, int in2){
analogWrite(pwm,pwmVal);
if(dir == 1){
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
}
else if(dir == -1){
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
}
else{
digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
}
}
void readEncoder(){
int b = digitalRead(ENCB);
if(b > 0){
posi++;
}
else{
posi--;
}
}
10. Identifique cual es el setpoint en el programa, para modificar el valor de pulsos donde
se desea que motor se mantenga en una posición, obtenga evidencias, trate de
realizar una perturbación para modificar la posición y compruebe que regresa a la
posición deseada, obtenga evidencias
11. Abra la herramienta serial plotter, compruebe funcionamiento
12. Realice un reset al Arduino (presione el botón de reset) y obtenga la gráfica de la
respuesta a un escalón, mida el tiempo de establecimiento.
COMENTARIOS:
REFERENCIAS
Requerida
• Manual Arduino.