Autor Tema: Problema con lectura adc en ccs  (Leído 1725 veces)

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

Desconectado marcoscab1166

  • PIC12
  • **
  • Mensajes: 57
Problema con lectura adc en ccs
« en: 13 de Enero de 2016, 12:47:28 »
Hola, tengo un problema con la lectura de corriente con el ccs. Les adjunto el codigo
Código: [Seleccionar]
int t=1;
int obstaculo=0;
int sobrecarga=0;
int sensor=1;
int error=0;
float temperaturadi;
float temperatura=0;
float temp_max=30;
int16 corriente1;
int16 corriente;
int16 corriente_max=500; //corriente maxima es 1A

void leer_corriente(){
   corriente1=read_adc();
   corriente=((corriente1-512)*25);  //cada unidad es 25mA
}

#int_TIMER2
 void  TIMER2_isr(void) 
 {
   switch(t){
   case 1:
    set_adc_channel(1);
    t++;
    break;
   case 2:
    temperaturadi=read_adc();
    temperatura=temperaturadi*(0.48875); // Pasa binario a °C
    t++;
    break;
   case 3:
    set_adc_channel(0);
    t++;
    break;
   case 4:
    leer_corriente();
    t=1;
    break;
   }
   output_toggle(pin_b1);
 }


 #int_TIMER1
 void  TIMER1_isr(void)
 {
  if(temperatura>=temp_max){
    output_high(pin_b7);}
  else{
    output_low(pin_b7);}
  if(sensor==1){
    if(distancia<dist_max){
      obstaculo=1;}
    else{
      obstaculo=0;}
    if(corriente>corriente_max){
      sobrecarga=1;
      error=1;}
    else{
      sobrecarga=0;
      }}
 }

#int_TIMER0
 void  TIMER0_isr(void)
 {
  if(error==1){
   r++;
   if(r==15){
    output_high(pin_a2);
    r=0;}}
  else{
    output_low(pin_a2);}
}


El problema que tengo es que cuando hace la comparacion con la corriente leida, y la corriente maxima preestablecida, va a error de todas formas, no importa la corriente que mida, inclusive cuando esta todo desconectado.
El sensor es un acs712 de 5 amperes. El timer 2 esta configurado para ejecutar la interrupcion cada 13 ms, que tendria que ser mas que suficiente para eso. El timer 1 tambien en el mismo tiempo, y el 1 cada 52 ms. El adc esta configurado en 10 bits. Para mi es algun error del Proteus o del CCS.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con lectura adc en ccs
« Respuesta #1 en: 13 de Enero de 2016, 14:15:13 »
Probaria varias cosas... A pesar que para mi el programa "esta bien" ( entre comillas) probaria lo siguiente:

1-
Esto ayudaria a descartar problemas de soft logica:

Reemplazar:

Código: C
  1. void leer_corriente(){
  2.    corriente1=read_adc();
  3.    corriente=((corriente1-512)*25);  //cada unidad es 25mA
  4. }

por

Código: C
  1. void leer_corriente(){
  2.    corriente1=read_adc();
  3.    corriente=495;  
  4. }

Si ahora el codigo ya NO genera error quiere decir que la logica esta bien.

2-
No se como se maneja CCS, si poner int16 es unsigned o signed. Asi que por las dudas vamos a recurrir a dejarlo como estaba antes la formula y vamos a cambiar:

Código: C
  1. int16 corriente;
por
Código: C
  1. signed long corriente; // Es lo mismo que int16 con signo. no se si puedo ponerle signed int16
El tema es que si es sin signo, cuando hagas la resta.. ejemplo. (412-512) * 25 = -100 * 25 = -2500
Pero ese es el resultado con signo, si tu numero es sin signo, lo que guardarias es 62935 aproximadamente. Y siempre daria error. Y el unico momento que no de error seria cuando el ADC valga de 512 a 532, por que 532-512 = 20,  20*25 = 500 y ya estas en tu borde es decir que si usas un numero SIN signo el rango se reduce a solo 20 valores del ADC, es decir una variacion de 100mV en la entrada. ( con 5V y ADC 10bits)

3-
Si todo lo anterior ya falla significa que algo esta mal. Deberias leer la tension de entrada del ADC con un multimetro. Esto tranquilamente lo podes hacer con un potenciometro a la entrada del ADC, no hace falta conectar el sensor. Verificar que la formula sea correcta. Y de ultima podes agregar unas pruebas con leds para saber si corriente1 es mayor o menor a ciertos valores. antes de la formula. Actualmente el maximo valor que podria tener tu ADC es de 532, suponiendo que estas a 5V y 10 bits son 2.6V aproximadamente.


 

anything