Autor Tema: Duda: control de motor dc con pwm y led rgb  (Leído 1449 veces)

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

Desconectado Emiliano220

  • PIC10
  • *
  • Mensajes: 1
Duda: control de motor dc con pwm y led rgb
« en: 13 de Octubre de 2021, 17:02:01 »
Acaba de crear mi cuenta, nose si si es este el apartado correcto...
Algunos concejos de programación que me puedan dar? hacer funciones es lo primero que me viene a la mente que lo podría hacer mas cómodo pero siempre se me han complicado, no me he puesto a probarlas, este es un ejercicio que hice algo rápido y no quería entretenerme mucho en algo nuevo

Son 3 botones, deben arrancar, detener y cambiar el sentido del motor con una rampa de aceleración y desaceleración de 5s, deben actuar con una sola pulsación y esperar a que termine lo anterior, si esta arrancando y se presiona el botón para detener, el motor debe llegar a la velocidad máxima en 5s y luego bajar de velocidad hasta detenerse, si se presiona el botón de cambiar de sentido antes de que termine de arrancar debe esperar a que arranque para detener el motor y luego girar en sentido contrario, al igual que si ya está en su velocidad máxima y se presiona el botón para cambiar de sentido, y el led solo debe prender de un color si gira en sentido horario, antihorario o si esta detenido

Pero tengo algunos errores que ya no pude solucionar porque los arreglaba pero movía otra cosa: el botón detener cuando el motor ya está detenido ejecuta de nuevo la condición de detener como si siguiera encendido y el botón para cambiar el sentido de giro también cuando el motor esta detenido me ejecuta el ciclo for para detener y luego para acelerar
Cree la variable inic por esos problemas, sin ella al parar comenzaba a girar de nuevo porque se cumplía la condición que puse para que inicie luego de cambiar de sentido

Muchas gracias al que pueda checar el programa, adjunto también el circuito en proteus
https://drive.google.com/file/d/134m91SNCDQRCH4UTwOY6arADcC2uHSuI/view?usp=sharing

 
* 3P3.c
(2.39 kB - descargado 128 veces)


#include <16f876.h>
#fuses XT, NOWDT
#use delay(clock = 4000000)

#use standard_io(B)
#use standard_io(C)
int16 i,j,k,l;
int paro=0,sentido=1,inic=4;
void main()
{
   setup_timer_2(T2_DIV_BY_4,249,1);
   setup_ccp1(ccp_pwm);
   setup_ccp2(ccp_pwm);
   set_pwm1_duty((int16)0);
   set_pwm2_duty((int16)0);
   output_high(pin_c3);
   for(;;){
      if(paro==1||(input(pin_b1)==1&&sentido==1&&inic==1)){
         paro=0;
         for(j=1000; j>=1; j--){
            set_pwm1_duty(j);
            delay_ms(5);
         }
         output_low(pin_c6);
         output_high(pin_c5);
      }
      if(paro==2||(input(pin_b1)==1&&sentido==2&&inic==1)){
         paro=0;
         for(l=1000; l>=1; l--){
            set_pwm2_duty(l);
            delay_ms(5);
         }
         output_low(pin_c7);
         output_high(pin_c5);
      }
      if((input(pin_b0)==1&&sentido==1)||(sentido==1&&paro==0&&inic==0)){
         inic=1;
         output_low(pin_c5);
         output_high(pin_c6);
         for(i=0; i<=999; i++){
            if(input(pin_b1)==1&&paro==0){
               inic=2;
               paro=1;
            }
            if(input(pin_b2)==1&&sentido==1){
               inic=0;
               sentido=2;
               paro=1;
            }
            set_pwm1_duty(i);
            delay_ms(5);
         }
         
      }
     
      if((input(pin_b0)==1&&sentido==2)||(sentido==2&&paro==0&&inic==0)){
         inic=1;
         output_low(pin_c5);
         output_high(pin_c7);
         for(k=0; k<=999; k++){
            if(input(pin_b1)==1&&paro==0){
               inic=2;
               paro=2;
            }
            if(input(pin_b2)==1&&sentido==2){
               inic=0;
               sentido=1;
               paro=2;
            }
            set_pwm2_duty(k);
            delay_ms(5);
         }
      }
      if(input(pin_b2)==1&&sentido==1&&inic==1){
         inic=0;
         sentido=2;
         paro=1;
         delay_ms(50);
      }
      if(input(pin_b2)==1&&sentido==2&&inic==1){
         inic=0;
         sentido=1;
         paro=2;
         delay_ms(50);
      }
      if(input(pin_b2)==1&&sentido==1&&inic==2){
         paro=0;
         sentido=2;
         delay_ms(50);
      }
      if(input(pin_b2)==1&&sentido==2&&inic==2){
         paro=0;
         sentido=1;
         delay_ms(50);
      } 
     
     
   }
}

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Duda: control de motor dc con pwm y led rgb
« Respuesta #1 en: 14 de Octubre de 2021, 11:33:36 »
Te conviene definir 4 estados (PARADA,MARCHA,ACELERACION,DESACELERACION) y en cada estado leer lo necesario y ejecutar la acción correspondiente.

Algo asi:
Código: C
  1. #include <16f876.h>
  2. #fuses XT, NOWDT
  3. #use delay(clock = 4000000)
  4.  
  5. #use standard_io(B)
  6. #use standard_io(C)
  7.  
  8. int16 i,j,k,l;
  9. int1 parar = 0 , inversion = 0 , CW = 1 ;
  10.  
  11.  
  12. enum {PARADA,ACEL,MARCHA,DESAC} ;
  13.  
  14. int16 duty = 0 ;
  15. int8 estado = PARADA ;
  16.  
  17. #define PULS_marcha input(pin_b0)
  18. #define PULS_parada input(pin_b1)
  19. #define PULS_invert input(pin_b2)
  20.  
  21. #define LED_DETENIDO pin_c5
  22. #define LED_AH       pin_c6
  23. #define LED_H        pin_c7
  24.  
  25. #BYTE portc = getenv("SFR:PORTC")
  26.  
  27. #define LEDS_MARCHA   {portc&=0b00011111 ; output_high(CW ? LED_H : LED_AH) ;}
  28. #define LEDS_DETENIDO {portc&=0b00011111 ; output_high(LED_DETENIDO) ;}
  29.  
  30. void main()
  31. {
  32.     setup_timer_2(T2_DIV_BY_4,249,1);
  33.     setup_ccp1(ccp_pwm);
  34.     setup_ccp2(ccp_pwm);
  35.     set_pwm1_duty(0);
  36.     set_pwm2_duty(0);
  37.     output_high(pin_c3);
  38.  
  39.     LEDS_DETENIDO   ;
  40.     for(;;){
  41.         switch(estado){
  42.             case PARADA:
  43.                 if(PULS_marcha){ LEDS_MARCHA ;
  44.                                  parar = 0  ;
  45.                                  estado = ACEL ;
  46.                 }
  47.                 if(PULS_invert){ CW = !CW ; delay_ms(250)   ; }
  48.                 break ;
  49.  
  50.             case ACEL:
  51.                 if(duty<999){
  52.                     duty++ ;
  53.                     CW ? set_pwm1_duty(duty) : set_pwm2_duty(duty) ;
  54.                 }
  55.                 else      // terminó el ciclo de aceleracion
  56.                     estado = (inversion || parar) ? DESAC : MARCHA ;
  57.  
  58.                 if(PULS_parada) parar     = 1 ;
  59.                 if(PULS_invert) inversion = 1 ;
  60.                 break ;
  61.  
  62.             case MARCHA:
  63.                 if(PULS_invert){ inversion = 1 ; estado = DESAC ;}
  64.                 if(PULS_parada){ parar     = 1 ; estado = DESAC ;}
  65.                 break ;
  66.  
  67.             case DESAC:
  68.                 if(duty>0){
  69.                     duty-- ;
  70.                     CW ? set_pwm1_duty(duty) : set_pwm2_duty(duty) ;
  71.                 }
  72.                 else {     // terminó el ciclo de desaceleracion
  73.                     if(inversion){
  74.                         CW=!CW ;
  75.                         inversion=0 ;
  76.                         LEDS_MARCHA
  77.                         estado = ACEL ;
  78.                     }
  79.                     else  {
  80.                         LEDS_DETENIDO   ;
  81.                         estado = PARADA ;
  82.                     }
  83.                 }
  84.         }
  85.         delay_ms(5) ;
  86.     }
  87. }