关闭AD在DMA中断完成。程序的设计思路如下:发送一个频率值à延迟一个时间à启动ADà等待AD采集完毕à对采集的数据进行均值滤波à存储滤波后的幅值à发送下一个频率值à重复上述步骤知道扫频完毕。 问题正如一开始所描述的那样,只有上电的时候第一次采样得到的频率值是正确的,以后都比正确值要多10KHZ,表现在程序上就是往后移了一个点。 分析:由于在DMA中断中不仅关闭了软件触发,而且还清零了ADON位,就相当于给ADC断了电,这样在下一轮频率扫描的时,发送第一个频率值后置位ADON相当于给AD上电,但由于迟延,并不会进行数据转换,这样就解释了为什么上电的时候(因为初始化置位了ADON,即ADC上电了)数据是正确的,而以后则推迟一个频点! 后更改如下: for (fre=start,i=0; fre<=end; fre+=step,i++) { #ifdef SERIAL_LOAD DDS_SerialSendData(fre); #else DDS_SendData(fre); #endif OSTimeDlyHMSM(0,0,0,7); //ADC_Cmd(ADC1, ENABLE); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_DMA_Flag); if (ADC_DMA_Flag==1) { ADC_DMA_Flag = 0; Fre_Amplitude=Filter_Average(ADC_FreAmplitude,NUM_OF_SAMPLE); } } 同时将中断中只关闭软件触发,而不清零ADON位。 这里还有一点要注意,发送频点到开启软件触发AD采样的延时应该为多少?起初我设置了OSTimeDlyHMSM(0,0,0,1);即1ms。但采样回来的数据不正确,后来经过调试,改成延时7ms即:OSTimeDlyHMSM(0,0,0,7);这样数据就正确了。这里主要考虑整个系统的响应时间,即从AD9851发送频率,经过混频、滤波、放大再到有效值检波的整个时间。当然如果是7ms的话,从1MHZ以10KHZ步进扫到30MHZ就需要7ms*2901=20307ms=20.307S!!这个时间是比较长的。暂时没有想到什么办法解决。
|