Вы находитесь на странице: 1из 3

/*tux(Taller de electronica),PI para controlar el voltaje en la carga

entre 1.1 y 15 volt, los valores se ingresan como milivolt*100 es decir para 5 v
olt se escribe 50.
los valores de 1 al 5 crea una referencia variable de distintas frecuencias y co
n limites designados por usuario
*/
float k1,k2; // se declaran variables para los valores de las constates del PI
.
float t2,t3;// declaracion de varaibles utilizadas para generear la fucnion d
e referencia.
float volts,volti,c,a,z,sensor = A0;// seleccion del puerto de obtencion de in
formacion del voltaje sensado.
float eV,eV_0;// variables de error de voltaje y su valor anterior.
int pwm = 9;// seleccion de puerto de salida de la seal de control PWM.
float rV,yV,y;// rV, hace referencia al valor analogo del voltaje, yV al valor
analogo del valor se voltaje sensado, que esta en la misma escala que rV. e y c
orresponde dierectamente al valor sensado.
float Umax,Umin;// varaibles que corresponden a los limites que puede alcanzar
el valor de sa seal de control.
float u,ut; // valor de la seal de control y su valor anterior.
double x , volt,rs,ri;// x, es el caracter que se introduce mediante el teclad
o, y volt, hace referencia al valor de voltaje deseado seteado por el usuario.
float set,inter,frec,setp;// set: es el valor de referencia analogo que se obt
iene mediante teclado, inter: es el valor de intervalo en milisegundos para esta
blecer la frecuencia de cambio de la funcion de referencia. frec: corresponde a
la frecuencia de la funcion de referencia. setp: corresponde a el valor de setpo
int ya sea ingresado por teclado o por la fucnion de referencia.


void setup() {
TCCR1A = 0x00; // seleccion del contador.
TCCR1B = 0x12; // prescaler = 8.
ICR1 = 50; // valor analogWrite
Serial.begin(9600);
}
void loop() {

unsigned long t = millis();// esta variable es utilisada para contar el tiempo
nesesario para el cambio de referencia en la funcion del segundo ejercicio.
/* k11=0.1;
k21=0.5;*/
Umin=1;
Umax=50;


eV_0=eV; //actualiza la variable de error anterior.
y = analogRead(sensor);// lee la variable del sensor en el canal anlogo digital.
yV= (y/1024)*50;// escala el valor leido en y, en uno homologo al rango del setp
oint.
if(Serial.available()>0){
// analogWrite(9,yV);
x = Serial.parseInt();
if(x>10){// el valor 49 corresponde a la tecla "1", por lo que al apretar esta t
ecla ocurre lo siguinete.
set=2*x/10;// le asignamos un valor la variable set, el cual corresponde a la
referencia analoga del voltaje deseado.
volt=x/10;// se asigan un valor al voltaje de salida deseado para ser mostrado
en pantalla.
inter=0;// nos aseguramos que el valor e inter regrese a "0" para que mas adel
ante no tome esa funcion.
k1=0.1;
k2=0.1;
}
/////////////////////////////////////////////////////////////// funcion de refe
rencia///////////////////////////
if(x==1){ // 55 corresponde a la tecla "8" por lo que con esa tecla asignamos un
valor de en este caso 25 a inter, lo cual modifica la frecuencia de cambio de l
a referencia.
inter=25; // este numero "25" hace referencia a tiempo en Milisegundos.
frec=20; // hace referencia a la frecuencia de las referencias.
c=1;
k1=454.5;
k2=0.5;
}
if(x==2){
inter=10;// 50 Hz
frec=50;
c=1;
k1=454.5;
k2=0.5;
}
if(x==3){
inter=200;//2,5
frec=2,5;
c=1;
k1=454.5;
k2=0.5;
}
if(x==4){
inter=40;//12.5 Hz
frec=12,5;
c=1;
k1=454.5;
k2=0.5;
}
if(inter==0){
Serial.println("volt:");
Serial.println(volt);
}
else{
if(c>0){
Serial.println("frecuencia:");
Serial.println(frec);
}
}
if(c>0){
Serial.println("ingrese Limite de voltaje inferior: ");
delay(300);
a=Serial.parseInt();
Serial.print("inferior: ");
volti=a/10;
ri=2*a/10;
Serial.println(volti);
Serial.println("ingrese Limite de voltaje superior: ");
delay(300);
z=Serial.parseInt();
Serial.print("superior:");
volts=z/10;
rs=2*z/10;
Serial.println(volts);
c=0;
}
}
int intervalo = inter;//25 para lograr 20Hz
if(t - t2 > intervalo) {//al comenzar t2=0, y t, toma el valor del tiempo de fun
cionamiento del micro, si esa diferencia es mayor a 25 milisegundos, entnces:
t2 = t; // se iguala t2 a t para la proxima operacion.
if(t3==rs){// cuando t3 vale 19 este cambia por 9.
t3=ri;
}
else{
(t3=rs);// al comensar t3 vale 0 por ende toma el valor de 19 y asi alterna
con la frecuencia que se ejecuta esta condicion.
}
}
if(inter==0){// con los valores de las teclas del 1-6, indicamos que inter lleva
el valor de "0", por ende setp=set para hacer referenca a los valores indicados
desde ese metodo.
setp=set;
}
else {
setp=t3; // de lo contrario, cuando le asignamos un valor distinto a inter,
entonces setp toma el valor de t3 para cambiar en conjunto con esta funcion cre
ada.
}
rV=setp;//rV toma siempre el valor de setp.
eV=rV-yV;// esto corresponde ya al codigo del PI, con el cual en esta parte se v
e el error actualmente existente entre la referencia y el valor sensado.
u=ut+k1*eV+k2*eV_0; // algortimo del PID discreto
if(u>=Umax){// si es que el valor de u de control calculado supera el Umax def
inido.
u=Umax;// este toma el valor de Umax definido.
}
if(u<=Umin){// si es que el resultado del valor de u de control es menor a Umi
n, entonces u de control.
u=Umin;//toma el valor de Umin.
}
analogWrite(pwm,u); // escribe en sistema digital anlogo.
ut=u;// actualiza el valor de u anterior.
}

Вам также может понравиться