Control PID con lectura de Encoder en canal A y B.

Caracterización de un Motor de DC para ingresarle un control PI, PD, PID, etc.

Diagrama de bloques con valores para el control PID

Diagrama de bloques con valores para el control PID

Video del desarrollo del proyecto

 

Programa del Arduino para leer el encoder en su velocidad debido a los pulsos originados por el canal A o el canal B, no da dirección solo a que velocidad está.

//Lee los pulsos del encoder///Solo Copia y pega

//El encoder tiene 63 pulsos por revolucion deacuerdo a las hojas de especificaciones

//Declaramos las variables del Encoder//
int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;
//Fin de las declaraciones del encoder//

//Declaramos las variables de la función millis()//

long previousMillis = 0; // almacenará la última vez que el estado se actualizó
// la siguiente variable es del tipo long por que el tiempo medido en
// milisegundos supera rápidamente al número que puede ser almacenado en una
// variable del tipo int
long currentMillis;
long interval = 60000; // intervalo del muestreo (en milisegundos)
//Fin de las declaraciones de millis()//

void setup() {
pinMode (encoder0PinA,INPUT);
pinMode (encoder0PinB,INPUT);
Serial.begin (38400);
Serial.print («Iniciado … Recopilando datos»);
}

void loop() {
Lectura_del_encoder();
Rev_X_Min();
Funcion_millis();
}

void Lectura_del_encoder(){
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos–;
} else {
encoder0Pos++;
}
Serial.println («\n»);
Serial.print («Pulso No. :»);
Serial.print (encoder0Pos);
}
encoder0PinALast = n;
}

//Aplicamos la funcion millis()//
void Funcion_millis(){
// Aquí es donde pondríamos el código que debe ejecutarse durante todo el
// tiempo.

unsigned long currentMillis = millis(); // Se toma el tiempo actual
// se comprueba si el tiempo actual menos el tiempo en que el LED cambió
// de estado por última vez es mayor que el intervalo.
if (currentMillis – previousMillis > interval){
// Si se cumple la condición se guarda el nuevo tiempo
// en el que el que tiene el muestreo
previousMillis = currentMillis;
//Si ya paso un segundo lo decimos
Serial.println («\n»);
Serial.print («Tenemos un minuto»);
encoder0Pos=0;
}
}

//Aqui registramos las revoluciones por segundo//
void Rev_X_Min(){
unsigned long currentMillis = millis(); // Se toma el tiempo actual
if (currentMillis – previousMillis == interval){
float revoluciones = encoder0Pos/34;
if(revoluciones < 0){
revoluciones=revoluciones*-1;
}
Serial.println («\n»);
Serial.print («Revoluciones/Minuto = «);
Serial.print (revoluciones);
}
}

////Fin del Programa lectura del Encoder con Arduino///

 

///Programa de MatLab para el control PID////

 

clear all
close all
clc
format short
canal_serie=serial(‘COM7′,’BaudRate’,9600,’Terminator’,’CR/LF’);
fopen(canal_serie);
xlabel(‘Segundos’); ylabel(‘Datos’);title(‘Adquisicion de datos Arduino’);
grid on; hold on;
prop=line(nan,nan,’Color’,’b’,’LineWidth’,1);
dato=fscanf(canal_serie,’%f %f’,[2,1]);
clc;
disp(‘adquisicion de datos de la tarjeta arduino UNO, utilizar el sketch cap8_funciones’);
i=1;
while i<2000
dato=fscanf(canal_serie, ‘%f %f’,[2,1]);
y(i)=dato(1,1);
x(i)=dato(2,1);
set(prop,’YData’,y(1:i),’Xdata’,x(1:i));
drawnow;
i=i+1;
end
fclose(canal_serie);
delete(canal_serie);
clear canal_serie;


Realización de la función de transferencia

img_20160213_204353 img_20160213_204415 img_20160213_204426 img_20160213_204437 minimos-cuadrados-2 minimos-cuadrados-3 minimos-cuadrados-4 minimos-cuadrados

Función de transferencia en PDF

ft

Manual de control PID para Arduino

guia-de-uso-pid-para-arduino-1

Archivos carpeta completa en MEGA

Arduino, MatLab, Graficas, Excel, Etc.

https://mega.nz/#F!F4sFzIhL!vapUZ8b4Z8DREYqTZAOkeg

teacherbot-76 teacherbot-75 teacherbot-74 teacherbot-73 teacherbot-72 teacherbot-71 teacherbot-70