我的问题可能属于一般能力测试或类似的东西。 不与嵌入式设备直接相关。
我得到了一个可变的resister,它可以无限旋转,并且是10Ω
。 ADC的值范围为0到1023采样。通过它我可以控制光亮度/强度。
对于1024/32
亮度级别,ADC值范围分为32个步骤。问题是锅必须旋转16次才能到达四肢。这是非常骚扰。现在是时候我不能改变底座硬件而是固件了。
我想做的如下,请从这里帮助我:
我将在[0 1023]中选择一个范围窗口,比如32步。让我们暂时忽略ADC噪声。
然后我们在32步窗口中有32个步骤。
如果我从0开始,强度将增加到32. 32是可能的最大强度。然后,如果我旋转更多,强度应保持最大值32到1023。
一旦从1023开始减少,我的强度会降低到(1023-32)并且一直保持在0强度直到0。
如何开始呢?
伪代码:
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);
}
由于