Autor Tema: Problema con CCS utilizando CCP1  (Leído 3695 veces)

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

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Problema con CCS utilizando CCP1
« en: 07 de Diciembre de 2009, 10:17:01 »
Hola:

El codigo que veis hace lo siguiente:

Hace aumentar gradualmente la velocidad de un motor DC mostrando en unos displays el tanto por ciento de la señal en alto, es decir, el duty cicle. Despues ejecuta un codigo para luego disminuir la velocidad tambien gradualmente hasta 10 y empezar de nuevo. Pues bien, Proteus lo simula perfectamente pero cuando lo implemento en la realidad no funciona, llega a 10 el duty cicly y literalmente se vueve loco el PIC empezando de nuevo el programa. Este mismo codigo implementado en PBP funciona sin problemas. No encuentro explicacion y por eso me gustaria vuestra opinion.

Código: [Seleccionar]
// ******************  CONFIGURACION DEL MODO PWM ******************************
//
//       T_PWM=1/Freq_PWM
//       T_PWM=(PR2+1)*4*TOSC*TMR2_PREESCALER
//
//                         T_PWM
//       PR2=  (---------------------------)-1
//                4*TOSC*TMR2_PREESCALER  
//
//       CTPWM=(CCPR1L:CCP1CON<5:4>)*TOSC*TMR2PREEESCALER  
//
//       CTPWM es el ciclo de trabajo y no puede superar el valor del periodo                                
//       de la señal PWM por lo que es posible que no se utilicen los    
//       10 bits de resolución que tiene  
//
//
//                                    CTPWM
//       CCPR1L:CCP1CON<5:4>= ----------------------
//                             TOSC*TMR2PREEESCALER
//
//       El valor del duty maximo es CCPR1L:CCP1CON<5:4>=1250
//
//       Frecuencia de la señal PWM=200 Hz
//       OSCILADOR= 4MHZ
//       TMR2_PREESCALER=16
//       T_PWM= 5 ms
//       PR2=312      
//
// *****************************************************************************

#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOPUT,NOCPD
#use delay(clock=4000000)
#use fast_io(c)
#use fast_io(d)
#use fast_io(b)

int8 display7seg(int8 valor){
   switch (valor){
      case 0:
         return 0b11111100;
         break;
      case 1:
         return 0b01100000;
         break;
      case 2:
         return 0b11011010;
         break;
      case 3:
         return 0b11110010;
         break;
      case 4:
         return 0b01100110;
         break;
      case 5:
         return 0b10110110;
         break;
      case 6:
         return 0b00111110;
         break;
      case 7:
         return 0b11100000;
         break;
      case 8:
         return 0b11111110;
         break;
      case 9:
         return 0b11100110;
         break;}
         }

int8 dig_1,dig_2;
int16 num;
int16 i;

void main(void){
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_b(0x00);
output_c(0x00);
output_d(0x00);
output_b(0x00);
setup_timer_2(T2_DIV_BY_16,312,1);
//set_pwm1_duty(CCP_OFF);
while(1){
setup_ccp1(CCP_PWM);
output_high(PIN_C4);
output_low(PIN_C5);
   for(i=10;i<987;i++){
      num=(i*10)/125;
      dig_1=(num/10);
      dig_2=(num-(dig_1*10));
      output_b(display7seg(dig_1));
      output_d(display7seg(dig_2));
      set_pwm1_duty(i);
      delay_ms(10);
      }
    output_b(0xFF);
    output_d(0xFF);
    delay_ms(200);
    output_b(0x00);
    output_d(0x00);
    delay_ms(200);
    output_b(0xFF);
    output_d(0xFF);
    delay_ms(200);
    output_b(0x00);
    output_d(0x00);
    delay_ms(200);
  for(i=987;i>10;i--){
      num=(i*10)/125;
      dig_1=(num/10);
      dig_2=(num-(dig_1*10));
      output_b(display7seg(dig_1));
      output_d(display7seg(dig_2));
      set_pwm1_duty(i);
      delay_ms(10);
     }
    output_b(0xFF);
    output_d(0xFF);
    delay_ms(200);
    output_b(0x00);
    output_d(0x00);
    delay_ms(200);
    output_b(0xFF);
    output_d(0xFF);
    delay_ms(200);
    output_b(0x00);
    output_d(0x00);
    delay_ms(200);
}
}
« Última modificación: 08 de Diciembre de 2009, 11:56:29 por aitorsp »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con CCS utilizando CCP1
« Respuesta #1 en: 07 de Diciembre de 2009, 10:36:00 »
Por lo que comentas no es problema de firmware sino más de hardware, que al aumentar la velocidad produce ruido que afecta al microcontrolador, reseteandolo y/o perdiendolo. Como estas implementando la parte de potencia de control?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Problema con CCS utilizando CCP1
« Respuesta #2 en: 07 de Diciembre de 2009, 10:57:30 »
Por lo que comentas no es problema de firmware sino más de hardware, que al aumentar la velocidad produce ruido que afecta al microcontrolador, reseteandolo y/o perdiendolo. Como estas implementando la parte de potencia de control?


Saludos!

Hola suky:

Utilizo el L293 metiendo los pulsos por el pin ENABLE. con PBP funciona sin problemas pero esta claro que el CCS desactiva el CCP1 por alguna razon cuando llega a 10 el duty cycle y vuelve a empezar. no se trata de ruidos ni nada porque con el otro codigo no da problemas.

un saludo

aitor

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con CCS utilizando CCP1
« Respuesta #3 en: 07 de Diciembre de 2009, 11:05:52 »
Pensé que PBP era algún simulador  :D A simple vista no se ve nada raro, lo único sacaría el setup_ccp del while. Pero si decís que el pic se vuelve loco, es problema de hardware  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Problema con CCS utilizando CCP1
« Respuesta #4 en: 07 de Diciembre de 2009, 11:08:32 »
Pensé que PBP era algún simulador  :D A simple vista no se ve nada raro, lo único sacaría el setup_ccp del while. Pero si decís que el pic se vuelve loco, es problema de hardware  :?


Saludos!

Hola:

PBP es el proton compiler version 2.1.3. Entiendo que en el codigo no observas nada raro y la verdad es que proteus lo simula bien. Lanzo esta pregunta por si habeis observado problemas en el hardware real con CCS y la configuracion en PWM.

un saludo

aitor

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problema con CCS utilizando CCP1
« Respuesta #5 en: 08 de Diciembre de 2009, 02:57:39 »
¿Puedes poner el esquema?

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Problema con CCS utilizando CCP1
« Respuesta #6 en: 08 de Diciembre de 2009, 11:49:03 »
¿Puedes poner el esquema?

Hola:

Resulta que he cambiado el servo s3003 por otro motor y el codigo CCS funciona. Ahora bien. Por qué con Pic Basic funcionaba y con CCS no. Parece que en principio el problema es el tipo de motor pero los dos codigos se contradicen. Y ya que estoy de preguntas os dejo el video en el que funciona el codigo en CCS y me gustaria que os fijarais en la tension en bornes del motor que marca el fluke. Los displays deben mostrar el tanto por ciento de la señal en alto, es decir, el area ó valor de continua. Pues los displays no llegan ni al 30 % y el motor ya se encuentra en su maximo valor para el que fue calculado (el 79 %). Esto indica que la rutina que calcula el tanto por ciento es mucho mas lenta que el hardware del pic que saca los pulsos modulados. Alguna idea al respecto?  :shock:

La tension que alimenta la parte de potencia del L293 es de 12 V y la de logica 5 V


Nota del autor:

Visto que el problema estaba en una mala configuracion de la frecuencia PWM tal como dijo Suky pongo la direccion de youtube donde se puede ver correctamente el valor medio de la señal del motor a medida que aumenta el Duty Cycle.



« Última modificación: 08 de Diciembre de 2009, 13:54:02 por aitorsp »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con CCS utilizando CCP1
« Respuesta #7 en: 08 de Diciembre de 2009, 12:07:07 »
Epa! El PWM esta mal calculado. A 4MHz del cristal la mínima frecuencia de PWM que consigues es de 244Hz. Trabaja a 250Hz y tendrás 10 bits de resolución.


Pase por alto esto:  :oops:
Código: [Seleccionar]
setup_timer_2(T2_DIV_BY_16,312,1);
PR2 no puede ser mayor a 255 y tu tienen 312  :shock:
Para 250Hz sería:
setup_timer_2(T2_DIV_BY_16,249,1);


Saludos!
« Última modificación: 08 de Diciembre de 2009, 12:09:56 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Problema con CCS utilizando CCP1
« Respuesta #8 en: 08 de Diciembre de 2009, 12:42:40 »
Epa! El PWM esta mal calculado. A 4MHz del cristal la mínima frecuencia de PWM que consigues es de 244Hz. Trabaja a 250Hz y tendrás 10 bits de resolución.


Pase por alto esto:  :oops:
Código: [Seleccionar]
setup_timer_2(T2_DIV_BY_16,312,1);
PR2 no puede ser mayor a 255 y tu tienen 312  :shock:
Para 250Hz sería:
setup_timer_2(T2_DIV_BY_16,249,1);


Saludos!

Hola Suki:

Es verdad y te dire mas. Lo estaba corrigiendo mientras estabas escribiendo la respuesta y resulta que puse PR2=250 sin darme cuenta de que hay que restarle 1 a la formula del mismo je je jeee...  :D . Con respecto al tema del motor,tienes alguna idea sobre porque no funciona con el S3003 y si con el otro motor que puse?. Puede ser la tension que afecta al PIC?

Lo importante es que ya funciona    :-/     :-/      :-/

un saludo

aitor

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: Problema con CCS utilizando CCP1
« Respuesta #9 en: 08 de Diciembre de 2009, 12:52:15 »
seria posible que coloques el hardware detallado? porque al parecer no estas aislando las corrientes parasitas de los motores DC, que son de lo peor en el mundo de la electronica... trata de colocar transistores para aislarlo un poco mas.


Desconectado aitorsp

  • PIC18
  • ****
  • Mensajes: 296
Re: Problema con CCS utilizando CCP1
« Respuesta #10 en: 08 de Diciembre de 2009, 13:01:54 »
seria posible que coloques el hardware detallado? porque al parecer no estas aislando las corrientes parasitas de los motores DC, que son de lo peor en el mundo de la electronica... trata de colocar transistores para aislarlo un poco mas.



Hola:

Del CCP1 sale la señal PWM hacia el Enable del L293. Le he colocado (al L293) un condensador de 100 nF a la salida (no se si es suficiente...). Bien es cierto que tampoco le he puesto los diodos de proteccion al driver que es el L293B. Podrias especificar un poco mas tu comentario?  "trata de colocar transistores para aislarlo un poco mas"
A qué tipo de configuracion te refieres?

gracias por responder

aitor


 

anything