Autor Tema: resultados incoherentes al comparar valores analogicos y variables float  (Leído 9320 veces)

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

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Buenas, estoy haciendo un montaje en el que he estudiado a que valores del sensor ha de actuar el sistema y he hecho lo siguiente.

- he definido 2 variables float, una de activar=1.00 y otra desactivar=2.50
- leo la entrada analogica correspondiente y realizo las comparaciones

antes, en lugar de usar las variables inicializadas con un valor que no cambia durante la ejecucion, hacia la comparacion con otra entrada analogica del pic en donde tenia un potenciometro y hacia una comparacion tal que esta:

si (potenciometro>sensor)
  hacer.....

sino
  hacer....

pero ahora, su funcionamiento es anomalo y no actua cuando realmente el sensor da los valores de voltaje que coinciden con las variables indicadas.

¿hay que hacer algun tipo de conversion de tipos de dato?

saludos y gracias.

 

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #1 en: 25 de Marzo de 2008, 20:10:50 »
¿hay que hacer algun tipo de conversion de tipos de dato?


Hola

El potenciómetro y tu variable analógica seguramente tienen escalas diferentes, ¿ya hiciste la conversión necesaria?

También antes de hacer la comparación asegúrate de que tu variable analógica es correctamente medida y después convertida.

Si quieres puedes subir tu código y lo revisamos.

OJO: Este tema es probable que vaya en el subforo de Lenguaje C para microcontroladores.

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #2 en: 25 de Marzo de 2008, 20:25:46 »
pongo un trozo significativo del codigo. los float que pongo como constantes se expresan los voltios que llegan del sensor.

saludos y gracias.

Código: C
  1. float sensor;
  2. const float encienden=0.81;
  3. const float apagan=2.51;
  4.  
  5. int estado=0;
  6.  
  7. void main(){
  8.  
  9. setup_adc(ADC_CLOCK_INTERNAL);
  10. setup_adc_ports(sAN3 | sAN7);
  11.  
  12.  ......
  13.  
  14.             //Lectura del sensor
  15.             set_adc_channel(3);
  16.             delay_us(6);
  17.             sensor=read_adc();
  18.  
  19.  
  20.             if((sensor<=encienden) && (estado==0)){
  21.  
  22.                delay_ms(800);
  23.    
  24.                //Lectura del sensor
  25.                set_adc_channel(3);
  26.                delay_us(6);
  27.                sensor=read_adc();
  28.  
  29.                if(sensor<=encienden){
  30.    
  31.                   luces_on;
  32.                   estado=1;
  33.                }
  34.  
  35.              }
  36.  
  37.   ......
« Última modificación: 25 de Marzo de 2008, 20:29:48 por MichaelKnight »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #3 en: 25 de Marzo de 2008, 20:32:35 »
Hola

sensor es declarada como float, pero su contenido viene directamente del adc, llega como un entero de 16 bits, no lo has convertido.

Lo que debes hacer es...
Código: [Seleccionar]
int16 lecturaadc;
float sensor;

...

lecturaadc=read_adc();
sensor=lecturaadc * 0.352; // 0.352 es un ejemplo

...

Si la escala máxima de tu adc es 5V, entonces al conectar 5V al pin del adc, lecturaadc valdrá 1023, si tu adc es de 10 bits, o 255 si tu adc es de 8 bits.

Para hacer la conversión tú debes saber la proporción.

Edito: 1023 y 255 son los máximos  :mrgreen:
« Última modificación: 25 de Marzo de 2008, 22:11:42 por migsantiago »

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #4 en: 25 de Marzo de 2008, 21:16:08 »
gracias por tan valiosa ayuda.

saludos.

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #5 en: 31 de Marzo de 2008, 15:01:18 »
algo estoy haciendo mal o muy mal porque no consigo que la comparacion sea efectiva. voy a pegar un trozo de codigo donde hago la conversion a la escala deseada y donde se hace una de las comparaciones para ver si hay algo que no este haciendo debidamente.

Código: C
  1. const float encienden=0.81;
  2. const float apagan=2.51;
  3.  
  4. float sensor;
  5. int ciclos;
  6.  
  7. float calcula(int entrada){
  8.  
  9.    float calculo;
  10.    calculo=(entrada*5)/1024;
  11.    return calculo;
  12. }
  13.  
  14.  
  15. void main(){
  16.  
  17. setup_adc(ADC_CLOCK_INTERNAL);
  18. setup_adc_ports(sAN3);
  19.  
  20.  
  21.  do{
  22.  
  23.      while(input(activado)){
  24.  
  25.          ciclos=0;
  26.  
  27.          if(!input(a)){
  28.  
  29.             //Lectura del sensor
  30.             set_adc_channel(3);
  31.             delay_us(6);
  32.             sensor=calcula(read_adc());
  33.  
  34.              if(sensor<=encienden){
  35.  
  36.                ......actua.....
  37.              }//if
  38.          }//if
  39.     }//while
  40. }while(TRUE);

Gracias de antemano por vuestra colaboracion.

saludos.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #6 en: 31 de Marzo de 2008, 16:36:22 »
tu problema está en la siguiente línea  "calculo=(entrada*5)/1024"; ya que la variable entrada en un entero, te hace la división entera, por lo tanto no tona los decimales. para subsanar esto debes colocar  "calculo=(float) (entrada*5)/1024";
Espero te sirva

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #7 en: 31 de Marzo de 2008, 18:50:09 »
gracias compañero. espero que con ese cambio en el codigo consiga resultados. por la mañana lo probare.

saludos.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #8 en: 31 de Marzo de 2008, 20:09:51 »
cuando lo pruebes me contás.

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #9 en: 31 de Marzo de 2008, 20:34:59 »
ademas de producir respuestas inesactas, ¿tambien puede ser causa de funcionamiento erratico? me explico  no solo me produce fallos a la hora de entrar o no en el bucle, incluso me ha llegado a pasar que me generaba respuestas inesperadas al margen del bucle donde supuestamente debia encontrarse. todo se desvelara cuando pueda probarlo antes de ir al trabajo.

saludos y gracias nuevamente.

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #10 en: 01 de Abril de 2008, 03:58:36 »
Hola MichaelKnight:

Imagino que el programa según lo estas haciendo es para un pic...o es para una tarjeta de adquisición de datos en pc.

Bueno sea lo que sea, échale un vistazo a este enlace donde se explica el funcionamiento de un gp2d12 con un pic y hay un ejemplo de como implementarlo en CCS que es muy parecido a lo que estas programando (si no es igual) y funciona perfectamente.

Ejemplo gp2d12 en C

Espero que te sirva.

Un saludete.

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #11 en: 01 de Abril de 2008, 15:21:04 »
aun no salgo de mi asombro compañeros. resulta que todo el problema que tenia se debia a que estaba utilizando la conversion para 10bit tal y como indica el datasheet, pero al cambiarlo para 8bit todo esta funcionando con normalidad. he realizado varias pruebas de funcionamiento y son optimas. quizas me estoy equivocando a la hora de leer el datasheet, asi que he pegado un recorte del mismo para que me digais si estaba interpretandolo mal o si hay una errata.

saludos.


Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #12 en: 01 de Abril de 2008, 18:49:34 »
No es error del pic, es tuyo.

Arriba te comenté que la lectura de 10bits se debe depositar en una variable de 16 bits. En tu programa depositas el valor en un int que es de 8 bits y truncas la lectura, la destruyes.

Corrige lo siguiente  :mrgreen: cambia el int por un int16 y haz un casting en el cálculo de "calculo".

Código: [Seleccionar]
float calcula(int16 entrada){
  float calculo;
  calculo=(float)(entrada*5)/1024;
  return calculo;
}

Tu programa funciona bien con adc de 8 bits porque tu subfunción calcula recibe datos de 8 bits.

Desconectado MichaelKnight

  • PIC16
  • ***
  • Mensajes: 154
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #13 en: 01 de Abril de 2008, 19:50:22 »
perdona, no he comentado los cambios que realice. declare la variable que lee el sensor como long al igual que la variable "entrada".

Código: C
  1. float calcula(long entrada){
  2.  
  3.    float salida;
  4.    salida=((float) entrada)*conversion;
  5.    return salida;
  6. }

en la constante conversion hago la siguiente declaracion: const float conversion=5.0/255.0;

en un principio ponia 1024, pero dado que no conseguia que funcionara adecuadamente, pase a hacer esa prueba tonta con 255 y a las mil maravillas.

saludos y gracias.
« Última modificación: 01 de Abril de 2008, 19:54:05 por MichaelKnight »

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: resultados incoherentes al comparar valores analogicos y variables float
« Respuesta #14 en: 01 de Abril de 2008, 20:53:14 »
para utilizar el conversor de 10 bits debes usar
#DEVICE ADC=10
sino no funcionan los 10 bits


 

anything