值范围映射的算法

时间:2012-10-01 09:33:36

标签: algorithm mapping range

我的问题可能属于一般能力测试或类似的东西。 与嵌入式设备直接相关。

我得到了一个可变的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);

    }

由于

0 个答案:

没有答案