多次采样求平均

2020-01-22 12:17发布

使用51内核的SOC单片机V9401,使用库函数读取电流有效值,送显示,有1%的跳差,想多次采样求平均,提高稳定度,现做想1秒读取一次,读3次然后做个平均,但是程序有点问题,显示不正常了,原来读取直接送显示,正常的while(1)
        {               
                CLRWDT();       
                ReadMeterPara(0x10d9); //秒平均电流有效值
                temp1=u32PMdatal;
                                                if(time_1s)
                                                {
                                                         time_1s=0;
                                                         ReadMeterPara(0x10d9);         
                                                         value_buf[0] = u32PMdatal;
                                                         if(time_2s)
                                                         {
                                                                 time_2s=0;
                                                                ReadMeterPara(0x10d9);
                                                                value_buf[1] = u32PMdatal;
                                                                if(time_3s)
                                                                {
                                                                        time_3s=0;
                                                                        ReadMeterPara(0x10d9);
                                                                        value_buf[2] = u32PMdatal;
                                                                        temp1=(value_buf[0]+value_buf[1]+value_buf[2])/3;
                                                                }
                                                         }
                                                 }       
                        dislay_jisuan();
                if(Time_FLAG)
                {
                        Time_FLAG=0;                       
                    display();                                                                       
             }
        }                       
}


void Interrupt_Timer0 (void) interrupt 1 using 2
{

    TF0=0;
        Time_FLAG=1;
        TL0 =0x33;      //1ms
    TH0 =0xF3;
                coun++;
        if(coun==150)
        {
                coun=0;
                time_1s=1;
                if(coun==150)
                {
                        coun=0;
                        time_2s=1;
                        if(coun==150)
                        {
                                coun=0;
                                time_3s=1;
                        }
                }
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
35条回答
三国小兵
1楼-- · 2020-01-26 06:35
 精彩回答 2  元偷偷看……
三国小兵
2楼-- · 2020-01-26 08:21
lcw_swust 发表于 2014-8-23 11:11
自己多想想,多试试。
上电时,可以把第一次读的数复制到整个数组的每个元素,这样取平均值就没影响了。 ...

想再咨询下,要是建立一个数组,有5个元素,   第一的平均值为(a1);第二次平均(a1+a2)/2;。。第3次平均(a1+a2+a3)/3。。第4次平均(a1+a2+a3+a4)/4。。第5次平均为(a1+a2+a3+a4+a5)/5;这样应该如何操作好的呢  ,然后先进,后出,这样显示值应该更稳定,这样C语言应该如何表述好点呢
三国小兵
3楼-- · 2020-01-26 10:47
babysnail 发表于 2014-8-23 10:58
小白
51这种低端的,最好做优化,像3次这种不科学。最好是2的N次,如 2,4,8,16............ ...

想再咨询下,要是建立一个数组,有5个元素,   第一的平均值为(a1);第二次平均(a1+a2)/2;。。第3次平均(a1+a2+a3)/3。。第4次平均(a1+a2+a3+a4)/4。。第5次平均为(a1+a2+a3+a4+a5)/5;这样应该如何操作好的呢  ,然后先进,后出,这样显示值应该更稳定,这样C语言应该如何表述好点呢
三国小兵
4楼-- · 2020-01-26 11:44
babysnail 发表于 2014-8-23 11:08
举个特殊的例子吧, /256 ,就是把低字节直接去了,根本不用运算

想再咨询下,要是建立一个数组,有5个元素,   第一的平均值为(a1);第二次平均(a1+a2)/2;。。第3次平均(a1+a2+a3)/3。。第4次平均(a1+a2+a3+a4)/4。。第5次平均为(a1+a2+a3+a4+a5)/5;这样应该如何操作好的呢  ,然后先进,后出,这样显示值应该更稳定,这样C语言应该如何表述好点呢
三国小兵
5楼-- · 2020-01-26 14:53
tam2907 发表于 2014-8-23 09:35
加个变量 cnt
中断里 time_1s =1

想再咨询下,要是建立一个数组,有5个元素,   第一的平均值为(a1);第二次平均(a1+a2)/2;。。第3次平均(a1+a2+a3)/3。。第4次平均(a1+a2+a3+a4)/4。。第5次平均为(a1+a2+a3+a4+a5)/5;这样应该如何操作好的呢  ,然后先进,后出,这样显示值应该更稳定,这样C语言应该如何表述好点呢

一周热门 更多>