Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

CONTROL PID DE VELOCIDAD DE UN MOTOR DC

No description
by

Luis Angel Bastidas Cerazo

on 27 June 2014

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of CONTROL PID DE VELOCIDAD DE UN MOTOR DC

En el presente trabajo se desarrolla un Control de velocidad en lazo cerrado de un motor DC aplicando el conocido algoritmo de control PID, y la técnica PWM para el control del voltaje promedio enlç la carga.

Introducción
CONTROL PID DE VELOCIDAD DE UN MOTOR DC CON PWM
Descripción General del Sistema
Motor
Modulación de Ancho de Pulso (PWM)
Diagrama esquemático del sistema
Fuente de alimentación del circuito.
Circuito acondicionador de voltaje
Etapa de potencia
Marca: Litton
Modelo: Clifton Precision
Código: JDGH-2250-ES-1CC
Salida: 7.8 W
Voltaje: 12 V
Corriente: 0.65 A
Velocidad: 1000 rpm
Peso: 500 gramos

Sintonización de los parámetros PID
Ziegler y Nichols
Experimentalmente
Kp=0.1243
Ki=0.06215
Kd=0.06215
Kp_discreto=Kp=0.1243
Ki_discreto=(Ki*T)/2=0.0031
Kd_discreto=Kd/T=6.215

Microcontrolador
Diagrama de flujo del programa
Código fuente:




#int_TIMER1 //muestra en el display cada 0.5 segundos
void temp1s(void){
r=r*5/100;
u=u*5/100;
lcd_gotoxy(1,1);
printf(lcd_putc,"\fRef = %01.2fV",r);
printf(lcd_putc,"\nControl = %01.2fV",u);
}



//declarar variables e inicializa las variables
int16 referencia; //lectura del voltaje de referencia
int16 sensor; //lectura del voltaje del sensor
int16 control; //valor final del PWM
float Kp_d=0.1243; //Kp_discreto=Kp
float Ki_d=0.0031; //Ki_discreto=Ki*T/2 ,T=0.01s
float Kd_d=6.215; //Kd_discreto=Kd/T
float r,e,p,i,d,y,u,i0=0.0,e0=0.0; //variables para el control PID
float max=100.0,min=0.0; //limites maximo y minimo de control
void main()
{
//configuracion de los timers, el modulo CCP, conversor ADC
lcd_init();
setup_timer_2(t2_div_by_4,24,1); //frecuencia del PWM de 40KHz, el rango del PWM es de 0 a 100
setup_ccp1(ccp_pwm); //módulo CCP a modo PWM
setup_adc_ports(all_analog); //puerto A analógico
setup_adc(ADC_CLOCK_INTERNAL); //reloj convertidor AD interno
set_pwm1_duty(0);
setup_timer_0(RTCC_internal|RTCC_DIV_64);//para el cálculo del PID cada 10ms
set_timer0(100);
setup_timer_1(T1_internal|T1_DIV_BY_8); //para el displayado del LCD cada 0.5 segundos
set_timer1(3036);
enable_interrupts(int_timer0);
enable_interrupts(int_timer1);
enable_interrupts(global);

while(1) //bucle infinito
{
}
}
#int_TIMER0 //realiza el cálculo de PID cada 10ms
void timer0_isr(void){
//captura de las señales analógicas
set_ADC_channel(0); //señal de referencia
delay_us(10);
referencia=read_adc();
set_ADC_channel(1); //señal del sensor
delay_us(10);
sensor=read_adc();
//cálculo del algoritmo
r=referencia*100.0/1023.0; //conversion de [0-100], debido al PWM
y=sensor*100.0/1023.0; //conversion de [0-100], debido al PWM
e=r-y; //cáclculo del errror
p=Kp_d*e; //cálculo del término proporcional
i=Ki_d*(e+e0)+i0; //cálculo del término intergral
d=Kd_d*(e-e0); //cálculo del término derivativo
u=p+i+d; //u(k)=Kp_d*e(k)+Ki_d*(e(k)+e(k-1))+i(k-1)+Kd_d*(e(k)-e(k-1))
//limitador para la señal de control de PWM
if(u>max)
{u=max;}
else
{if(u<min)
{u=min;}
}
//transferencia de la salida del PID a señal PWM
control=u;
set_pwm1_duty(control);
//gusradar las variables
i0=i;
e0=e;
}
Full transcript