我已经使用dsPIC33FJ32MC204控制器连接了一个振幅为3V的正弦波,该正弦波在0到12位ADC通道上移动了1.5V,并存储在阵列中。我想检测每个间隔的峰值,所以请给我任何建议。我刚刚发布了五个样本中最大值检测的逻辑。我得到的输出为零。
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;
}
}
定义峰值和间隔等各种术语的含义,并询问或决定并指定其他条件的标准。
只要SampleValue大于该间隔中的上一个MaxValue,就可以通过更新MaxValue来跟踪最大值。与MinValue类似。
例如,您的峰值标准是SampleValue应该上升一定量,然后下降一定量吗?还是SampleValue应该超过某个固定阈值?或者更复杂的东西?当信号电平随噪声波动时,它们将产生不同的后果;您可能需要设置初始条件;并且可能考虑系统是否可以锁定到诸如阈值过高或过低之类的不希望的状况。解决方案越复杂,出现不良情况的机会就越多,因此KISS。
当有新的间隔时,也要考虑同样的问题。是固定时间吗?-使用计时器。它与采样频率有关吗?-统计样本数量。它是在每个峰值之后开始的吗,也许有一个最小的间隔?-在每个峰值之后重置您的计时或计数以及MaxValue和MinValue,并禁止确定峰值,直到您的MinTime或MinCount通过。
使用最简单的解决方案来处理您的信号,并将噪声等因素考虑在内。如果你听之任之,可能会变得相当复杂。