4 votos

Encienda y deje que el LED permanezca encendido si el valor es de más de umbral en las principales bucle while

Estoy totalmente atascado con esto más bien trivial (?) problema, tengo este pseudo código que voy a convertir a C (estoy programación de un ATmega8 MCU):

Include libraries
Threshold = 40 //Celsius

While true
    Temp = Read_temp_from_sensor()

    If Temp > Threshold
         Turn on LED
    Else
         Turn off LED

Hay una manera para hacer que el LED permanezca en el de la duración del bucle while, pero sólo mientras la lectura de la temperatura del sensor es mayor que el valor de umbral?

Supongo que no quiero para evaluar los valores en el If/Else bloque en cada ciclo, estoy en el camino correcto aquí?

4voto

Karthik Puntos 66

Esto es exactamente lo que debe hacer - evaluar if/else en cada ciclo. Su código es básicamente ok, sólo tiene un defecto - si la temperatura está cerca del umbral de su LED parpadeará rápidamente como las lecturas de la temperatura estará por encima de los 40 y por debajo de los 40 un poco. Puede que usted no quiere eso. Para evitar esto, usted tiene que implementar histéresis - tener cierto margen de temperatura tiene que vencer a su vez el LED de encendido o apagado. Algo como esto:

Threshold = 40 //Celsius
Hysteresis = 1
While true
    Temp = Read_temp_from_sensor()

    If Temp > Threshold + Hysteresis
         Turn on LED
    Else If Temp < Threshold - Hysteresis
         Turn off LED

Usted puede ser que desee considerar el dormir el microcontrolador entre bucle de ciclos, el uso de las interrupciones de forma que el watchdog para despertarlo en intervalos de tiempo iguales.

3voto

Su pseudocódigo (junto con la histéresis miceuz explicó en su respuesta) debería funcionar bien. A veces, dependiendo de su requisito de la histéresis puede no ser necesaria en que un parpadeo del LED es bueno para lo que quieres hacer. Es un poco inusual requisito, pero sí que aparece de vez en cuando.

Me gustaría señalar, sin embargo, que al hacer esto en el bucle principal podría ser problemático en algunos casos de uso. Si el circuito en sí es largo o lleno de bloqueo de llamadas (digamos, una serie de lectura de la función que devuelve sólo después de que se recibe un mensaje), entonces esto podría causar que algunas rezagadas en los LEDs de respuesta. Si el tiempo de respuesta es importante para usted, usted querrá asegurarse de que el bucle principal se ejecuta dentro de un período menor que el tiempo de respuesta deseada.

Soluciones alternativas están disponibles. Posiblemente son demasiado complicados para ser de un interés más que académico para aplicaciones sencillas, pero nunca se sabe cuando iba a necesitar más.

  • Ejecutar el código de LED como una función más o menos lo que se ejecuta periódicamente, de nuevo con un período más corto que el tiempo de respuesta deseada. Esta "función" podría ser provocado por una interrupción, o en mucho más complicado de los sistemas, como una tarea en un sistema operativo en tiempo real.
  • Si el obtener la función de temperatura es el uso de la ADC, en su lugar podría configurar el ADC como un comparador si no te importa lo que la temperatura real es (o tal vez de usar un canal separado de la ADC como un comparador, que yo creo que el AVR permite), y utilizar el comparador de interrupción para activar el LED. Esto no necesita la comprobación regular y fundamentalmente, para garantizar una respuesta rápida.
  • Si el umbral es también va a ser utilizado para algún tipo de seguridad de corte, o para activar un rápido ADC medición de la ráfaga de donde usted está tratando de detectar algo que sucede justo después (como una especie de osciloscopio trigger), puede ser útil para la derivación de él AVR completo y un comparador. Son baratas, fáciles de usar, rápido, y puede ser conectado a uno de los AVRs cambio de pin de interrupciones (llamadas externas de interrupción en el mega8).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X