我做的是定时器定时采样模拟量(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等)放到函数外变成全局变量后,结果全是错的。 这些问题真的感觉莫名其妙的,麻烦大家帮我看看怎么回事,指点一下,谢谢了 |
这个赋值以前做一次清零 Rms=0;
另外youxiao = ADC_SourceData[j][0]*(3.3/4095);这个的括号去掉
好的 我试一下
我在每次的for循环前清零,然后把括号去掉真的可以了,可是我不太明白这是为什么啊,能麻烦您解释一下吗,谢谢了
2.变量定义时记得初始化0
3.典型的栈空间不足导致的计算错误,增加栈大小
4.典型的变量命名不规范,要么全拼音,要么全英文
评分
查看全部评分
嗯嗯 这个应该是初始化的问题,我加了初始化就好了