Autor Tema: Problema de código en ccs para motor DC con PWM con PIC16F877A  (Leído 10456 veces)

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

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Problema de código en ccs para motor DC con PWM con PIC16F877A
« 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);
}
}
}
}

« Última modificación: 08 de Marzo de 2013, 14:59:54 por Kurt Cobain »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #1 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #2 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á puedes encontrar un código que te puede ayudar.
Un saludo desde Pereira - Colombia

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #3 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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #4 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #5 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í?
« Última modificación: 09 de Marzo de 2013, 02:34:21 por Kurt Cobain »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #6 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. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #7 en: 10 de Marzo de 2013, 16:05:33 »
Ohh gracias, ya me di una idea, espero funcione.

Saludos.

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #8 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);
         }
}

 

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #9 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #10 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

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #11 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);
      }
      }
}

 

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #12 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.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #13 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re: Problema de código en ccs para motor DC con PWM con PIC16F877A
« Respuesta #14 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.