Autor Tema: CVD con ADC no funciona... :(  (Leído 3078 veces)

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

Desconectado delirio

  • PIC12
  • **
  • Mensajes: 64
CVD con ADC no funciona... :(
« en: 02 de Julio de 2015, 23:08:31 »
Buenas amigos del foro, a ver si me pueden echar una mano...
Resulta que estoy queriendo implementar esto en un 16F886 y no consigo que funcione.... solo consigo ruido, y prácticamente no hay diferencia entre tocar y no tocar el pad, estoy trabajando en protoboard, y como pad utilizo un cuadrado de 15mm x 15 mm de papel españa (chapa de bronce) de 0.3 decimas, conectado con no mas de 8cm de cable... pero también lo he probado con un cable de cobre solamente y nada...
Estoy utilizando la AN0 sobre RA0, y como entrada comodin la AN1 sobre RA1, pero también las he probado en otras y nada tampoco...  :5]
La adquisición del ADC la hago en un rutina que acumula el resultado en una variable y luego calcula el promedio (eso lo saqué de un post de Nocturno!!   ((:-)) ) y el valor que obtengo, si bien después del promedio sigue siendo de 8 bits, no es mas que 200, y al tocarlo, cambia a 198 / 199 / 200, osea nada !!
Les adjunto el código a ver si encuentran algo mal!
Gracias

- Fernando

Código: [Seleccionar]

#include <16F886.h>
#device ADC=8
#fuses HS,NOWDT,NOMCLR,NOPROTECT,NOBROWNOUT,NOCPD
#use delay(clock=20000000)
#use rs232(baud=38400, xmit=pin_c6, rcv=pin_c7, bits=8)
#use fast_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(E)


static unsigned long dato, i, promedio;

void read_CVD()
{
   output_high(PIN_A1);
   set_adc_channel(1);
   delay_us(100);
   output_low(PIN_A0);
   delay_us(100);
   output_float(PIN_A0);
   set_adc_channel(0);
   delay_us(20);
   dato=read_adc();
}

void get_key()
   {
   promedio=0;
   i=32;
   while (i>0)
      {
      read_CVD();
      promedio+=dato;
      delay_ms(5);
      i--; 
      }
   promedio/=32;
   }
 
void main()
{
   setup_adc_ports( sAN0 | sAN1 | VSS_VDD );
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);

while (1)
   {
   get_key();
   if (promedio>=235)
      {
      output_low(PIN_A2);
      }
   else
      {
      output_high(PIN_A2);
      }
   output_b(promedio);
   printf("%Lu\r",promedio);   //Imprime valor
   delay_ms(100);
   }
}


Desconectado diguito_69

  • PIC16
  • ***
  • Mensajes: 136
Re: CVD con ADC no funciona... :(
« Respuesta #1 en: 03 de Julio de 2015, 14:30:02 »
Hola, a simple vista el procedimiento parece correcto. Yo lo he hecho hace un tiempo y recuerdo haberlo hecho sin ningun tipo de delay, de hecho cuanto mas rapido corria el programa mejor era la lectura que obtenía. Yo probaría quitando los delays, especialmente el que esta antes de read_adc().

Estas usando CCS no?, si es así, podria ser que el compilador agregue instrucciones que afecten el procedimiento.

Saludos.
"Carezco de un don especial. Sólo soy apacionadamente curioso". Albert Einstein.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: CVD con ADC no funciona... :(
« Respuesta #2 en: 03 de Julio de 2015, 20:05:52 »
Perdon por mi ignoracia pero no se lo que es un cvd

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: CVD con ADC no funciona... :(
« Respuesta #3 en: 03 de Julio de 2015, 20:13:55 »
Perdon por mi ignoracia pero no se lo que es un cvd

Es un metodo "Capacitive Voltage Divider (CVD)"
Aqui mas info
http://ww1.microchip.com/downloads/en/AppNotes/01298A.pdf

Desconectado delirio

  • PIC12
  • **
  • Mensajes: 64
Re: CVD con ADC no funciona... :(
« Respuesta #4 en: 06 de Julio de 2015, 00:12:02 »
Hola, a simple vista el procedimiento parece correcto. Yo lo he hecho hace un tiempo y recuerdo haberlo hecho sin ningun tipo de delay, de hecho cuanto mas rapido corria el programa mejor era la lectura que obtenía. Yo probaría quitando los delays, especialmente el que esta antes de read_adc().

Estas usando CCS no?, si es así, podria ser que el compilador agregue instrucciones que afecten el procedimiento.

Saludos.

Hola diguito, asi es, estoy usando ccs! Con respecto a los delays, los agregué después de no tener signos vitales jaja, después de agregarlos obtuve los resultados comentados en mi post inicial.
Seguiré probando e iré comentando. X lo pronto, ya compré unos 16F723 que integran mTouch x hardware, ojalá tenga mejores resultados... Tengo entendido que ccs tiene funciones para tal fin pero no se si las compila bien.
Saludos y gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: CVD con ADC no funciona... :(
« Respuesta #5 en: 06 de Julio de 2015, 00:59:08 »
Una pregunta.... si supuestamente se intenta comparar capacidades. supongo que lo que tenes  debe tener 2 caras, 1 de gnd y otra la cara a sensar. Y no solo un cable o una plancha de cobre. Estoy en lo correcto?

Desconectado delirio

  • PIC12
  • **
  • Mensajes: 64
Re: CVD con ADC no funciona... :(
« Respuesta #6 en: 06 de Julio de 2015, 10:17:36 »
Asi es KILLER, probé con FR4 de dos capas, la botton es GND y la top es un pad cuadrado de 20 x 20 mm. es como que si no tuviera ganancia...
El mejor resultado lo conseguí con el papel españa, dos para ser exacto, uno como GND y el otro como sensor al AN del PIC, separado entre ellos x un acetato como dielectrico.
Cabe mencionar que cuando lo toco con el dedo capta, lo que no consigo es que capte cuando le coloco un acrílico arriba (2mm de espesor)... ya ahi deja de captar  :(
Una consulta, no he encontrado información especifica respecto del ADC interno de los pics... podrá ser que determinados micros tengan el capacitor interno (CHold) de determinado valor que no permita esta tecnica??
Gracias

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: CVD con ADC no funciona... :(
« Respuesta #7 en: 06 de Julio de 2015, 15:14:06 »
NO uso ningún plano GND, se usa un guard ring , pero este tiene el mismo voltage que el que capacitor CHOLD(que es +VCC),en mismo caso no lo uso.

El Vref del ADC lo dejo a VDD(+5v),al cargar el capacitor interno este llega hasta 1.4v , no se si es lo adecuado pero funciona bien el touch,sigo estudiandolo.

Estoy probando con un pic12F1840@32MHz oscilador interno.

Código: [Seleccionar]
       uint16_t ADC_res = 0;     // Limpiar variable

        for(uint8_t x = 0;x < 32;x++){

            LATA1 = 1;
            ADCON0 = 0b00000101;    //CH1

            TRISAbits.TRISA0 = 0;
            LATAbits.LATA0 = 0;

            __delay_us(1);
            TRISAbits.TRISA0 = 1;
            ADCON0 = 0b00000001;    //CH0

            
            ADCON0bits.GO_nDONE = 1;            // Inciar conversion
          
            while(ADCON0bits.GO_nDONE == 1);    // Esperar hasta que temrine la conversion
            
            ADC_res + = ADRES;                // Pasar resultado a variable y sumarlo para promediar
            
        }

        ADC_res  / = 32;                // Obtenemos el valor promedio

        return ADC_res;                 //Regresamos el valor promedio de la conversion AD
« Última modificación: 06 de Julio de 2015, 15:35:47 por AKENAFAB »

Desconectado delirio

  • PIC12
  • **
  • Mensajes: 64
Re: CVD con ADC no funciona... :(
« Respuesta #8 en: 06 de Julio de 2015, 22:17:14 »
Una consulta AKENAFAB, los valores obtenidos en la imagen press, es tocando con el dedo el pad en el cobre?? o hay algún tipo de separación entre el dedo y el cobre?
Se ve que funciona muy bien, no es así?
Voy a implementar tu rutina a la mía, a ver si tengo mas suerte... después les comento!
Saludos

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: CVD con ADC no funciona... :(
« Respuesta #9 en: 06 de Julio de 2015, 23:38:49 »
Una consulta AKENAFAB, los valores obtenidos en la imagen press, es tocando con el dedo el pad en el cobre?? o hay algún tipo de separación entre el dedo y el cobre?
Se ve que funciona muy bien, no es así?
Voy a implementar tu rutina a la mía, a ver si tengo mas suerte... después les comento!
Saludos

Eso es tocando directo,probé con una hoja plástica de 3mm de espesor y funcionaba bien.
No he probado con mas cosas.


 

anything