Autor Tema: guardar el valor de una entrada analogica en una variable  (Leído 2810 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
guardar el valor de una entrada analogica en una variable
« 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.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: guardar el valor de una entrada analogica en una variable
« Respuesta #1 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Re: guardar el valor de una entrada analogica en una variable
« Respuesta #2 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);
}

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: guardar el valor de una entrada analogica en una variable
« Respuesta #3 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. }

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Re: guardar el valor de una entrada analogica en una variable
« Respuesta #4 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 :)


 

anything