Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CONTROL CLÁSICO
3. MATERIALES
control PID posee tres parámetros (Kp, ti, td) correspondientes a la ganancia proporcional,
tiempo integral y tiempo derivativo respectivamente
kp=40,ki=5,kd=20;
Para poderlo llevar al mundo digital tenemos que discretizarlo mediante la transformada Z.
5.1 Elaborar el siguiente circuito usando un software de simulación tal como Proteus u otro (4 ptos)
#define pwm_pin 3
#define rpm_pin 2
unsigned int codigo;
char texto[20];
const byte interruptPin = 2;
unsigned long contador,micros1;
char flag_cero=0;
float frecuencia;
float rpm;
//variables pid
//float kp=40,ki=5,kd=20;
float kp=15,ki=1,kd=0;
float salida;
float error,up,ui=0.0,ui_=0.0,error_=0.0,ud,ut;
float set_point=0;
//Calculando el error
error=set_point-pid_in;
up=kp*error;
ui=ui_ + (ki*t_muestreo*error);
ud=kd*(error-error_)/t_muestreo;
ut=up+ui+ud;
if (ut>max_x) ut=max_x;
if (ut<min_x) ut=min_x;
ui_=ui;
error_=error;
void interrupcion()
{
contador=read_tmr1();
write_tmr1(0);
flag_cero=1;
void setup()
{
// put your setup code here, to run once:
// put your setup code here, to run once:
pinMode(pwm_pin,OUTPUT);
pinMode(rpm_pin,INPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), interrupcion, RISING);
Serial.begin(19200);
Serial.println("INICIANDO");
analogWrite(pwm_pin,0);
//Configura registroA
TCCR1A=0;
//configura registroB
TCCR1B=0;
TCCR1B=0b010;// Configura el preescaldro a 8
write_tmr1(0);
sbi(TIFR1,TOV1); // pone un uno para limpiar bandera de desborde
void loop() {
// put your main code here, to run repeatedly:
codigo=analogRead(0);
analogWrite(pwm_pin,codigo>>2);
// se lee la frecuencia
if (flag_cero!=0) frecuencia=(16000000/(8*contador)); //16.0 ES EL CRISTAL DE LA ARDUINO
8 es el preescaldor
// else frecuencia=0;
flag_cero=0;
//rpm=frecuencia*60.0;
pid(frecuencia);
salida=ut;
analogWrite(pwm_pin,ut);
floattostr_(set_point,texto,2);
Serial.print("SP=") ;
Serial.print(texto);
Serial.print("/");
floattostr_(frecuencia,texto,2);
Serial.print("RPM=") ;
Serial.print(texto);
Serial.println("/");
delay(80);
CONTROL PID