Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

29/05/2011 #1


Ayudaa con la programacion del pic 16f877a para pendulo invertido
Que tal estoy haciendo un proyecto de un pendulo invertido y para realizarlo estoy utilizando la estructura de una impresora y un potenciometro donde va a ir acoplado el pendulo tambien estoy utilizando un pic16f877a un amigo me paso un programa en ccs pero me dijo q tenia algunos errores lo compile y no me marca errores y al momento de simularlo y medir con el osciloscopio las salidas del PWM(para variar la velocidad del motor) no me da ninguna señal espero me puedan ayudar ya q soy principiante en lo de la programacion de antemano gracias

El programa es el siguiente:
//PROGRAMA PARA PENDULO INVERTIDO
#include <16F877a.h>
#device adc=10
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT,NO DEBUG
#include <lcd.c>

int start=0;
int kp,Ti,Td;
float T=0.001;
int16 valor;
int16 control; //valor del PWM
float a,b,c;
float rT,eT,iT,dT,yT,uT;
float iT0=0.0;
float eT0=0.0; //variables de ecuaciones
float max=1020.0;
float min=-1020.0; //límites máximo y mínimo de control.

#INT_EXT

void inicializacion(){
set_adc_channel(0);
delay_us(150);
rT=5.0*(read_adc())/1024.0;

a=500;
b=1000;
c=1;
start=1;
control=0;
output_high(PIN_C0);
setup_ccp1(ccp_pwm); //Módulo CCP a modo PWM
setup_ccp2(ccp_pwm); //Módulo CCP a modo PWM
}

void main ( )
{
rt=a=b=c=0;
set_tris_c(0);
set_tris_b(255);
set_tris_b(255);
setup_timer_2(t2_div_by_16,255,1); //periodo de la señal PWM a 1ms
setup_ccp1(ccp_off); //Módulo CCP a modo PWM
setup_ccp2(ccp_off); //Módulo CCP a modo PWM
setup_adc_ports(all_analog); //Puerto A analógico
setup_adc(ADC_CLOCK_INTERNAL); //reloj convertidor AD interno
ext_int_edge( H_TO_L );
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
lcd_init();
output_c(0);
set_pwm1_duty(0);
set_pwm2_duty(0);

while(1){
while(start==1){
set_adc_channel(0);
delay_us(50);
valor=read_adc(); //Lectura adc posicion angular

yT= 5.0*valor/1024.0; //posicion angular actual

lcd_gotoxy(1,1);
printf(lcd_putc,"%4.2g %4.2g %4.2g",a,b,c);
lcd_gotoxy(1,2);
printf(lcd_putc,"%lu %4.2g %4.2g",control,eT,iT);

eT=rT-yT; //Cálculo error
iT=b*eT+iT0; //Cálculo del término integral
if(iT>5000){iT=5000;}
if(iT<-5000){iT=-5000;}
dT=c*(eT-eT0); //Cálculo del término derivativo
uT=iT+a*eT+dT; //Cálculo de la salida PID

if(uT<0){uT=(-1)*uT;}

if (uT>max) { //Salida PID si es mayor que el MAX
uT=max;}
else {
if (uT<min){ //Salida PID si es menor que el MIN
uT=min;}
}
control=uT; //Transferencia de salida PID a señal PWM

if(eT>0)
{set_pwm1_duty(control);
set_pwm2_duty(0);}
if(eT==0)
{uT=iT=eT=0;
set_pwm1_duty(0);
set_pwm2_duty(0);}
if(eT<0)
{set_pwm2_duty(control);
set_pwm1_duty(0);}

iT0=iT; //Guardar variables
eT0=eT;

}
}
}
02/06/2011 #2

Avatar de pepechip

mira este post
Construcción de un Péndulo Invertido
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.