Autor Tema: entrada analoga OK en la simulacion pero en la PCB raro  (Leído 1998 veces)

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

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
entrada analoga OK en la simulacion pero en la PCB raro
« en: 28 de Agosto de 2009, 23:20:28 »
hola gente, les molesto esta vez por que estoy asiendo un programa en lenguaje C con el compilador CCS C, y es para el pic 16f877a. trato de hacer una fuente digital de 0a 25V y 0a 2.5A, se que ya se discutio este tema tiempo atras, con el tema de famosa fuente digital valdorre, pero el punto es que a este circuito solo le e copiado la etapa de potencia y no la de control. bueno a esta fuente el codigo lo diseñe yo mismo, bueno con alguna ayuditas pero en fin, estoy teniendo problema con este codigo, pero la gran diferencia que tiene y exclusividad es que los valores a ingresar tanto de corriente como de voltaje, por que esto se hace mediante un teclado 4x4.
el punto es que en la simulacion proteus va del todo bien pero cuando lo implemente observe varios detalles los cuales son 3.

1)Las dos primeras filas de vez en cuando empiesan a parpadear y las otras 2 no (LCD 20x4).
2)El teclado aveses no responde
3)Por la conversion que tengo de las entradas analogas (A0 y A1), cuando tengo los 5 Vol de entradas en ambas una me deveria marcar 25.00V (A0) y la otra 2.50A (A1), pero no lo hace, la primera fluctua entre 23.94 y 24.02V y la corriente llega a 2.42A. esto siendo que tengo la conversion bien. bueno eso creo yo. por otra parte cuando a la entrada de voltaje le pongo 5V y a la de corriente 0V el voltaje que severia ver en la LCD seria 25.00V pero en ves de ver eso cae a 7.53V siendo que esto no deveria ser.
todo esto lo e probado sin la etapa de potencia, conectandole directo los voltaje a cada pins (A0 y A1) que va de 0 a 5V.

ahora bien les dejo el codigo mas la simulacion para que me ayuden en encontrar los errores (el cual yo no encuantro ninguno XD).
explicando un poco el programa por el teclado puedo acceder a 2 modificaciones, una es la del voltaje y la otra es la de corriente. presionando la A accedo a modificar solo el voltaje, pero para salir de este menu tengo que ingresar al menos 4 digitos osea 15.12V sin contar con el punto, o ingresar directamente a la segunda modificacion presionando la tecla B el cual cambia la corriente, y para salir de este menu tengo que presionar 3 numeros 2.22A por ejemplo sin contar con el punto.
buen oespero qu me puedan ayudar. saludos.
Código: [Seleccionar]
#include <16F877a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#define use_portd_lcd TRUE //definir portb lcd
#include<lcd420.c> //libreria manejo lcd de 20x4 modificada por suky para el puerto D
#include <keypad.c>   //Libreria de teclado 4x4
#use standard_io(A)
#use standard_io(C)

#byte trisa=0x85

int16 V1,V2;//variables para las señales analogas
float sobrecorriente;
int16 a,b;//variables para el PWM
unsigned char key;   //Variable global tecla
char tecla=0;          //Variable para motrar por pantalla valor pulsado keypad
int i=0,m,n,z,x,h,c=0;
float k=0,w=0;
#INT_RB             //interrupcion  que avilita el keypad
void interrupt_keypad()               
{
   key=read_keypad();         //Asigna la tecla pulsada
   clear_interrupt(INT_RB);   //Limpia bandera RBIF
   m++;               
}

void Leer_ADC1(void){//interrupcion que avilita la entrada analoga N0
   setup_port_A( ALL_ANALOG );
   setup_adc( ADC_CLOCK_INTERNAL );
   set_adc_channel( 0 );//numero del puerto analogo N0
   V1 = read_adc();//guarda el dato optenido de la entrada analoga
   delay_ms(20);
   setup_adc (adc_off);
}

void Leer_ADC2(void){//interrupcion que avilita la entrada analoga N1
   setup_port_A( ALL_ANALOG );
   setup_adc( ADC_CLOCK_INTERNAL );
   set_adc_channel( 1 );//numero del puerto analogo N1
   V2 = read_adc();//guarda el dato optenido de la entrada analoga
   delay_ms(20);
   setup_adc (adc_off);
}

void main(){//programa principal
lcd_init();         //inicializa lcd
   set_tris_A(0x0F);
   enable_interrupts(INT_RB);            //interrupcion keypad activada
   setup_ccp1(CCP_PWM); //ccp1 modo PWM
   setup_ccp2(CCP_PWM); //ccp2 modo PWM
   setup_timer_2(T2_DIV_BY_16, 155, 1);
   
   a=312;   // punto medio del duty de 10 bits
   b=312;   // punto medio del duty de 10 bits
   set_pwm1_duty(a);//duty cycle con una variable para variar el PWM
   set_pwm2_duty(b);//duty cycle con una variable para variar el PWM
   
   while (TRUE){
   
      set_pwm1_duty(a);//duty cycle con una variable para variar el PWM
      set_pwm2_duty(b);//duty cycle con una variable para variar el PWM

      init_keypad();//llama a interrupcion int_RB
      tecla=key;//asigna tecla pulsada en el keypad

/*inicio de calculos del keypad para el voltaje*/
   if(tecla==65){c=5;m=3;}//activo ingreso voltaje presionando la latra A del keypad
   if(c==5){
   i=tecla-48; //ejemplo variable = a 5 en ascii es 53  y el 48 equivale a un 0 i=53-48=5
   if(i<10){
   if(m==5) {n=i;k=n;}
   if(m==7) {z=i;k=(n*10)+z;}
   if(m==9) {x=i;k=(n*10)+z+(x*0.1);}
   if(m==11){h=i;k=(n*10)+z+(x*0.1)+(h*0.01);}
   }}
/*termini de calculos de voltaje por ingreso de numero por keypad */   
   
/* proseso  de calculo decorriente por keypad*/   
   if(tecla==66){c=6;m=3;}//activo ingreso de corriente apretando la tecla B del keypad
   if(c==6){
   i=tecla-48; //ejemplo variable = a 5 en ascii es 53  y el 48 equivale a un 0 i=53-48=5
   if(i<10){
   if(m==5) {n=i;w=n;}
   if(m==7) {x=i;w=n+(x*0.1);}
   if(m==9){h=i;w=n+(x*0.1)+(h*0.01);}
   }}
/*termini de calculos keypad para corriente*/

   if(k>=25){k=25;}//limite max de voltaje
   a=24.96*k;    //a=(624/25)*k voltaje
   if(w>=2.5){w=2.5;}// limite max de corriente                     
   b=249.6*w;    //b=(624/2.5)*w corriente

      printf(lcd_putc,"Temperatura:");
      lcd_gotoxy(1,1);
     
      Leer_ADC1();
      printf(lcd_putc,"Vol: %4.2f[V]",(float)V1*(5.0/1024.0)*5.01);//los *5 ultimo es para dar el rango asta los 25V
      lcd_gotoxy(1,2);
     
      Leer_ADC2();
      printf(lcd_putc,"Amp: %4.2f[A]",(float)(V2*5.0/1024.0)/1.99);// el divisor 1.99 es para dar el rango a 2.5A
      lcd_gotoxy(1,3);
     
      printf(lcd_putc,"Amp ref: %f[A]",w);
      lcd_gotoxy(1,4);
sobrecorriente=(V2*5.0/1024.0)/1.99;

//medicion de sobrecorriente
output_high(PIN_C5);
if(sobrecorriente<=2.4){output_high(PIN_C3);output_low(PIN_C4);}
if(sobrecorriente>=2.45){output_low(PIN_C3);output_high(PIN_C4);}
if(sobrecorriente>=2.5){output_low(PIN_C5);delay_ms(7000);}//desactiva la salida de voltaje por 5seg
     
   }
}

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: entrada analoga OK en la simulacion pero en la PCB raro
« Respuesta #1 en: 29 de Agosto de 2009, 16:30:51 »
sorrin aller no me dejaba subir nada pero aqui esta la simulacion