Caracterización de un Motor de DC para ingresarle un control PI, PD, PID, etc.
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
Función de transferencia en PDF
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