Autor Tema: Cambio de giro de una máquina DC  (Leído 2022 veces)

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

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Cambio de giro de una máquina DC
« en: 15 de Noviembre de 2012, 15:46:04 »

Después de un tiempo de estar alejado de los microcontroladores y del foro, decidí volver a cacharrear un rato y pues hoy traigo el fruto del trabajo de toda una tarde. Me hice a la tarea de implementar un "variador" de velocidad de una máquina dc así como el respectivo cambio giro utilizando un puente H con transistores 2n3904.

La idea era implementar el cambio de giro por medio de una interrupción externa en el terminal RB0 del PIC16F877, y variar la velocidad de la máquina utilizando el convertido A/D y el modulo CCP (en modulo PWM) del microcontrolador.

Los problemas que presenta el prototipo son los siguientes. hay que darle un pequeño impulso al eje de la máquina para que pueda arrancar y como segundo problema se esta presentado calentamiento en el circuito de fuerza (regulador 7805) del prototipo "creo que este regulador es inadecuado como fuente alimentación para esta aplicación". Por último el motor que se utilizo es una máquina que funciona en el rango de 3 a 12 V (es un motor de juguete).

Bueno adjunto la simulación en proteus 7.2  así como el respectivo código en CCS la simulación en proteus es algo lenta, si alguien de casualidad sabe como solucionar este problema se lo agradecería, cuando solucione los problemas los estaré comentando, espero que el ejemplo sirva de algo.

Saludos.   


         
Un saludo desde Pereira - Colombia

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Cambio de giro de una máquina DC
« Respuesta #1 en: 16 de Noviembre de 2012, 16:47:53 »

Revisando el código encontré un pequeño problema cuando se daba la orden de cambio de giro el problema es el siguiente

Código: [Seleccionar]
set_pwm2_duty(0);
delay_ms(1000); 

Acá hay un problema ya que el micro se queda enclavando y no responde a la orden de cambio de velocidad por lapso de 1 s. El problema se soluciona condicionando la orden de cambio de giro tal y como se muestra a continuación.
 
Código: [Seleccionar]
if(freno == 2)
          {
           set_pwm2_duty(0);
           delay_ms(1000);          // Espero a que se pare el motor       
          }
 

El código completo con las respectivas modificaciones se muestra a continuación.

Código: [Seleccionar]
#if defined(__PCM__)
#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock = 4000000)
//#define use_portd_lcd TRUE
#use standard_io(c)
#use standard_io(b)
#use standard_io(d)

int conta,bandera;

#int_ext

void flanco_externo()
 {
  conta = conta + 1;
  if(conta == 1)
   {
     ext_int_edge(L_TO_H);
   }
  if(conta ==2)
   {
     conta = 0;
     ext_int_edge(H_TO_L);
     bandera = bandera + 1;
     if(bandera>2)
      {
       bandera = 1;
      }
   }
 }

void main()
 {
   int freno;
   long cutil;
   cutil = 0;
   conta = 0;
   bandera = 0;
   freno = 0;
   set_tris_b(0xff);
   set_tris_c(0xF9);
   enable_interrupts(global);
   enable_interrupts(int_ext);
   ext_int_edge(H_TO_L);
   setup_timer_2(T2_DIV_BY_1, 255, 1);
   setup_ccp1(ccp_pwm);
   setup_ccp2(ccp_pwm);
   setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
   setup_adc(ADC_CLOCK_DIV_32);
   set_pwm2_duty(0);
   set_pwm1_duty(0);
   do
     {
       if (bandera == 1)
        {
         if(freno == 2)
          {
           set_pwm2_duty(0);
           delay_ms(1000);          // Espero a que se pare el motor       
          }
         set_adc_channel(0);
         delay_ms(10);
         cutil = read_adc();
         delay_ms(10);
         set_pwm1_duty(cutil);
         set_pwm2_duty(0);
         freno = 1;
        }
      if(bandera == 2)
        {
         if(freno == 1)
          {
           set_pwm1_duty(0);
           delay_ms(1000);         // Espero a que se pare el motor
          }
          set_adc_channel(0);
          delay_ms(10);
          cutil = read_adc();
          delay_ms(10);
          set_pwm2_duty(cutil);
          set_pwm1_duty(0);
          freno = 2;
        }
     }
   while(true);
 }
Un saludo desde Pereira - Colombia


 

anything