打印

mega16 AD采样的馒头波电压信号 要求有效值,要如何编写

[复制链接]
2612|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
avrgb|  楼主 | 2016-9-22 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有效值计算,AD采样 值为0~1023变化,要求均方根,但发现普通的写法出来的值一直跳动(用电位器一个固定电压模拟),有没有好的写法
uint ad[6][25];
uint adavg[5];
float adRMS;
unsigned long int adrms[5];

void ADC_countRMS(uchar chan)
{
         adrms[chan]=0;
         for(adcal=0;adcal<=25;adcal++)
         {
                  adrms[chan] = adrms[chan]+ad[chan][adcal]*ad[chan][adcal];
         }
         adrms[chan] = adrms[chan]/26;
         adRMS = sqrt(adrms[chan]);
         adRMS = adRMS/3*2;
}

相关帖子

沙发
avrgb|  楼主 | 2016-9-24 16:19 | 只看该作者
今天又发现个问题 ADC 采样我用定时器1触发 大概0.192ms触发一次ADC,AD转换时间大概是0.133ms(12M晶振,ADC为187500HZ,定时器为46875HZ),4个通道轮询,放在ad【1~4】【0~31】的数组里面,但发现有那么一刻通道2采的通道1的数,通道1采的通道4.。。。。就那么一刻,下面是通道赋值代码,暂时没看出什么问题
#pragma interrupt_handler ADC_read:15
void ADC_read()
{
     if(flag > 128)
         {
           flag = 1;
         }//判断进入中断次数,用于计算存放位置
         addata = ADCL;
         addata = addata+ADCH*256;
         ad[chan-1][(flag-1)/4] = addata;
         if(chan > 4)//判断通道选择,同时确定第几组数组
         {
           chan = 1;
         }
         ADC_chanslt(chan++);
         flag++;
}

使用特权

评论回复
板凳
avrgb|  楼主 | 2016-9-26 08:07 | 只看该作者
问题已解决~是超出数组定义范围,但有效值仍需要思考

使用特权

评论回复
地板
avrgb|  楼主 | 2016-9-27 14:43 | 只看该作者
解决完毕,有效值计算是数组类型问题,计算时已经溢出

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

29

帖子

0

粉丝