Autor Tema: Ayuda con PWM con 18F4550  (Leído 3096 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado bahiarca

  • PIC10
  • *
  • Mensajes: 11
Ayuda con PWM con 18F4550
« en: 11 de Septiembre de 2012, 17:46:26 »
Alguien que me pueda explicar por que no me anda el CCP2, con el 1 no tengo problema pero el otro no lo puedo hacer andar. El codigo hace otras cosas que no importan mucho ahora el problema que tengo es que no me anda el segundo canal de PWM.







Código: [Seleccionar]

/* Programa de PWM y comunicacion RS-232
Rodriguez Altamirano Jesus Abel
*/
#include <18F4550.h>
#device adc=10


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES INTHS                    //Internal Oscillator, HS used by USB
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV43                   //Brownout reset at 4.3V
#FUSES PUT                      //Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1                     //No PLL PreScaler

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

int x=0, y=0,z=0,a1=0,a2=0,ciclo2=0;
float read1=0,temp=0,ciclo=0,porc=0,dc2=0;
long dc=0,pulso=0,pulso2=0;
int1 a=0,b=0,c=0,n=0,cambio=0;

#int_TIMER0
void TIMER0_isr()   //timer en cada segundo
{

   set_adc_channel(0);  //lectura del convertidor analogo digital
   read1=read_adc();   
   
   
   pulso2=pulso*60;   //esto es para sacar las revoluciones por minuto,cada segundo
   pulso=0;           //se reinicia para tener una lectura correcta
   a=1;           //esta variable es para que en el while infinito mande los datos por   
                  //tx cada segundo solamente
   if(y==1&&b==0) //este if sirve para el encendido, b es para limitarlo a 15seg y
   {              //si es 1 es encendido
      x+=1;          //cada segundo se incrementa en 1
     
      if(x<15)       //al llegar a los 15 segundos el ciclo de trabajo es igual al 50%
      {
         dc+=34.1;      //dc y dc2 son del mismo valor siempre pero son de diferente tipo de
         dc2+=34.1;     //variable, una long y otra float
                        //este incremento es para que en el encendido de 15seg se valla incrementando   
                        //la velocidad en forma de rampa
      }
      else
      {
         dc=511.5;     //en caso de que pasen los 15seg el ciclo de trabajo es igual al 50% 
         dc2=511.5;
         
         b=1;          //b es la variable que nos permite salir del ciclo de encendido
      }
   }
   
   if(c==1)      //esta parte es para el apagado     
   {
      if(n==0)     
      {
         porc=dc/15;   //esto es para saber que porcentaje se decrementa cada segundo durante el 
         n=1;          //apagado del motor
      }
         
      z+=1;          //z es para contar los 15seg de apagado
      dc-=porc;      //es el decremento que hace
      dc2-=porc;
         
      if(z>=15)      //ya que pasaron los 15seg del apagado se reinician todas las variables
      {              //para asi poder volverla a prender en forma de rampa
         y=0;
         b=0;
         z=0;
         dc=0;
         dc2=0;
         ciclo=0;
         c=0;
         x=0;
         porc=0;
         n=0;
      }
   }
}


#int_TIMER1
void TIMER1_isr()
{


}

#int_EXT //interrupcion externa para encendido y apagado
void EXT_isr()
{

   y=1;
   
   if(b==1)
      y+=1;
   
   if(b==1&&y==2)
   {
      c=1;
   }   
   
}

#int_EXT1  //incremento
void EXT1_isr()
{
   ciclo2=ciclo;
   if(b==1&&y==1) //solo si ya alcanzo el 50% del ciclo de trabajo
   {
   
      if(ciclo<90)
      {
         dc+=51.15;     //aumenta en 5% 
         dc2+=51.15;     
      }
     
      if(ciclo2>=90&&b==1&&y==1) //limite maximo del ciclo de trabajo
         ciclo=90;     
   }   
   
}

#int_EXT2   //decremento
void EXT2_isr()
{
   ciclo2=ciclo;
   if(b==1&&y==1)  //solo si ya alcanzo el 50%
   {
      if(ciclo>30)     //decrementa en 5%
      {
         dc-=51.15;
         dc2-=51.15;
         }
     
      if(ciclo2<=30&&b==1&&y==1)  //limite menor del 30%
      {
         ciclo=30;
         dc=306.9;
         dc2=306.9;
      }
     
   }
}


#define LCD_TYPE 2
#include <lcd.c>

void main()
{
   lcd_init();     


   setup_adc_ports(AN0_TO_AN1|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_8);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_16,255,1);  // Perido de la señal PWM
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   //setup_ccp1(CCP_PWM_FULL_BRIDGE|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
   
   setup_ccp1(ccp_pwm);
   setup_ccp2(ccp_pwm);
   
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT1);
   enable_interrupts(INT_EXT2);
   enable_interrupts(GLOBAL);
   setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);

   // TODO: USER CODE!!
   
set_tris_b(0xf7);
#use fixed_io(a_outputs=PIN_A2, PIN_A3)    /*para utilizar solo unos pines del
puerto a como salidas*/

while(TRUE)
{

if(input(pin_b7)&&cambio==0)  //contador de cambios de estados para contar las rpm
{
   pulso+=1;
   cambio=1;
}

if(!input(pin_b7)&&cambio==1)//con la variable cambio se detecta el cambio de estado
 //y asi sacamos las rpm
{
   cambio=0;
}


ciclo=dc2/10.23;    //para saber a cuanto equivale cada 1%
a1=temp;
a2=ciclo;

if(a==1)        //se hace 1 en el timer interno
{
   printf("Temp %i Rpm %lu Ciclo %i \n\r",a1,pulso2,a2);   //manda datos por tx
   a=0;                                                    //la iguala a cero para esperar a que pase un segundo mas
}


//TEMPERATURA
lcd_gotoxy(1,1);
lcd_putc("T:");

temp=((read1*0.0048875855327468))*100;  //lectura del adc de la temperatura

lcd_gotoxy(3,1);
printf(lcd_putc,"%i \xdfC %lu rpm        \n %i%%    ",a1,pulso2,a2);/*impresion \xdf es igual al º
de temperatura, rpm y ciclo de trabajo*/
//PWM


set_pwm1_duty(dc);  //porciento del ciclo de trabajo
set_pwm2_duty(dc);


}

}



Codigo + Proteus


Perdon si postie mal pero es la primera vez que lo hago.

Aca dejo un archivo comprimido con todo codigo y simulacion en proteus! espero que me puedan ayudar!!


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con PWM con 18F4550
« Respuesta #1 en: 11 de Septiembre de 2012, 18:30:15 »
En la configuración del fusible asegurarte de colocar PWM2 en C1 o en B3: CCP2B3,CCP2C1


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado bahiarca

  • PIC10
  • *
  • Mensajes: 11
Re: Ayuda con PWM con 18F4550
« Respuesta #2 en: 12 de Septiembre de 2012, 01:36:28 »
Suky muchisimas gracias!! ahora si anda!!


 

anything