【问题标题】:Detect peak value from real time data in an array从数组中的实时数据中检测峰值
【发布时间】:2020-12-29 00:12:39
【问题描述】:

我已使用 dsPIC33FJ32MC204 控制器将幅度为 3V 的正弦波连接到 12 位 ADC 通道,并存储在一个阵列中。我想检测每个间隔的峰值,所以请给我任何建议。我刚刚发布了五个样本中最大值检测的逻辑。我的输出为零。



void read_adc_Voltage()
{
     int arr[100];
     int arr1[100];
    int max = arr[0];
    arr[0]=0;
    int i,j=0;
    int count = 6;
     
     
       
         for (i=1;i<count;i++)
         {
             var=(ain1Buff[sampleCounter]);
             voltage=var*((float)3.3/(float)4095);
             arr[j] = voltage;
            
             if(arr[j] > max)
            {
                max = arr[j]; 
                }
             j++;
         }
             sprintf(data1,"%.2f",max);
             LCD_String_xy(1,1,data1);
             
            sampleCounter++;
            
            if(sampleCounter==6)    
            {
              sampleCounter=0;
              
            }
            
}  
 
 

【问题讨论】:

    标签: mplab dspic proteus


    【解决方案1】:

    用峰值和间隔等各种术语定义您的意思,并询问或决定并指定您对其他条件的标准。

    只要 SampleValue 大于该时间间隔内的前一个 MaxValue,您就可以通过更新 MaxValue 来跟踪最大值。与 MinValue 类似。

    例如,您的峰值标准是 SampleValue 应该上升一定量,然后下降一定量吗?还是 SampleValue 应该超过某个固定的阈值?或者更复杂的东西?当信号电平随噪声波动时,它们会产生不同的后果;您可能需要设置初始条件;并且也许要考虑系统是否可以锁定到诸如阈值太高或太低之类的不良条件。解决方案越复杂,出现不良条件的机会就越多,因此 KISS。

    当有新的间隔时,同样的考虑因素。是固定时间吗? - 使用计时器。它与采样频率有关吗? - 计算样本数。是在每个高峰之后开始,也许以最小的间隔开始吗? - 在每个峰值之后重置您的计时或计数以及 MaxValue 和 MinValue,并在您的 MinTime 或 MinCount 被通过之前禁止确定峰值。

    使用最简单的解决方案来处理您的信号,同时考虑噪声等。如果你允许它可能会变得相当复杂。

    【讨论】:

    • 感谢您的回复先生。这里的峰值意味着在不使用任何阈值的情况下检测五个样本中的最大值,并且间隔只是五个样本,在五个样本之后我的数据正在重复。所以我只想检测存储在数组中的五个样本中的最大值。
    • 我刚刚添加了五个样本中最大值检测的逻辑,请通过它并给我建议。
    • 如果数据在一个数组中,也许你可以单步调试它?如果不这样做,我永远不会有信心。否则,也许其他人会比我更好地解释编写代码的最佳方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2018-12-03
    • 2012-08-28
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多