TODOPIC

Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: MichaelKnight en 25 de Marzo de 2008, 17:49:41

Título: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: MichaelKnight en 25 de Marzo de 2008, 17:49:41
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.

 
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: migsantiago 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.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: MichaelKnight 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.   ......
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: migsantiago 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:
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: MichaelKnight en 25 de Marzo de 2008, 21:16:08
gracias por tan valiosa ayuda.

saludos.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: MichaelKnight 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.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: pablomanieri 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
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: MichaelKnight 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.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: pablomanieri en 31 de Marzo de 2008, 20:09:51
cuando lo pruebes me contás.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: MichaelKnight 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.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: c4_esp_VR 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 (http://www.muchotrasto.com/gp2d12.php)

Espero que te sirva.

Un saludete.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: MichaelKnight 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.

(http://img246.imageshack.us/img246/9800/recortedatasheetah1.jpg)
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: migsantiago 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.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: MichaelKnight 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.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: pablomanieri 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
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: MichaelKnight en 01 de Abril de 2008, 21:15:26
para utilizar el conversor de 10 bits debes usar
#DEVICE ADC=10
sino no funcionan los 10 bits

deduzco que por defecto siempre esta activo el de 8bit ¿es asi?

saludos y gracias por todo lo que estoy aprendiendo.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: pablomanieri en 01 de Abril de 2008, 21:35:13
efectivamente, sino pones esa directiva, el compilador te toma el conversor con 8 bits
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: migsantiago en 02 de Abril de 2008, 19:44:26
Hola

Como te dice Pablo, corrigiendo la declaración del adc a 10bits debería ya funcionar.
Título: Re: resultados incoherentes al comparar valores analogicos y variables float
Publicado por: gu1llermo en 03 de Abril de 2008, 01:38:09
Tienes un problema con la compatibilidad de los tipos de datos, y la resolución del conversor AD como te ha dicho migsantiago en varias oportunidades, esta parte de código

...
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.
...

Te funciona porque tienes la resolución a 8 bits, pero puedes colocarla a 10 bits y declarar:
const float conversion=5.0/1024;

Con uno de los dos operandos que tenga el punto ya es suficiente.

Ten siempre "presente" declarar los tipos de variables adecuados para cada quién, por ejemplo si recibes un valor de la conversión AD de 10 bits, no se puede colocar luego en una variable de 8, porque los bits más significativos desaparecen.

Saludos y creo que has tenido ayuda de sobra  :c)