Cálculo del valor del sensor TSL2591

0

Compré un tablero de ruptura TSL2591 y quería escribir un controlador para mi tablero.

Después de consultar la documentación, descubrí que no puedo calcular el valor de iluminancia (en Lux) ya que no se dio su algoritmo.

Probé el código Arduino de Adafruit TSL2591 pero no hay descripción. Intenté obtener una nota de la aplicación sobre cómo usar el dispositivo o alguna descripción física, Nada. También probé el foro de Adafruit (sin respuesta aceptable ~ 2 días) y envío por correo electrónico de AMS (sin respuesta ~ 2 días).

uint32_t Adafruit_TSL2591::calculateLux(uint16_t ch0, uint16_t ch1)
{
  uint16_t atime, again;
  float    cpl, lux1, lux2, lux;
  uint32_t chan0, chan1;

  // Check for overflow conditions first
  if ((ch0 == 0xFFFF) | (ch1 == 0xFFFF))
  {
    // Signal an overflow
    return 0;
  }

  // Note: This algorithm is based on preliminary coefficients
  // provided by AMS and may need to be updated in the future

  switch (_integration)
  {
    case TSL2591_INTEGRATIONTIME_100MS :
      atime = 100.0F;
      break;
    case TSL2591_INTEGRATIONTIME_200MS :
      atime = 200.0F;
      break;
    case TSL2591_INTEGRATIONTIME_300MS :
      atime = 300.0F;
      break;
    case TSL2591_INTEGRATIONTIME_400MS :
      atime = 400.0F;
      break;
    case TSL2591_INTEGRATIONTIME_500MS :
      atime = 500.0F;
      break;
    case TSL2591_INTEGRATIONTIME_600MS :
      atime = 600.0F;
      break;
    default: // 100ms
      atime = 100.0F;
      break;
  }

  switch (_gain)
  {
    case TSL2591_GAIN_LOW :
      again = 1.0F;
      break;
    case TSL2591_GAIN_MED :
      again = 25.0F;
      break;
    case TSL2591_GAIN_HIGH :
      again = 428.0F;
      break;
    case TSL2591_GAIN_MAX :
      again = 9876.0F;
      break;
    default:
      again = 1.0F;
      break;
  }

  // cpl = (ATIME * AGAIN) / DF
  cpl = (atime * again) / TSL2591_LUX_DF;

  lux1 = ( (float)ch0 - (TSL2591_LUX_COEFB * (float)ch1) ) / cpl;
  lux2 = ( ( TSL2591_LUX_COEFC * (float)ch0 ) - ( TSL2591_LUX_COEFD * (float)ch1 ) ) / cpl;

  // The highest value is the approximate lux equivalent
  lux = lux1 > lux2 ? lux1 : lux2;

  // Signal I2C had no errors
  return (uint32_t)lux;
}

la consulta es:

  • lo que es "cpl"
  • por qué calcular cpl (aunque, relacionado con lo anterior)
  • ¿Qué es "TSL2591_LUX_DF"
  • ¿Qué es "lux1", "lux2" (está relacionado con el infrarrojo? y es visible?).
  • por qué la comparación entre "lux1", "lux2"

cualquier puntero de algoritmo o la física real detrás del cálculo sería útil (me encantaría leer / conocer la física detrás del sensor).

    

1 respuesta

0

Este sensor tiene dos sensores de luz integradores con diferentes respuestas de longitud de onda. El propósito de esta configuración es permitir que el sensor simule la respuesta espectral del ojo humano. El primer cuadro a continuación es la respuesta del ojo humano, el segundo es la respuesta de la hoja de datos del sensor. El cálculo al final con los coeficientes es convertir las salidas del sensor a lux. Lux es lúmenes por m ^ 2, y un lumen se define de acuerdo con la respuesta del ojo humano.

cpl - La idea general es que establece la ganancia para la entrada, luego establece la cantidad de tiempo que el sensor recoge la luz. Cuanto más tiempo seleccione, más luz obtendrá. Una vez que haya completado esto, tendrá un cierto número de recuentos de ADC. Esto tiene que ser escalado por esa ganancia y tiempo de integración. cpl parece ser que la escala "cuenta por lux".

TSL2691_LUX_DF: es difícil decirlo con certeza dada la información, pero parece ser simplemente el valor predeterminado por lux dado un aumento de 1 y un tiempo de integración de 1 ms.

Si desea obtener más información sobre el sensor, vaya al sitio web de AMS y encuentre los documentos técnicos allí. Están bajo los sensores mismos.

Para la física radiométrica, los recursos de Hiperfísica de la Universidad Estatal de Georgia son fantásticos: enlace

    
respondido por el caveman

Lea otras preguntas en las etiquetas