Autor Tema: Lectura de Potenciometro y LM35 - ADC y manejo de flotantes  (Leído 973 veces)

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

Desconectado Fabri Olivari

  • PIC10
  • *
  • Mensajes: 21
Lectura de Potenciometro y LM35 - ADC y manejo de flotantes
« en: 23 de Mayo de 2020, 01:49:21 »
Hola a todo el foro de TODOPIC, le comento en que estoy trabajando. Estoy haciendo un termostato, que funciona de la siguiente manera: al presionar un pulsador, me permite a traves de un potenciometro setear la temperatura; a parte, cada 100ms voy leyendo la temperatura ambiente mediante el sensor LM35, la idea es que si la tempertatura supera cierto rango se prende un enfriador, y si decae se prende un calentador.
Ejemplo:
   -Temp seteada: 20.0 °C -> Temp medida: 23.0°C => Prender Enfriador, hasta llegar a 20.0°C
   -Temp seteada: 20.0 °C -> Temp medida: 17.0°C => Prender Calentador, hasta llegar a 20.0°C
   -Temp seteada: 20.0 °C -> Temp medida: 21.0°C => No hace nada [/li][/list]
Bueno el problema se presenta, en lo siguiente, yo quiero que la temperatura y el seteo con el potenciometro se haga en saltos de 0,5°C, es decir, al aumentar la temperatura o girar el potenciometro para setear, no muestre todo el recorrido, si no mas bien, saltos de 0,5°C.
Estuve tratando varias formas de hacerlo, por ejemplo con con round(), pero no me dio resultados. Por eso les pido ayuda, alguno sabe alguna manera de realizar eso?

Estoy programando con el PIC16F1519, con MPLAB X IDE y con XC8:
Les dejo la parte de como estoy muestreando en este momento: (muestra todos los valores)
Código: [Seleccionar]
            LCD_setCursor(0,0);
            LCD_print("  Setear Temp   ");
            sprintf(vector_set,"  Temp: %.1f C    ",temp_set);
            LCD_setCursor(0,1);
            LCD_print(vector_set);
El valor de temp_set, viene de aqui:
Código: [Seleccionar]
ADCON0 = 0x01; //Lectura del Canal 0
    ADCON1 = 0x80;
    ADCON0bits.GO_nDONE = 1; //Iniciamos Conversion
    while(ADCON0bits.GO_nDONE == 1){}
    ADC_set = ((ADRESH<<8) + ADRESL);
    return ADC_set;

Desconectado Fabri Olivari

  • PIC10
  • *
  • Mensajes: 21
Re:Lectura de Potenciometro y LM35 - ADC y manejo de flotantes
« Respuesta #1 en: 23 de Mayo de 2020, 01:53:58 »
Disculpen, refresque la pagina y se envio y no habia terminado, aqui esta el mensaje bien:


Hola a todo el foro de TODOPIC, le comento en que estoy trabajando. Estoy haciendo un termostato, que funciona de la siguiente manera: al presionar un pulsador, me permite a traves de un potenciometro setear la temperatura; a parte, cada 100ms voy leyendo la temperatura ambiente mediante el sensor LM35, la idea es que si la tempertatura supera cierto rango se prende un enfriador, y si decae se prende un calentador.
Ejemplo:
   -Temp seteada: 20.0 °C -> Temp medida: 23.0°C => Prender Enfriador, hasta llegar a 20.0°C
   -Temp seteada: 20.0 °C -> Temp medida: 17.0°C => Prender Calentador, hasta llegar a 20.0°C
   -Temp seteada: 20.0 °C -> Temp medida: 21.0°C => No hace nada
Bueno el problema se presenta, en lo siguiente, yo quiero que la temperatura y el seteo con el potenciometro se haga en saltos de 0,5°C, es decir, al aumentar la temperatura o girar el potenciometro para setear, no muestre todo el recorrido, si no mas bien, saltos de 0,5°C.
Estuve tratando varias formas de hacerlo, por ejemplo con con round(), pero no me dio resultados. Por eso les pido ayuda, alguno sabe alguna manera de realizar eso?

Estoy programando con el PIC16F1519, con MPLAB X IDE y con XC8:
Les dejo la parte de como estoy muestreando en este momento: (muestra todos los valores)
Código: [Seleccionar]
            LCD_setCursor(0,0);
            LCD_print("  Setear Temp   ");
            sprintf(vector_set,"  Temp: %.1f C    ",temp_set);
            LCD_setCursor(0,1);
            LCD_print(vector_set);
El valor de temp_set, viene de aqui:
Código: [Seleccionar]
    ADCON0 = 0x01; //Lectura del Canal 0
    ADCON1 = 0x80;
    ADCON0bits.GO_nDONE = 1; //Iniciamos Conversion
    while(ADCON0bits.GO_nDONE == 1){}
    ADC_set = ((ADRESH<<8) + ADRESL);
    return ADC_set;
//Para convertir de Valor ADC a Temperatura
    temp_set = set_up();
    temp_set = temp_set*30.0/1023.0; //0v -> 0°C / 5v -> 30°C

Si a alguien se le ocurre alguna manera y me la puede compartir, se lo agradezco. Si necesitan mas info, me consultan. Saludos

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Lectura de Potenciometro y LM35 - ADC y manejo de flotantes
« Respuesta #2 en: 23 de Mayo de 2020, 07:14:24 »
Se me ocurre generar tu propio round() adaptado a lo que necesitas.

 En tu caso como siempre vas a tener un valor entero con un solo decimal de precisión se puede plantear algo así:

Código: C
  1. float round(float val) {
  2.    uint16_t round = val * 10;                // Desplazar la coma flotante 1 dígito. (Un solo decimal de precisión).
  3.    uint8_t digito = round % 10;              // Obtener el ultimo dígito.
  4.    // Redondear
  5.    if ((digito > 0) && (digito < 5)) round -= digito;   // Si está entre 0 y 5 redondeamos a la baja.
  6.    else if (digito > 5) round += 10 - digito;           // Si es mayor que 5 redondeamos al alza.
  7.                                                                       // Si es 0 o 5 no hacemos nada.
  8.    return (float)round/10;                                // Vuelvo a colocar la coma flotante en su sitio.
  9.    }

En tu linea, añade debajo:

Código: C
  1. temp_set = temp_set*30.0/1023.0; //0v -> 0°C / 5v -> 30°C    // Adaptación ADC - RAMPA.
  2. temp_set = round(temp_set);                                                  // Redondeo.