TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MichaelKnight en 02 de Agosto de 2006, 16:52:10

Título: guardar el valor de una entrada analogica en una variable
Publicado por: MichaelKnight en 02 de Agosto de 2006, 16:52:10
wenas, me gustaria comparar 2 voltajes, pero necesito saber su valor real para luego hacer una funcion con uno de ellos. he estado mirando la ayuda del CCS pero no termino de tener claro como puedo hacerlo. os pongo un ejemplo de lo quiero hacer.

tengo 2 entradas analogicas en las que me llegan valores procedentes de un sensor y un potenciometro respectivamente. con el potenciometro regulo la sensibilidad que quiero para que se active el sistema. por otra parte, el sensor va mandando un voltaje que oscila entre 0 y 5v y necesito que la desconexion tenga un humbral distinto al marcado por el potenciometro (sensor con histeresis o zona muerta). la idea es que si el sensor manda un voltaje un 3% mayor que lo marcado por el potenciometro entonces se desconectaria el sistema.

Espero que haya quedado clara mi explicacion. Saludos y gracias.
Título: Re: guardar el valor de una entrada analogica en una variable
Publicado por: jfh900 en 02 de Agosto de 2006, 18:03:14
La forma de realizarlo es facil:

Declaras dos variables si la conversión es de 8 bits sera int8 y si es de 10 bits int16

unsigned int16 var1;
unsigned int16 var2;

Seleccionamos el canal correspondiente:

set_adc_channel(0);
// Esperamos un tiempo
delay_ms(10);
// Leemos el conversor
var1 = read_adc();

Repetimos para el segundo canal:

set_adc_channel(1);
// Esperamos un tiempo
delay_ms(10);
// Leemos el conversor
var2 = read_adc();

Seguidamente realizamos la comparación:

if ((var1+(var1*3/100) )>var2)
   ..... Parar
else
   ..... Seguir

Esto es un trozo de código simple de como implementar mas o menos el proceso. Lógicamente tienes que llamar previamente a setup_adc para configurar las entradas analógicas y tambien es preciso asegurarse la conversión, bien mediante una interrupción, o por espera del conversor.

Un saludo
Título: Re: guardar el valor de una entrada analogica en una variable
Publicado por: MichaelKnight en 02 de Agosto de 2006, 22:21:28
Buenas, despues de las indicaciones que me has dado y la ayuda del CCS he creado este codigo, pero el problema es que al llegar a ADC_CLOCK_INTERNAL me dice "Expecting an identifier". Pero lo raro es que por mas que he probado quitando y poniendo ";" y repasando parentesis no he encontrado ninguna errata en la cabecera para que al llegar a ese punto se' quede parado. ¿Ve alguien si estoy haciendo algo mal? Abajo adjunto mi codigo. Espero que alguien pueda responderme. Saludos.


#include <16f676.h>
#fuses INTRC_IO, NOMCLR, NOWDT, NOBROWNOUT, PROTECT
#use delay(clock=4000000) // Velocidad del reloj : 4 Mhz

#define home_on output_high(PIN_A0); output_high(PIN_A1);
#define home_off output_low(PIN_A0); output_low(PIN_A1);
#define luces_on output_high(PIN_A2); output_high(PIN_C0); output_high(PIN_C1);
#define luces_off output_low(PIN_A2); output_low(PIN_C0); output_low(PIN_C1);
#define contacto PIN_A3
#define cierre PIN_C5

float sensor;
float umbral;
float porcentaje=1.05;

setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(A4_C3_ANALOG);


void main(){

 do{
      while(!(input(contacto))){

         if(input(cierre)){
            home_on;
            delay_ms(5000);
            home_off;
         }
      }

      while(input(contacto)){

         //Lectura del sensor
         set_adc_channel(3);
         delay_us(6);
         sensor=read_adc();

         //Lecutra del umbral
         set_adc_channel(7);
         delay_us(6);
         umbral=read_adc();

         if(sensor>umbral){

            delay_ms(1000);

            if(sensor>umbral){

               luces_on;
            }
          }
          else(sensor<((umbral)/(porcentaje))){

               delay_ms(10000);

               if(sensor>((porcentaje)*(umbral))){

                  luces_off;
               }
          }
      }

  }while(TRUE);
}
Título: Re: guardar el valor de una entrada analogica en una variable
Publicado por: Modulay en 02 de Agosto de 2006, 22:42:54
El fallo estaba en que has colocado instrucciones donde no se puede hacerlo

Código: CSS
  1. setup_adc(ADC_CLOCK_INTERNAL);
  2. setup_adc_ports(A4_C3_ANALOG);

Había un par de fallillos más que te he corregido.Prueba con este código:

Código: CSS
  1. #include <16f676.h>
  2. #fuses INTRC_IO, NOMCLR, NOWDT, NOBROWNOUT, PROTECT
  3. #use delay(clock=4000000) // Velocidad del reloj : 4 Mhz
  4.  
  5. #define home_on output_high(PIN_A0); output_high(PIN_A1);
  6. #define home_off output_low(PIN_A0); output_low(PIN_A1);
  7. #define luces_on output_high(PIN_A2); output_high(PIN_C0); output_high(PIN_C1);
  8. #define luces_off output_low(PIN_A2); output_low(PIN_C0); output_low(PIN_C1);
  9. #define contacto PIN_A3
  10. #define cierre PIN_C5
  11.  
  12. float sensor;
  13. float umbral;
  14. float porcentaje=1.05;
  15.  
  16. // No puede haber instrucciones que no estén dentro del main o algúna subrutina
  17.  
  18.  
  19. void main(){
  20.  
  21. setup_adc(ADC_CLOCK_INTERNAL);
  22. setup_adc_ports(sAN3 | sAN7); // RA4 y RC3 SE CONFIGURAN ASÍ,TAMBIÉN DEPENDE DE LA VERSIÓN DEL COMPILADOR
  23.  
  24.  do{
  25.       while(!(input(contacto))){
  26.  
  27.          if(input(cierre)){
  28.             home_on;
  29.             delay_ms(5000);
  30.             home_off;
  31.          }
  32.       }
  33.  
  34.       while(input(contacto)){
  35.  
  36.          //Lectura del sensor
  37.          set_adc_channel(3);
  38.          delay_us(6);
  39.          sensor=read_adc();
  40.  
  41.          //Lecutra del umbral
  42.          set_adc_channel(7);
  43.          delay_us(6);
  44.          umbral=read_adc();
  45.  
  46.          if(sensor>umbral){
  47.  
  48.             delay_ms(1000);
  49.  
  50.             if(sensor>umbral){
  51.  
  52.                luces_on;
  53.             }
  54.           }
  55.           else if(sensor<((umbral)/(porcentaje))){   // Aquí había un fallo (te faltaba "if")
  56.  
  57.                delay_ms(10000);
  58.  
  59.                if(sensor>((porcentaje)*(umbral))){
  60.  
  61.                   luces_off;
  62.                }
  63.           }
  64.       }
  65.  
  66.   }while(TRUE);
  67. }
Título: Re: guardar el valor de una entrada analogica en una variable
Publicado por: MichaelKnight en 03 de Agosto de 2006, 07:18:40
Gracias Modulay, he realizado los cambios que me has indicado y alguno mas y ya esta 100% operativo mi codigo. Agradezco tu atencion. Este es el primer PIC que programo, espero que todo salga bien :)