你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

模拟量检测计算遇到了奇怪的问题

[复制链接]
shidalin123 提问时间:2019-12-18 13:33 /
我做的是定时器定时采样模拟量(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等)放到函数外变成全局变量后,结果全是错的。
这些问题真的感觉莫名其妙的,麻烦大家帮我看看怎么回事,指点一下,谢谢了
收藏 评论5 发布时间:2019-12-18 13:33

举报

5个回答
mylovemcu 回答时间:2019-12-18 13:54:51
Rms+=temp;

这个赋值以前做一次清零  Rms=0;

另外youxiao = ADC_SourceData[j][0]*(3.3/4095);这个的括号去掉
shidalin123 回答时间:2019-12-18 14:02:43
mylovemcu 发表于 2019-12-18 13:54
Rms+=temp;

这个赋值以前做一次清零  Rms=0;

好的 我试一下
shidalin123 回答时间:2019-12-18 14:14:56
mylovemcu 发表于 2019-12-18 13:54
Rms+=temp;

这个赋值以前做一次清零  Rms=0;

我在每次的for循环前清零,然后把括号去掉真的可以了,可是我不太明白这是为什么啊,能麻烦您解释一下吗,谢谢了
tanic 回答时间:2019-12-18 15:14:47
1.典型的中断内部做大量耗时操作
2.变量定义时记得初始化0
3.典型的栈空间不足导致的计算错误,增加栈大小
4.典型的变量命名不规范,要么全拼音,要么全英文

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

shidalin123 回答时间:2019-12-18 15:27:53
tanic 发表于 2019-12-18 15:14
1.典型的中断内部做大量耗时操作
2.变量定义时记得初始化0
3.典型的栈空间不足导致的计算错误,增加栈大小

嗯嗯 这个应该是初始化的问题,我加了初始化就好了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版