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