
文章目錄
- 要求
- 主要代碼分析
要求
測量所產生正弦信號的失真度,正弦波失真度可以定義為全部諧波電壓的有效值與基波電壓的有效值之比并以百分數表示:

測量系統框架如下所示:

利用STM32的DSP庫中的FFT演算法,獲得基波和各諧波分量的電壓,從而計算出失真度;
根據計算出的失真度,調整正弦信號發生器的性能,使產生的正弦信號失真度越小越好,
主要代碼分析
int main(void)
{
unsigned short n,k,j,old_k = 0;
float Vmax,old_Vmax,Vo,temp=0,u;;
system_init();
printf(" \r\n\r\nFrequence Analysis starting...\r\n");
while(1)
{
for(n=0;n<N;n++)
{
// delay(72);//經示波器分析,采樣間隔接近10us,采樣頻率接近102.4kHz,頻率分辨力接近100Hz
delay(288); //經示波器分析,頻率分辨力接近27Hz 方波理想1.4KHZ以上,正弦波是7KHZ以上
// delay(440);
data_in[n] = ((signed short)ADC_GetConversionValue(ADC1))<<16;
}
cr4_fft_1024_stm32(data_out, data_in, N);
GetPowerMag();
k = GetMaxMag();
//測失真度代碼
for(j=2;j*k<N/2;j++)
{
//考慮頻譜泄漏
temp+=( Mag[j*k]+ Mag[j*k+1]+ Mag[j*k-1] ) * ( Mag[j*k]+ Mag[j*k+1]+ Mag[j*k-1] );
}
temp=sqrt(temp);
u=temp*100/( Mag[k]+ Mag[k+1]+ Mag[k-1] );
Vmax = Mag[k]*3.3/4096;
//考慮頻譜泄漏后的電壓
Vo = (Mag[k]+Mag[k+1]+Mag[k-1])*3.3/4096-3;
if( k!=old_k || fabs(Vmax - old_Vmax)/Vmax > 0.05) //監測到頻率有變化,重繪顯示資料
printf(" The frequence of input signal is %d Hz. Vmax = %.2fV Vo = %.2fV U=%.2f %% \r\n\r\n",k*27,Vmax,Vo,u);
old_k = k;
old_Vmax = Vmax;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259560.html
標籤:其他
