| 
 
| 本帖最后由 shidalin 于 2019-12-18 13:24 编辑 
 我做的是定时器定时采样模拟量(50hz),然后进行均方根运算的程序。采样周期是312us,采样点是64点。
 就是在一个周期内(0.02s)采集64个点,一共有5个通道。采集完5个通道后进入DMA中断,使用均方根公式进行运算。下面是我的中断部分和均方根换算子程序:
 //ADC_DMA中断服务程序
 void DMA1_Channel1_IRQHandler(void)
 {
 if(DMA_GetITStatus(DMA1_IT_TC1) != RESET)
 {
 Get_Adc_Current();
 }
 DMA_ClearITPendingBit(DMA1_IT_TC1);
 }
 void Get_Adc_Current(void){
 u32 j;
 float temp,Rms,youxiao;
 float  temp1,Rms1,youxiao1;
 float  temp2,Rms2,youxiao2;
 ADC_Cmd(ADC1, DISABLE);
 for(j=0;j<64;j++){
 youxiao = ADC_SourceData[j][0]*(3.3/4095);//1.658
 temp=(youxiao-1.65)*(youxiao-1.65);
 Rms+=temp;
 }
 Rms=sqrt(Rms/64);
 voltage = Rms*216;
 /*
 for(j=0;j<64;j++){
 youxiao1 = ADC_SourceData[j][1]*(3.3/4095);//1.658
 temp1=(youxiao1-1.65)*(youxiao1-1.65);
 Rms1+=temp1;
 }
 Rms1=sqrt(Rms1/64);
 currentA = Rms1*2000;*/
 
 for(j=0;j<64;j++){
 youxiao2 = ADC_SourceData[j][2]*(3.3/4095);//1.658
 temp2=(youxiao2-1.65)*(youxiao2-1.65);
 Rms2+=temp2;
 }
 Rms2=sqrt(Rms2/64);
 currentB =Rms2*2000;
 ADC_Cmd(ADC1, ENABLE);
 }
 出现了几个问题:
 1、如果在Get_Adc_Current()程序中只进行1个ADC的换算,结果没有问题;如果把float改成double,那么2组换算的结果都没问题,但是只要进行2个以上的运算,后面的几个模拟量结果就不对。
 2、如果我把Get_Adc_Current()中声明的变量(如temp,Rms,youxiao等)放到函数外变成全局变量后,结果全是错的。
 这些问题真的感觉莫名其妙的,麻烦大家帮我看看怎么回事,指点一下,谢谢了
 | 
 |