Algoritmo para la asignación de rango de valores

2

Mi pregunta quizás pertenece a la prueba de habilidad general o algo así. No está directamente relacionado con los dispositivos integrados.

Me han dado un registro de variable que puede rotar infinitamente y es de 10kΩ. ADC se establece para el rango de valores de 0 a 1023 muestreos. Por lo cual tengo que controlar la luminosidad / intensidad de la luz.

El rango de valores de ADC se divide en 32 pasos para 1024/32 niveles de brillo. El problema es que el bote debe rotarse 16 veces para llegar a las extremidades. Lo cual es muy acosador. Ahora es el momento en que no puedo cambiar el hardware del bote sino el firmware.

Pensé en hacer lo siguiente, ayúdame desde aquí:

Elegiré una ventana de rango dentro del [0 1023], por ejemplo, de 32 pasos. Vamos a ignorar el ruido del ADC por ahora.

Luego tenemos 32 pasos en esas ventanas de 32 pasos.

Si comienzo desde 0, la intensidad aumentará hasta 32. El 32 es la máxima intensidad posible. Luego, si giro más, la intensidad debería permanecer máxima en 32 hasta 1023.

Y tan pronto como comience a disminuir desde 1023, disminuiré en intensidad hasta (1023-32) y permaneceré en intensidad 0 hasta 0.

si vuelvo a girar desde cualquier lugar, debería seguir la regla de la ventana móvil explicada anteriormente. ¿Cómo empezar con él?

Hice lo siguiente:

 void processADC_data()
 {
        ushort adc0 = (ushort)ADC_DATA;
        adc0_Avg = adc0;

        // If Noise 
        /*
        ushort adc0_L = (ushort)(adc0 - 40);
        ushort adc0_H = (ushort)(adc0 + 40);

        adc0 = (ushort)read_ADC( adc0_L,adc0_H );

        adc0_Avg = adc0 * 20 + adc0_Avg * 80;
        adc0_Avg /= 100;
        */

        IsInceasing = (adc0_last - adc0_Avg) < 0 ;
        adc0_last = adc0_Avg;



        if (IsInceasing)
        {

            // Extrimity has to be handled 
            if (!HasPerformedIncreased)
            {
                adc0_center = (ushort)(adc0_Avg - window);
                HasPerformedIncreased = true;
                HasPerformedDecrease = false;
            }
            else if (HasPerformedIncreased)
            {
                IsCrossingLimit = ( (adc0_Avg - adc0_center) > window );
                if(IsCrossingLimit)
                {
                    adc0_Avg = LIGHT_SENS_MAX;
                    IsCrossingLimit = false;
                }
                else
                {
                    adc0_Avg = (ushort)(adc0_Avg / LIGHT_SENS_MAX);
                }
            }

            //judge_brightness(adc0_Avg);
        }
        else
        {
            // Extrimity has to be handled 
            if (!HasPerformedDecrease)
            {
                adc0_center = (ushort)(adc0_Avg + window);
                HasPerformedDecrease = true;
                HasPerformedIncreased = false;
            }
            else if (HasPerformedDecrease)
            {
                IsCrossingLimit = ( (adc0_center - adc0_Avg) > window );
                if(IsCrossingLimit)
                {
                    adc0_Avg = LIGHT_SENS_MIN;
                    IsCrossingLimit = false;
                }
                else
                {
                    adc0_Avg = (ushort)(adc0_Avg / LIGHT_SENS_MAX);
                }
            }


        }

            brightness(adc0_Avg);

    }

Gracias

    
pregunta Rick2047

2 respuestas

0

en pseudocódigo

// initialization
previous = ADC()
brightness = 0

process ADC:
   new = ADC()
      // must use towards-0 division!
      // divide-by-2 because each 1024/16 turn must give 32 steps
   delta = ( new - previous ) / 2   
   if( delta > 0 ):
      brightness = min( brightness + delta, maximum )
      previous = new
   if( delta < 0 ):
      brightness = max( brightness - delta, minimum )
      previous = new   
    
respondido por el Wouter van Ooijen
0

Suponiendo que tu olla es lineal, podrías medir la tasa de cambio. Luego, incremente (o disminuya) su nivel de brillo como una función del software de la tasa de cambio.

De esta manera, puede hacerlo para que su brillo sea más rápido.

    
respondido por el Toby Jaffey

Lea otras preguntas en las etiquetas