CreativeLau/Mini-DSO

一些计算细节的原理疑问?

HangX-Ma opened this issue · 1 comments

老刘你好,我在学习您的示波器代码的时候对以下几个计算公式感到了一些困惑,它们没有数学公式的说明,难以理解这样处理的缘由,希望您能给予解答。

  • 问题1:在chart.c的AnalyseData()函数中,处理当前选择Option_MeaWay_AC方式进行测量的处理中,对DC输入您是用Mvoltage_Aver += (VMax_m + VMin_m) >> 1进行处理,但是AC部分却做了如下复杂计算,这个计算的依据是什么?
    0ZM82.png

  • 问题2:回头再看VMax_m VMin_m,它们同样经过了一些处理,除此之外,它们是通过adcMax-BiasVoltage以及adcMin-BiasVoltage转换得到,BiasVoltage默认值为8900我原来猜测是4092满量程的偏移,但这个值还是让我感到困惑。
    0jQug.png

  • 问题3:关于频率计算方面,您给了一个 $Waveform_{freq}=25000(ms)/(Range \times Interval)$ or $25000000(us)/(Range\times Interval)$ 的公式,25000 or 25000000这个基准值为什么这么选取?是与缓存大小相关吗?
    0je3t.png

    switch (ScaleH)
    {
    case 0:                                      //500ms
        WaveFreq = 50.0f / (float)WaveLength + 0.5; //WaveFreq=25000/(500*WaveLength);
        break;

    case 1:                          //200ms
        WaveFreq = (125.0f / (float)WaveLength); //WaveFreq=25000/(200*WaveLength);
        break;

    case 2:                          //100ms
        WaveFreq = (250.0f / (float)WaveLength); //WaveFreq=25000/(100*WaveLength);
        break;

    case 3:                          //50ms
        WaveFreq = (500.0f / (float)WaveLength); //WaveFreq=25000/(50*WaveLength);
        break;

    case 4:                           //20ms
        WaveFreq = (1250.0f / (float)WaveLength); //WaveFreq=25000/(20*WaveLength);
        break;

    case 5:                           //10ms
        WaveFreq = (2500.0f / (float)WaveLength); //WaveFreq=25000/(10*WaveLength);
        break;

    case 6:                           //5ms
        WaveFreq = (5000.0f / (float)WaveLength); //WaveFreq=25000/(5*WaveLength);
        break;

    case 7:                            //2ms
        WaveFreq = (12500.0f / (float)WaveLength); //WaveFreq=25000/(2*WaveLength);
        break;

    case 8:                            //1ms
        WaveFreq = (25000.0f / (float)WaveLength); //WaveFreq=25000/(1*WaveLength);
        break;

    case 9:                            //500us
        WaveFreq = (50000.0f / (float)WaveLength); //WaveFreq=25000000/(500*WaveLength);
        break;

    case 10:                            //200us
        WaveFreq = (125000.0f / (float)WaveLength); //WaveFreq=25000000/(200*WaveLength);
        break;

    case 11:                            //100us
        WaveFreq = (250000.0f / (float)WaveLength); //WaveFreq=25000000/(100*WaveLength);
        break;
    }
  • 问题4:在问题3中得到的$Waveform_{freq}$您又做了如下计算,这样做的目的以及依据是什么?
    0jUD1.png
WaveFreq = (float)WaveFreq /  (0.0162f * (log10(WaveFreq) /log10(2.7) ) + 0.9398f);

@CreativeLau 谢谢!