Autor Tema: duda sobre configuracion del PWM  (Leído 2002 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado el-zurdo

  • PIC10
  • *
  • Mensajes: 6
duda sobre configuracion del PWM
« en: 13 de Marzo de 2007, 14:59:12 »
buenas, queria consultar si alguien sabe como configurar
el modulo PWM del pic, ya que al parecer la subrutina
TIMER2_isr() nunca funciona.A continuacion adjunto el
programa.Saludos.

void TIMER2_isr()
{
set_adc_channel(2);      //Selecciona canal 2
delay_us(26);            //Espera estabilización del canal
   valor=read_adc();
   corre=(float)valor*(5/256);
   if(corre<=0.4) ANGULO=Pendiente1*corre;
   if(0.4<corre<=3.7) ANGULO=Pendiente2*corre+oo2;
   if(3.7<corre<=3.91) ANGULO=Pendiente3*corre+oo3;
   if(3.91<corre<=4.67) ANGULO=Pendiente4*corre+oo4 ;
   if(4.67<corre<=5) ANGULO=Pendiente5*corre+oo5;
   portb=(int)ANGULO;
printf("A= %2x\n\r",ANGULO);
Error_k2 = error_k1;
Error_k1 = error_k0;
Error_k0 = REFERENCIA - ANGULO;
uk = a0*Error_k0+a1*Error_k1+a2*Error_k2+uk_anterior*Anterior;
uk_anterior= uk;

if(uk<=0){
uk=0;
}
     uk_PWM=(long int)uk;

    if(uk_PWM>=1023)  uk_PWM=1023;
    if(uk_PWM<=0)     uk_PWM=0;

set_pwm1_duty(uk_PWM);
}


void inicializar()
{
   set_tris_b(0x00);
   port_b_pullups(TRUE);
   portb=0x00;

 setup_adc(ADC_CLOCK_DIV_32);
 setup_adc_ports(ALL_ANALOG);
 set_adc_channel(0);             //selección canal 0

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);

 setup_ccp1(CCP_PWM);   //Configura CCp1 como PWM
 setup_ccp2(CCP_PWM);   //Configura CCp2 como PWM
 setup_timer_2(T2_DIV_BY_16,103,1);
 enable_interrupts(INT_TIMER2);
 enable_interrupts(GLOBAL);


}


void main()
{
   inicializar();
set_pwm1_duty(0);
   while(true)
   {
POSICION();
VELOCIDAD();

   }
}

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
Re: duda sobre configuracion del PWM
« Respuesta #1 en: 14 de Marzo de 2007, 18:17:34 »
Hola.

Yo tambien ando con un problema similar. tengo problemas al configurar el hinche PWM.

¿Es necesario poner algo en el inicio el set_pwm_duty(0)?

¿Como es que se carga inicialmente el PWM para que se produzca la interrupicion?

Salu2
"Prenden fuego y no queman nada"

Desconectado el-zurdo

  • PIC10
  • *
  • Mensajes: 6
Re: duda sobre configuracion del PWM
« Respuesta #2 en: 14 de Marzo de 2007, 22:20:58 »
buenas..me faltaba colocar #int_timer2 arriba de void TIMER2_isr.
Ese #int_timer2 es lo que le indica al compilador que la rutina que hay a continuación es la que debe usar para tratar la interrupción de timer2. Gracias Redpic y Palitroquez por avisarme.
Con respecto a lo de poner algo en set_pwm_duty no se si hace falta, pero por ahora no me funciona el modulo PWM..solo puedo adquirir y enviar a la PC. A continuacion coloco el programa realizado hasta el momento.Saludos

#include <16F873.h>
#device adc=8
#include <stdlib.h>
#include <float.h>
#include <math.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

//Definición de variables
Float Error_k2=0,Error_k1=0,Error_k0=0;
Const Float a0=0.132,a1=0.2497,a2=0.1181,REFERENCIA=1.6666;
Float ANGULO=0;
Float uk,uk_anterior,Anterior=1;
Long  uk_PWM=0;
Const Float Pendiente1=0.06603;
Const Float Pendiente2=0.03667,oo2=3.16667;
Const Float Pendiente3=0.14,oo3=-97;
Const Float Pendiente4=0.24051,oo4=-217.6075;
Const Float Pendiente5=0.1,oo5=-57;

Float corre;

#use fast_io(A)
#use fast_io(B)

//Definición de variables
Int POSI,VELOC,Vangulo,Acorr;
#byte portb=0x06

void POSICION()
{
set_adc_channel(2);      //Selecciona canal 2
delay_us(40);            //Espera estabilización del canal
POSI=read_adc();

printf("P= %2x\n\r",POSI);
}

void VELOCIDAD()
{
set_adc_channel(1);      //Selecciona canal 1
delay_us(40);            //Espera estabilización del canal
VELOC=read_adc();

printf("V= %2x\n\r",VELOC);
}

void LEEANGULO()
{
set_adc_channel(0);      //Selecciona canal 0
delay_us(40);            //Espera estabilización del canal
Vangulo=read_adc();
printf("A= %2x\n\r",Vangulo);

corre=(float)Vangulo*(5/256);
   if(corre<=0.4) ANGULO=Pendiente1*corre;
   if(0.4<corre<=3.7) ANGULO=Pendiente2*corre+oo2;
   if(3.7<corre<=3.91) ANGULO=Pendiente3*corre+oo3;
   if(3.91<corre<=4.67) ANGULO=Pendiente4*corre+oo4 ;
   if(4.67<corre<=5) ANGULO=Pendiente5*corre+oo5;

Acorr=(int)ANGULO;
printf("AC= %2x\n\r",Acorr);

Error_k2 = error_k1;
Error_k1 = error_k0;
Error_k0 = REFERENCIA - ANGULO;
uk = a0*Error_k0+a1*Error_k1+a2*Error_k2+uk_anterior*Anterior;
uk_anterior= uk;

if(uk<=0){
uk=0;
}
     uk_PWM=(long int)uk;
    if(uk_PWM>=1023)  uk_PWM=1023;
    if(uk_PWM<=0)     uk_PWM=0;
}

#int_TIMER2
void TIMER2_isr()
{
set_pwm1_duty(uk_PWM);
}
void inicializar()
{
   set_tris_b(0x00);              //Puerto B como salida
   port_b_pullups(TRUE);
   portb=0x00;                    //Limpio el puerto B.

 setup_adc(ADC_CLOCK_DIV_32);
 setup_adc_ports(ALL_ANALOG);
 set_adc_channel(0);             //selección canal 0

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   disable_interrupts(GLOBAL);
}


void main()
{
   inicializar();
   set_pwm1_duty(8);
   while(true)
   {
POSICION();
VELOCIDAD();
LEEANGULO();
   }
}

Desconectado barg

  • PIC10
  • *
  • Mensajes: 45
Re: duda sobre configuracion del PWM
« Respuesta #3 en: 23 de Marzo de 2007, 07:25:14 »
Hola!!

Sabe alguien si se puede sacar una señal PWM por otra patilla que no sean CCP1 y CCP2?

Muchas gracias

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: duda sobre configuracion del PWM
« Respuesta #4 en: 24 de Marzo de 2007, 07:54:59 »
El data sheet del micro te indica cuales son los pines fijos de salida del módulo CCPx, creo recordar, que en los PIC18, te da la opción de elegir el pin de salida del módulo CCP2 a un pin del puertoB (que no recuerdo cual es ahora) en vez del RC5.

La otra oipción es hacerlo por software, ahí ya usas el pin que quieras, o usar un pic que tenga gran cantidad de módulos PWM que los hay (son especializados en motores).


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte


 

anything