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

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

[复制链接]
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版