TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Kurt Cobain en 07 de Marzo de 2013, 03:36:25

Título: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: Kurt Cobain en 07 de Marzo de 2013, 03:36:25
Hola a todos, un cordial saludo, bueno me surgió un problema al momento de poner el PWM en mi código. Estoy implementando el control de un motor DC con PWM el cual tiene 6 pulsadores (arranque, paro, sentido de giro y velocidad) pero al momento de poner el PWM no responde ningún pulsador y siendo sincero no soy muy bueno programando y pues espero alguien me pueda hacer saber mi error. Aquí esta el código y la simulación de como lo estoy conectando:

#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, NOPUT,
#use delay(clock = 4000000)

void main()
{

output_low(PIN_C2);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 124, 1);
set_pwm1_duty(0);
delay_ms(1000);

long ciclo=0;

{
if(input(PIN_A0)){
ciclo++;
delay_ms(10);
if(ciclo>254)
ciclo=255;
}
if(input(PIN_A1)){
if(ciclo>0){
ciclo--;
delay_ms(10);

}

set_pwm1_duty(ciclo);
delay_ms(10);
}
set_tris_A(0b111111);
set_tris_B(0b00000000);
output_B(0b00000000);

{

input_A();
if ((input(pin_A2)==1) ){
x=1;
}
if ((input(pin_A3)==1) & (x==1 || x==3)){
x=2;
}
if ((input(pin_A4)==1) & (x==2) ){
x=3;
}
if ((input(pin_A5)==1) ){
x=4;
}
if(x==1){
output_high(PIN_B2);
output_low(PIN_B3); // enciende el motor y gira a la derecha
}
if(x==2){
output_high(PIN_B3);
output_low(PIN_B2) ; // gira hacia la izquierda

}
if(x==3){
output_high(PIN_B2);
output_low(PIN_B3); //GIRA HACIA LA DERECHA
}

if(x==4){
output_low(PIN_B2);
output_low(PIN_B3); //paro
x=0;
while(1);
}
}
}
}

Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: AngelGris en 07 de Marzo de 2013, 08:35:58
  Creo que los registros TRIS deberías configurarlos antes de ingresar al ciclo while. También sería bueno que coloques un esquema de tu circuito para poder ver las cosas más claramente.
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: Chenao en 07 de Marzo de 2013, 11:56:11

Para el modo de selección de cambio de velocidad lo que recomiendo es implementar una interrupción (por RB0) y las demás pulsadores los puedes controlar con las interrupciones de cambio de estado de los terminales de la puerta B.

Acá (http://www.todopic.com.ar/foros/index.php?topic=39626.msg329867#msg329867) puedes encontrar un código que te puede ayudar.
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: Kurt Cobain en 08 de Marzo de 2013, 15:01:36
  Creo que los registros TRIS deberías configurarlos antes de ingresar al ciclo while. También sería bueno que coloques un esquema de tu circuito para poder ver las cosas más claramente.

El esquema esta en archivo adjuntado.

Saludos
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: AngelGris en 08 de Marzo de 2013, 21:52:10
  Así como está el programa me parece que estaría haciendo el ciclo una única vez ya que no veo ningún while-do o do-while. Tal vez esté pero yo no logro verlo.
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: Kurt Cobain en 09 de Marzo de 2013, 02:29:32
 Así como está el programa me parece que estaría haciendo el ciclo una única vez ya que no veo ningún while-do o do-while. Tal vez esté pero yo no logro verlo.

De echo no esta, Do-while estaría abarcando para todo el programa? No tengo entendido eso muy bien  :huh: por que si lo pongo en donde esta implementado el PWM o las instrucciones de arranque paro y giro se estaría repitiendo solo ese ciclo no es así?
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: AngelGris en 09 de Marzo de 2013, 16:57:37
  Intentaré hacerme entender. Antes aclaro que no uso CCS, por lo tanto colocaré una especie de pseudocódigo para tratar de explicarme


Código: C
  1. void main(void)
  2. {
  3.   //declaraciones de variables
  4.  
  5.   unsigned int ciclo;                    // variable de 8 bits
  6.   unsigned int ciclo_anterior;      // variable de 8 bits
  7.  
  8.   //todas tus configuraciones, tanto de PWM como los tris
  9.  
  10.  
  11.  
  12.   while (1)  // En ccs se suele utilizar while (TRUE)
  13.   {
  14.      //si esta presionada la tecla de incrementar ciclo.....
  15.        if (ciclo <= 254) ciclo++;
  16.  
  17.      //si esta presionada la tecla de decrementar ciclo...
  18.        if (ciclo >= 1) ciclo--;
  19.  
  20.      if (ciclo |= ciclo_anterior)
  21.      {
  22.        varias tu duty
  23.        ciclo_anterior = ciclo;
  24.      }
  25.  
  26.      //si esta presionada la tecla de parar
  27.      llevas a 0 ambas salidas
  28.  
  29.      //si esta presionada únicamente la tecla de encendido
  30.      arranca el motor hacia la derecha
  31.  
  32.     /*
  33.       la funcion anterior tambien serviria para cambiar el giro hacia la derecha
  34.    */
  35.  
  36.      //si esta presionada únicamente la tecla de giro a la izquierda
  37.        seteas tus salidas para que gire a la izquierda
  38.  
  39.   }
  40. }
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: Kurt Cobain en 10 de Marzo de 2013, 16:05:33
Ohh gracias, ya me di una idea, espero funcione.

Saludos.
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: Kurt Cobain en 11 de Marzo de 2013, 02:22:36
  Intentaré hacerme entender. Antes aclaro que no uso CCS, por lo tanto colocaré una especie de pseudocódigo para tratar de explicarme


Código: C
  1. void main(void)
  2. {
  3.   //declaraciones de variables
  4.  
  5.   unsigned int ciclo;                    // variable de 8 bits
  6.   unsigned int ciclo_anterior;      // variable de 8 bits
  7.  
  8.   //todas tus configuraciones, tanto de PWM como los tris
  9.  
  10.  
  11.  
  12.   while (1)  // En ccs se suele utilizar while (TRUE)
  13.   {
  14.      //si esta presionada la tecla de incrementar ciclo.....
  15.        if (ciclo <= 254) ciclo++;
  16.  
  17.      //si esta presionada la tecla de decrementar ciclo...
  18.        if (ciclo >= 1) ciclo--;
  19.  
  20.      if (ciclo |= ciclo_anterior)
  21.      {
  22.        varias tu duty
  23.        ciclo_anterior = ciclo;
  24.      }
  25.  
  26.      //si esta presionada la tecla de parar
  27.      llevas a 0 ambas salidas
  28.  
  29.      //si esta presionada únicamente la tecla de encendido
  30.      arranca el motor hacia la derecha
  31.  
  32.     /*
  33.       la funcion anterior tambien serviria para cambiar el giro hacia la derecha
  34.    */
  35.  
  36.      //si esta presionada únicamente la tecla de giro a la izquierda
  37.        seteas tus salidas para que gire a la izquierda
  38.  
  39.   }
  40. }

He modificado el código de la siguiente manera, ya funciona el arranque (ra0), paro (ra3), y sentido de giro (ra1 y ra2) pero la velocidad lo que es el pwm no funciona (ra4 y ra5) y no encuentro el error en ello.

Código:

#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, NOPUT,
#use delay(clock = 4000000)

int x=0;

void main()
{
 set_tris_A(0b111111);
   set_tris_B(0b000000);
   output_B(0b00000000);

while (1){

input_A();
 if ((input(pin_A0)==1) ){
    x=1;
 }
 if ((input(pin_A1)==1) & (x==1 || x==3)){
    x=2;
 }
 if ((input(pin_A2)==1) & (x==2) ){
    x=3;
 }
 if ((input(pin_A3)==1) ){
    x=4;
 }
if(x==1){
       output_high(PIN_B2);
        output_low(PIN_B3);       // enciende el motor y gira a la derecha
}
if(x==2){
          output_high(PIN_B3);
          output_low(PIN_B2) ;      // gira hacia la izquierda
         
}
if(x==3){
          output_high(PIN_B2);
          output_low(PIN_B3);      //GIRA HACIA LA DERECHA         
}

if(x==4){
          output_low(PIN_B2); 
          output_low(PIN_B3);       //paro
        x=0;
       
}
}
{
output_low(PIN_C2);
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_16, 124, 1);
   set_pwm1_duty(0);
   delay_ms(1000);
   
   long ciclo=0;
{
         if(input(PIN_a4)){         
         ciclo++;
         delay_ms(10);
         if(ciclo>254)           
            ciclo=255;           
         }
         if(input(PIN_a5)){
         if(ciclo>0){
         ciclo--;
         delay_ms(10);
         }
         }
         }
                 
set_pwm1_duty(ciclo);
delay_ms(10);
         }
}

 
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: AngelGris en 11 de Marzo de 2013, 08:41:17
  Me parece que te está quedando fuera del while todo lo correspondiente al seteo del duty en el PWM.
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: reiniertl en 11 de Marzo de 2013, 11:56:49
Además cambias la velocidad muy lentamente, sería mejor poner algo así:

 ciclo+=10;

de ese modo el PWM cambia en un valor apreciable. Si después necesitas un ajuste tan fino de velocidad lo puedes cambiar como dices pero para depurar lo mejor es cambiar "visiblemente" la velocidad.

Saludos
Reinier
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: Kurt Cobain en 13 de Marzo de 2013, 03:38:59
  Me parece que te está quedando fuera del while todo lo correspondiente al seteo del duty en el PWM.

He modificado el código pero ahora el problema es que al presionar el pulsador de arranque (ra0) no lo hace, hasta que presiono el de aumento de velocidad (ra4)  pero ya todo lo demás esta bien. Aquí esta el código y la simulación.

#include <16F877A.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, NOPUT,
#use delay(clock = 4000000)
int x=0;
long ciclo=0;

void main()
{
   set_tris_A(0b111111);
   set_tris_B(0b000000);
   output_B(0b00000000);
   
   output_low(PIN_C2);
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_16, 124, 1);
   set_pwm1_duty(0);
   delay_ms(1000);

   while (1) {

      input_A();
      if (input(pin_A0) == 1)
         x=1;
      if ((input(pin_A1)==1) & (x==1 || x==3))
         x=2;
      if ((input(pin_A2)==1) & (x==2))
         x=3;
      if (input(pin_A3) == 1)
         x=4;

      if(x == 1) {
         output_high(PIN_B2);
         output_low(PIN_B3);       // enciende el motor y gira a la derecha
      }
      if(x == 2) {
         output_high(PIN_B3);
         output_low(PIN_B2) ;      // gira hacia la izquierda
      }
      if(x == 3) {
         output_high(PIN_B2);
         output_low(PIN_B3);      //GIRA HACIA LA DERECHA         
      }

      if(x==4){
         output_low(PIN_B2); 
         output_low(PIN_B3);       //paro
         x=0;
      }
      if(input(PIN_A4)) {         
         if(ciclo < 255)
            ciclo++;
         set_pwm1_duty(ciclo);
         delay_ms(10);
      }
      if(input(PIN_A5)) {
         if(ciclo > 0)
            ciclo--;
         set_pwm1_duty(ciclo);
         delay_ms(10);
      }
      }
}

 
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: Kurt Cobain en 13 de Marzo de 2013, 03:46:08
Además cambias la velocidad muy lentamente, sería mejor poner algo así:

 ciclo+=10;

de ese modo el PWM cambia en un valor apreciable. Si después necesitas un ajuste tan fino de velocidad lo puedes cambiar como dices pero para depurar lo mejor es cambiar "visiblemente" la velocidad.

Saludos
Reinier

De echo si había pensado en eso pero ahora el problema es el que le comente a AngelGris y le adjunte la simulación por si gustas verla.

Saludos.
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: AngelGris en 13 de Marzo de 2013, 11:30:03
  Estando funcionando, si lo pares y lo vuelves a arrancar, ¿tampoco arranca inmediatamente?

  El primer arranque puede fallar, ya que seteas el duty (inicialmente) a 0. Prueba dejando el duty inicial, por ejemplo a 100.
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: Kurt Cobain en 13 de Marzo de 2013, 14:20:15
  Estando funcionando, si lo pares y lo vuelves a arrancar, ¿tampoco arranca inmediatamente?

  El primer arranque puede fallar, ya que seteas el duty (inicialmente) a 0. Prueba dejando el duty inicial, por ejemplo a 100.

Dejando el duty a 100, si lo paro y lo vuelvo a arrancar funciona bien, pero si lo arranco y presiono el de disminución de velocidad se detiene y ya no arranca.
Título: Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
Publicado por: AngelGris en 13 de Marzo de 2013, 16:46:48
  Seguramente la solución estará en inicializar la variable ciclo a 100 (o un valor distinto de 0) y a su vez setear el duty inicial con el mismo valor.