Autor Tema: duda con arranque en pwm  (Leído 1576 veces)

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

Desconectado radiomanopapachango

  • PIC10
  • *
  • Mensajes: 1
duda con arranque en pwm
« en: 28 de Marzo de 2007, 14:31:08 »
  Hola señores del todopic:
  Tengo una duda que para ustedes ha de ser simple, trataré de explicarla lo mejor que pueda. Bueno quiero arrancar un motor de cd desde el reposo hasta su velocidad nominal en un tiempo que puedo escoger de una botonera (1, 2, 3,.... etc segundos (variable tacel)), y además deceo que muestre por lcd el porcentaje del ciclo de trabajo a medida que este avanza (variable x). Tengo pic16f877a, Fosc=20M, Fpwm=15K, TMR2=4, PR2=1, estos valores arrojan un duty max de 333 (set_pwm1_duty(variable que va desde 0 a 333)). El tiempo en que este duty avanza de 0 a 333 de 1 en 1 es: delay=(tacel*1000)/333; (el 1000 es para ocupar luego delay_ms(delay)). El porcentaje viene dado por x=(dutyb*100)/333;. La cosa es que por pantalla solo obtengo desde 0 hasta 76% ?????? he hecho un monton de modificaciones que ya no me acuerdo. Pero si alguien me pudiera ayudar estaría muy agradecido, el programa es (aunque lo que importa esta en la función <directa.c> que la puse mas abajo y es mas cortita):

#include <16f877A.h>
#use delay(clock=20000000,RESTART_WDT)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC)
#include <display.c>
#include <stop.c>
#include <tiempo_acel.c>
#include <giro.c>
#include <inversa.c>
#include <directa.c>
#use fast_io(A)
#use fast_io(B)
#byte port_a = 5
#byte port_b = 6
#byte port_c = 7

int inicio,sentidogiro,finalizar,start,b4,tacel,in,arr,e;

main()
{
   lcd_init();
   lcd_gotoxy(1,1);
   lcd_enviar(LCD_COMANDO, LCD_HOME);
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(0);
   set_pwm2_duty(0);
   setup_adc_ports(RA0_ANALOG);
   set_tris_a(0xFF);
   set_tris_b(0xFF);
   set_tris_c(0x00);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   inicio=0;
   start=0;
   sentidogiro=0;
   finalizar=0;
   izq=0;
   der=0;
   b4=0;


   setup_timer_2(T2_DIV_BY_4,83,1);

   while(inicio==0)
   {
      lcd_gotoxy(1,1);
      lcd_putc("       VER  MENU      \n");
      if(input(PIN_B4))
      {
        in=1;
        while(in==1)
        {
          lcd_putc("\f");
          delay_ms(100);

          lcd_gotoxy(1,1);
          lcd_putc("1. Giro:            ");
          giro(key1);
          sentidogiro=key1;

          lcd_gotoxy(1,2);
          lcd_putc("2. Arranque:     s");
          tiempo_acel(key2);
          tacel=key2;

          in=0;
        }
         inicio=1;
      }
  }


   while(start==0)
   {
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    delay_ms(100);

      if(sentidogiro==1){
         printf(lcd_putc,"Arranque Directo en %2us\n",key2);
         }
       else{
         printf(lcd_putc,"Arranque Inverso en %2us\n",key2);
         }

         e=0;
         while(e==0){
         lcd_gotoxy(1,2);
         lcd_putc("      ARRANCAR");
            if(input(PIN_B7)){

               if(sentidogiro==1)
               {
                delay_ms(100);
                directa(tacel);
                izq=1;
               }
               else
               {
                delay_ms(100);
                inversa(tacel);
                der=1;
               }

             e=1;
             start=1;
            }
         }
   }

}




   Y la funcion que me tiene aproblemado es:

 



#byte port_a = 5
#byte port_b = 6
#byte port_c = 7


int t,i,medicion,delay,duty,dutyb,x;

 

int directa(tacel)
{
  dutyb=0;
  t=1;

  lcd_putc("\f");
  lcd_gotoxy(1,1);
  lcd_putc("Ciclo Trabajo =     %");
  delay=(tacel*1000)/333;   //

  while(t==1)
  {
   set_adc_channel(0);
   delay_us(2);
   duty=read_adc();
   
   
    for(i=0;i<duty;i++)
    {
     dutyb++;
     x=(dutyb*100)/333;
     delay_ms(delay);
     set_pwm1_duty(dutyb);
     lcd_gotoxy(17,1);
     printf(lcd_putc,"%3u",x);
    }
    t=0;
  }
}



  Estoy hace poco en esto de la programación de pics perdón si el programa es muy redundante. Saludos desde el decierto de Chile , uf!