搜索
bottom↓
回复: 114

真有效值的计算

  [复制链接]

出0入0汤圆

发表于 2012-3-28 09:52:37 | 显示全部楼层 |阅读模式
请教一下高手真有效值的计算,最好有C例程可供参考。比如我一个周波内用AD等间格采样到64个不同的电压值怎样换算成真有效值。或者有没有更好的采样方法。最好有例程。

出0入0汤圆

发表于 2012-4-14 20:59:06 | 显示全部楼层
这个不太清楚,也想知道一下!

出0入0汤圆

发表于 2012-4-14 21:22:22 | 显示全部楼层
本帖最后由 zb05022005 于 2012-4-14 23:33 编辑

64个电压值的平方和再开根号就是真有效值了
========编辑一下=========
上面说错了,在开根号之前还要再平均一下,即:
64个电压值的平方和除以64,然后再开根号就是真有效值了

出0入0汤圆

发表于 2012-4-14 22:36:55 | 显示全部楼层
uint16_t isqrt32(uint32_t x)
{
  uint32_t m, y, b;
  m = 0x40000000;
  y = 0;
  while (m != 0) {
    b = y | m;
    y = y >> 1;
    if (x >= b) {
      x = x - b;
      y = y | m;
    }
    m >>= 2;
  }
  return y;
}

uint16_t rms(uint16_t * ptr)
{
  uint64_t t = 0;
  uint16_t i;

  for (i = 0; i < BUF_SIZE; i++)
    t += (uint32_t) * ptr * (uint32_t) * ptr;
  return (isqrt32(t / BUF_SIZE));
}

出0入0汤圆

 楼主| 发表于 2012-4-16 09:09:56 | 显示全部楼层
i55x 发表于 2012-4-14 22:36
uint16_t isqrt32(uint32_t x)
{
  uint32_t m, y, b;

谢楼上了,能说一下你的两个函数的入口参数和出口参数吗!先看了一下看的似懂非懂的。

出0入0汤圆

发表于 2012-4-16 10:54:58 | 显示全部楼层
本帖最后由 sleet1986 于 2012-4-16 10:57 编辑
以前的ID被封 发表于 2012-4-16 09:09
谢楼上了,能说一下你的两个函数的入口参数和出口参数吗!先看了一下看的似懂非懂的。 ...


这个很明显吧,一个是开根号的函数,另外一个就是有效值的函数了。有效值里面用到开根号函数,不过第二个函数求和的时候有问题的,指针没移动。

出675入8汤圆

发表于 2012-4-16 11:00:11 | 显示全部楼层
这个开根号的函数有点意思

出0入0汤圆

发表于 2012-4-16 11:08:52 | 显示全部楼层
给楼主我项目里曾经用的函数:(绝对可用)
需要采集和处理的正弦波如图所示。
算法:方均根
一个周期内采集n个采样值,分别为a0,a1,a2``````an
那么有效值可以用方均根来计算,即:
有效值=开平方[(x0*x0+ x1*x1+x2*x2`````````+ xn*xn)/n ]
其中xn=an-中间值
比如avr用10位AD的话,an采样值800,则相应的xn为(800-512)=288,是有符号数,512为10位AD时的中间值


测试程序:
unsigned int sqrt_16(unsigned long M)
{
  unsigned int N, i;
  unsigned long tmp, ttp;
  if (M == 0)
  return 0;
  N = 0;
  tmp = (M >> 30);
  M <<= 2;
  if (tmp > 1)
  {
      N ++;
      tmp -= N;
  }
  for (i=15; i>0; i--)
  {
      N <<= 1;
      tmp <<= 2;
      tmp += (M >> 30);
      ttp = N;
      ttp = (ttp<<1)+1;
      M <<=2;
      if(tmp>=ttp)
      {
              tmp-=ttp;
              N++;
      }
  }
  return N;
}

int square_sum_average(int *p, int n)
{
        long int square_sum_average=0;
        long int square_sum=0;
        int i;
        for(i=0;i<n;i++)
        {
            square_sum+=(*(p+i))*(*(p+i));
        }
        square_sum_average=square_sum/n;
        square_sum_average=sqrt_16(square_sum_average);
        return square_sum_average;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-4-16 11:19:44 | 显示全部楼层
需要严格控制一个周期的时间,否则会加大误差;
SUM = Dat[0]^2 + Dat[1]^2 +...+Dat[n-1]^2; 所有数据的平方和
Out = sqrt(Sum / n); 平方和取平均值,在开平方

出0入0汤圆

发表于 2012-4-16 11:22:03 | 显示全部楼层
补充一点,平方和变量一定要满足最大要求,这个数通常会很大,如果对实时性和速度要求不严的话建议用浮点数

出0入0汤圆

 楼主| 发表于 2012-4-16 11:45:48 | 显示全部楼层
uint16_t rms(uint16_t * ptr)的参数就是AD等间格采样的值。别外楼上几位的公式都是书本上的理论上可以。但实际中那个sqrt(Sum / n); 是很费时的会占用大量资源。在多路高速实时采样的的情况下是不是很难实现。由其是单片机做控制的情况下资源是很有限的。

出0入0汤圆

发表于 2012-4-16 12:29:36 | 显示全部楼层
4楼这个isqrt函数是坛子里面旧帖子里面,效率非常高,我用1Msps采样率12bit精度,边采边算,算的比采集的速度还快。

出0入0汤圆

发表于 2012-7-25 17:14:50 | 显示全部楼层
MARK一下,学习了

出0入0汤圆

发表于 2012-9-5 11:54:17 | 显示全部楼层
先mark一下

出0入0汤圆

发表于 2012-9-11 10:45:22 | 显示全部楼层
新手,学习一下哈

出0入0汤圆

发表于 2012-9-11 10:48:36 | 显示全部楼层
算法很好,学些下

出0入0汤圆

发表于 2012-9-11 11:11:09 | 显示全部楼层
这个很实用的。。顶!

出0入0汤圆

发表于 2012-9-11 11:18:33 | 显示全部楼层
MARK!以后可能 会用到

出0入0汤圆

发表于 2012-9-18 11:04:52 | 显示全部楼层
为什么送入的不是当前AD采样电压值 而是送AD值??

难道是求AD的均方根,然后再把结果转化成电压就是有效值了吗?

出0入0汤圆

发表于 2012-10-9 09:48:24 | 显示全部楼层
学习了。

出0入13汤圆

发表于 2012-10-9 11:17:03 | 显示全部楼层
这个很有用,收下了

出0入0汤圆

发表于 2012-10-13 20:52:43 | 显示全部楼层
需要严格控制一个周期的时间,否则会加大误差;
SUM = Dat[0]^2 + Dat[1]^2 +...+Dat[n-1]^2; 所有数据的平方和
Out = sqrt(Sum / n); 平方和取平均值,在开平方

出0入0汤圆

发表于 2012-10-13 21:01:00 | 显示全部楼层
schwarz 发表于 2012-4-16 12:29
4楼这个isqrt函数是坛子里面旧帖子里面,效率非常高,我用1Msps采样率12bit精度,边采边算,算的比采集的速 ...

比系统自带的sqrt()高吗?还真没研究这么细致。

出0入0汤圆

发表于 2012-10-13 21:06:37 | 显示全部楼层
uint16_t isqrt32(uint32_t x)
{
  uint32_t m, y, b;
  m = 0x40000000;
  y = 0;
  while (m != 0) {
    b = y | m;
    y = y >> 1;
    if (x >= b) {
      x = x - b;
      y = y | m;
    }
    m >>= 2;
  }
  return y;
}
这个函数要仔细研究下。

出0入0汤圆

发表于 2012-10-13 21:09:40 | 显示全部楼层
Sullivan 发表于 2012-10-13 21:01
比系统自带的sqrt()高吗?还真没研究这么细致。

uint16_t isqrt32(uint32_t x)
{
  uint32_t m, y, b;
  m = 0x40000000;
  y = 0;
  while (m != 0) {
    b = y | m;
    y = y >> 1;
    if (x >= b) {
      x = x - b;
      y = y | m;
    }
    m >>= 2;
  }
  return y;
}

出0入0汤圆

发表于 2012-10-13 21:22:25 | 显示全部楼层
学习啊,真有效值

出0入0汤圆

发表于 2012-10-13 21:59:52 | 显示全部楼层
记号一下,开方算法。

出0入0汤圆

发表于 2012-10-13 22:03:24 | 显示全部楼层
uint16_t isqrt32(uint32_t x)
{
  uint32_t m, y, b;
  m = 0x40000000;
  y = 0;
  while (m != 0) {
    b = y | m;
    y = y >> 1;
    if (x >= b) {
      x = x - b;
      y = y | m;
    }
    m >>= 2;
  }
  return y;
}

这个函数很精致,求旧帖链接,学习一下。

出0入0汤圆

发表于 2012-10-13 22:21:23 | 显示全部楼层
zuu0 发表于 2012-9-18 11:04
为什么送入的不是当前AD采样电压值 而是送AD值??

难道是求AD的均方根,然后再把结果转化成电压就是有效值了 ...

这是个定标问题,数字来运算最后乘以一个系统就映射到真实值了。采样的时候最好做锁相,把采样频率锁定要待测信号,保证采样到整数个周期,要不出来的数据跳动比较大。

出0入0汤圆

发表于 2012-10-13 22:23:49 | 显示全部楼层
http://www.amobbs.com/forum.php? ... 0%E5%B9%B3%E6%96%B9

http://www.amobbs.com/forum.php? ... 0%E5%B9%B3%E6%96%B9

上述二帖中都提到一个开平方并求倒数的算法:

下面这个求1/\sqrt{x}的函数号称比直接调用sqrt库函数快4倍,来自游戏Quake III的源代码。

float InvSqrt(float x){
    float xhalf = 0.5f * x;
    int i = *(int*)&x;
    i = 0x5f3759df - (i >> 1);
    x = *(float*)&i;
    x = x * (1.5f - xhalf * x * x);
    return x;
}

如果使用这个程序,先得到1/sqrt(x),那么将结果再乘以x自身,就应得到浮点数开平方:
1/sqrt(x) * x = sqrt(x)。

出0入0汤圆

发表于 2012-10-13 22:38:00 | 显示全部楼层
本帖最后由 xizi 于 2012-10-14 01:07 编辑

http://www.amobbs.com/forum.php? ... 0%E5%B9%B3%E6%96%B9

这个链接中提到sqrt。
unsigned short sqrt(unsigned long a){
  unsigned long rem = 0;
  unsigned long root = 0;
  unsigned long divisor = 0;
  for(int i=0; i<16; i++){
    root <<= 1;
    rem = ((rem << 2) + (a >> 30));
    a <<= 2;
    divisor = (root<<1) + 1;
    if(divisor <= rem){
      rem -= divisor;
      root++;
    }
  }
  return (unsigned short)(root);
}

出0入0汤圆

发表于 2012-10-13 22:50:35 | 显示全部楼层
似乎来自这个帖子:

http://www.amobbs.com/forum.php? ... 0%E5%B9%B3%E6%96%B9

unsigned int insqrt(unsigned long a)
{
    unsigned long i,c;
    unsigned long b = 0;
    for(i = 0x40000000; i != 0; i >>= 2)
    {
        c = i + b;
        b >>= 1;
        if(c <= a)
        {
            a -= c;
            b += i;
        }
    }
    return (unsigned int)b;
}
网上可以找到的  16位的和32位的稍有不同

出0入0汤圆

发表于 2012-10-14 00:54:07 | 显示全部楼层
本帖最后由 xizi 于 2012-10-14 01:25 编辑

没有找到12楼提到的关于4楼程序的旧帖。
但32楼的程序与4楼的程序很接近,也很精致。

出0入0汤圆

发表于 2012-10-14 01:09:55 | 显示全部楼层
而31楼的程序中,每次循环都做a >> 30,移位次数明显多于4楼或32楼的程序。

出0入0汤圆

发表于 2012-10-14 01:23:51 | 显示全部楼层
可否得出这样的结论:
32楼的程序 “略优于” 4楼的程序 “优于” 31楼的程序 “远优于” lib中的sqrt。

出0入0汤圆

发表于 2012-10-14 02:43:19 | 显示全部楼层
啥玩意都用软件实现 你觉得这样能到达满意的效果么…… 啥玩意都用软件 是典型的孩子气 …… 这样既加大了处理器的运算负担 又增加了测量响应时间,而且对不规则的高频波形效果还不好……而且受制于你ad的采样速率…… 直接用一片ad536 ad736啥的不就解决了……

出0入300汤圆

发表于 2012-10-14 03:08:21 | 显示全部楼层
楼上讲话稍有不妥,其实用软件也没什么错.
不过如果是我,坚决ad536,因为软件我不灵.

出0入0汤圆

发表于 2012-10-14 08:44:07 | 显示全部楼层
记号,备查

出0入0汤圆

发表于 2012-10-14 23:06:51 | 显示全部楼层
ibmx311 发表于 2012-10-14 03:08
楼上讲话稍有不妥,其实用软件也没什么错.
不过如果是我,坚决ad536,因为软件我不灵. ...

我是纯业余的所以可能说的有点欠妥? 但是从我的角度一看感觉是学生问的问题,现在中国的学生就知道用单片机,别的啥都不知道,连最基本的模电基础都不知道就各种想设计高科技,啥玩意都用软件实现,问题是软件不是万能的……很多事不是说给个高低电平采个ad就能实现的…… 还要考基础电路来解决问题……现在的孩子见世面太窄,思维严重定式化……我虽然也是今年刚毕业的,就是一个纯业余的电子爱好者,之前也没咋来过这个论坛,本想进来学习一下,但是注册一个星期了 我回复了六十多个帖子,多数是指导性的内容…在这学到的还没我教出去的多… 发现这里绝多数都是在校学生,而且多数都是在琢磨单片机那点事,而且还没琢磨利索,而且通病也是一样的,就是基础严重不牢却都在忙着上层建筑。啥玩意都是高低电平和代码解决,不知道用模拟方式和硬件电路解决。说白了还是思路受限的问题。

出0入0汤圆

发表于 2012-10-15 00:12:22 来自手机 | 显示全部楼层
xizi 发表于 2012-10-14 01:23  可否得出这样的结论:  32楼的程序 “略优于” 4楼的程序 “优于” 31楼的程序 “远优于” lib中的sqrt。 ...

lib里和上面快四倍的那个(卡马克)是浮点数开方,这里的快速算法是整形开方,两者之间没有可比性。

出0入0汤圆

发表于 2012-10-15 08:18:24 | 显示全部楼层
bh4ilp 发表于 2012-10-14 23:06
我是纯业余的所以可能说的有点欠妥? 但是从我的角度一看感觉是学生问的问题,现在中国的学生就知道用单 ...

这番话非常同意。借用一句广告语:Analog is everywhere.

出0入0汤圆

发表于 2012-10-15 08:20:27 | 显示全部楼层
flagyan 发表于 2012-10-15 00:12
lib里和上面快四倍的那个(卡马克)是浮点数开方,这里的快速算法是整形开方,两者之间没有可比性。 ...

请教:这几个算法精度如何?有效数字哪个高?

出0入8汤圆

发表于 2012-10-15 08:59:34 | 显示全部楼层
学习。。。。。。。。

出0入0汤圆

发表于 2012-10-16 11:30:14 | 显示全部楼层
bh4ilp 发表于 2012-10-14 23:06
我是纯业余的所以可能说的有点欠妥? 但是从我的角度一看感觉是学生问的问题,现在中国的学生就知道用单 ...


你每个帖子都自称自己是业余的,而且也是刚大学毕业的,

然后驾临本论坛给一帮子无知的学徒做了指点。

话说,这话语态度如果莫大看到会如何?

论坛就是来学习交流的地方,发现问题,解决问题,如果问题都不存在了,论坛就只有吹水功能了,但其实吹水也是解决问题的一种。

看您的解释确实有一定水平,但你这态度只让人感到你在装!

出0入0汤圆

发表于 2012-10-16 12:32:42 | 显示全部楼层
这个要看你采样的有效值的频率范围大概在多少范围去确定你的采样频率,我之前采50HZ的交流信号用2000HZ的采样频率才确保了精度,将这些点求平方再积分再除以周期,便是所谓的真有效值,我建议你使用真有效值芯片,当芯片将真有效值直接转换成直流信号,AD直接采就可以了..如果有问题可以联系我,我做过类似的东西。邮箱elefankf@gmail.com

出0入0汤圆

发表于 2012-10-16 15:14:40 | 显示全部楼层
prefilon 发表于 2012-10-16 11:30
你每个帖子都自称自己是业余的,而且也是刚大学毕业的,

然后驾临本论坛给一帮子无知的学徒做了指点。

我装什么了?技术讨论还能看出装来?不懂装懂叫装,你看我那个回复没说到点上?我每个回复都自称业余是因为这里是专业论坛,我作为业余级别选手在这里解答问题很多事情没有亲自验证过,不保证完全正确,同也怕出现大的错误而被当成专业人员遭到鄙视……

出0入0汤圆

发表于 2012-10-16 15:52:30 | 显示全部楼层
bh4ilp 发表于 2012-10-16 15:14
我装什么了?技术讨论还能看出装来?不懂装懂叫装,你看我那个回复没说到点上?我每个回复都自称业余是因 ...

任何人都会犯错误,提出问题就是为了解决问题,即便观点错了天又不会塌下来,而且你回答的确实有道理,有水准,但有个地方欠妥的就是,不要总是点明自己是业余以这样的姿态嘲讽“专业”的。

出0入0汤圆

发表于 2012-10-16 15:53:23 | 显示全部楼层
mark 谢谢楼主

出0入0汤圆

发表于 2012-10-16 15:53:33 | 显示全部楼层
本帖最后由 Crazy_Rain 于 2012-10-16 15:54 编辑
bh4ilp 发表于 2012-10-16 15:14
。。。同也怕出现大的错误而被当成专业人员遭到鄙视…….


没见到有谁鄙视你,却经常可以看到你在主动鄙视别人。。

据我所知,坛里像你这样从小就做技术,并且成绩斐然的人不少。

论技术,我不好说谁高谁低,但至少他们比你会做人。他们懂得低调,不会把自己过去的东西搬出来炫耀,因为他们知道过去不代表现在,更不代表将来;他们懂得尊重别人,不会因为别人的技术不如自己而讽刺挖苦别人,因为他们知道“尺有所短,寸有所长”的道理;他们也懂得做人最基本的礼貌,不会在别人面前口口声声说自己业余,但口气却给人感觉比谁都高傲

这些东西,有人教过你吗?

你是否会经常觉得自己虽然很NB,但却无法融入你周围的人群呢?想想这些问题吧

出0入0汤圆

发表于 2012-10-16 16:11:39 | 显示全部楼层
prefilon 发表于 2012-10-16 15:52
任何人都会犯错误,提出问题就是为了解决问题,即便观点错了天又不会塌下来,而且你回答的确实有道理,有 ...

我从来都是就事论事,只是在大的方向上提出一点建议就被认为是嘲讽……那你们的承受力真是太弱了……

出0入0汤圆

发表于 2012-10-16 16:13:10 | 显示全部楼层
bh4ilp 发表于 2012-10-16 16:11
我从来都是就事论事,只是在大的方向上提出一点建议就被认为是嘲讽……那你们的承受力真是太弱了…… ...

建议去看一下人大金正昆教授的一些讲座,你会受益匪浅的。

出0入0汤圆

发表于 2012-10-16 16:15:20 | 显示全部楼层
Crazy_Rain 发表于 2012-10-16 15:53
没见到有谁鄙视你,却经常可以看到你在主动鄙视别人。。

据我所知,坛里像你这样从小就做技术,并且成绩 ...

我从来没有炫耀之意……也没任何炫耀的资本,我只是在大方向上提点建议就被认为是高傲的表现…… 这就是你们面对建议的狭隘眼光……

出0入0汤圆

发表于 2012-10-16 16:35:03 | 显示全部楼层
prefilon 发表于 2012-10-16 16:13
建议去看一下人大金正昆教授的一些讲座,你会受益匪浅的。

做人之道 每个人都不同 金正昆讲的那些以礼仪为主,早就都看过了,你要是懂得礼仪还会人身攻击?搞技术的就应该直来直去有啥说啥才是严谨的态度,啥都绕个弯 含蓄一下 怎么能保证别人领悟到真正的用意?

出0入0汤圆

发表于 2012-10-16 17:47:41 | 显示全部楼层
好吧,我来总结一下。

现在技术发展的特点就是数字化,模拟量尽快数字化,然后用软件进行处理,模拟电路的生存空间越来越被数字电路压缩,这是一个很明显的趋势。AD536这样的芯片更是没有生存空间,最近十多年新设计的电路,除了万用表有功耗的考虑用AD737这样的芯片以外,根本没有用真有效值IC的。随便一个电能表芯片,内置多个300~500ksps的ADC,算什么真有效值轻而易举,只是很多功能中一个微不足道的。最关键的是电能表芯片要比真有效值IC便宜!现在随着STM32内置1Msps强大ADC的芯片的单片机越来越便宜,电能表芯片的生存空间也被他压缩。

一个好的工程师,应该在性能和成本之间找到最佳的权衡,那些只会卖弄自己知道AD536这个片子的,早晚进历史垃圾堆里面。

出0入300汤圆

发表于 2012-10-16 18:56:48 | 显示全部楼层
i55x 发表于 2012-10-16 17:47
好吧,我来总结一下。

现在技术发展的特点就是数字化,模拟量尽快数字化,然后用软件进行处理,模拟电路的 ...

是的没有错,像我这种单片机不灵的,已经自觉地跳进了历史的垃圾堆

出0入0汤圆

发表于 2012-10-16 20:30:01 | 显示全部楼层
i55x 发表于 2012-10-16 17:47
好吧,我来总结一下。

现在技术发展的特点就是数字化,模拟量尽快数字化,然后用软件进行处理,模拟电路的 ...

这话说的就有点难听了,什么叫卖弄,有现成的性能好的芯片不用非要编程序自己采,而且还不能保证精准度,而且对于高频的复杂波形的信号将非常占用系统资源,电能表只是针对一个正弦波,踩个峰值简单算一下就行了当然用不着专用芯片,如果楼主的rms 也是针对正弦波的话当然也用不到专用芯片了,但是针对复杂的高频任意波形对ad的速度和精度一级运算性能要求都搞很多!

出0入0汤圆

发表于 2012-10-16 21:20:09 | 显示全部楼层
bh4ilp 发表于 2012-10-16 20:30
这话说的就有点难听了,什么叫卖弄,有现成的性能好的芯片不用非要编程序自己采,而且还不能保证精准度, ...

你是既不懂电能表芯片也不懂真有效值芯片,你这超低水平就别出来丢人显眼了。
自己去查查电能表芯片工作原理和真有效值芯片的带宽和精度吧。还高频信号呢,你也不怕风大闪了舌头。

无知不重要,重要的是你无知又炫耀自己的无知,已经近乎无耻了。

出0入0汤圆

发表于 2012-10-16 21:35:10 | 显示全部楼层
mark,开方

出0入0汤圆

发表于 2012-10-16 21:46:46 | 显示全部楼层
不跟这些菜鸟计较了。
说说4楼的代码,6楼眼睛真毒,确实少了一句ptr++;这是有 有bug的中间版本。4楼这个开方算法是从《Hackers Delight》这本书里面抄的,有中译本,你们可以找找。
这个代码是为了测一个40kHz的脉冲直流真有效值,其实是高频电源的整流不滤波输出。用的芯片是STM32F103C8,主频56MHz,ADC采样率1Msps,实测50Hz精度优于1%,40kHz精度优于3%。带宽跟AD536差了一点,问题是AD536正品要80块,翻新货也要40,我这单片机才9块。

出0入0汤圆

发表于 2012-10-16 22:59:32 | 显示全部楼层
i55x 发表于 2012-10-16 21:20
你是既不懂电能表芯片也不懂真有效值芯片,你这超低水平就别出来丢人显眼了。
自己去查查电能表芯片工作 ...

你牛逼,你啥都懂我一直说我就是一个业余的,我肯定不懂电表芯片我也不研究电表……最近风确实挺大 ,但是我没炫耀 也没啥好炫耀的,牛人多了去了……你就是一个牛人呀,牛到技术讨论能讨论出人身攻击来了,俗话说的好,就怕流氓有文化呀……你这种人最好还是没文化,有文化指不定用干啥高科技的丧良心事呢……做人要是没了良心 有啥都没用!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-10-18 16:35:28 | 显示全部楼层
真有效值的计算

出0入0汤圆

发表于 2012-11-14 12:30:50 | 显示全部楼层
MRAK一下,以后用的到

出0入0汤圆

发表于 2013-3-18 20:10:37 | 显示全部楼层
4楼程序的正确版本是什么?  差的那一句应加在什么地方。

出0入0汤圆

发表于 2013-3-19 01:07:08 来自手机 | 显示全部楼层
谢谢了,值得学习

出0入0汤圆

发表于 2013-3-19 07:47:07 来自手机 | 显示全部楼层
Mark......@@@

出0入0汤圆

发表于 2013-3-19 18:36:14 | 显示全部楼层
好好的贴子,唉。。。

出0入0汤圆

发表于 2013-5-18 15:34:00 | 显示全部楼层
真有效值的计算   软件算法及AD536硬件解决

出0入0汤圆

发表于 2013-6-23 22:12:06 | 显示全部楼层
xczxwy 发表于 2012-4-16 11:08
给楼主我项目里曾经用的函数:(绝对可用)
需要采集和处理的正弦波如图所示。
算法:方均根

请教一下: 如何识别已经采样到一个周期了? 假如输入信号是一个非纯正弦的,或者输入信号的周期很大,那是不是会导致测量的有效值一直在变动?

出0入0汤圆

发表于 2013-6-23 22:15:32 | 显示全部楼层
schwarz 发表于 2012-4-16 12:29
4楼这个isqrt函数是坛子里面旧帖子里面,效率非常高,我用1Msps采样率12bit精度,边采边算,算的比采集的速 ...

用的是什么类型单片机

出0入0汤圆

发表于 2013-6-24 09:02:46 | 显示全部楼层
求均方根函数程序,Mark

出0入0汤圆

发表于 2013-6-24 23:42:42 | 显示全部楼层
shenxige_sxg 发表于 2012-10-13 20:52
需要严格控制一个周期的时间,否则会加大误差;
SUM = Dat[0]^2 + Dat[1]^2 +...+Dat[n-1]^2; 所有数据的平 ...

有什么方法做到严格控制频率非已知或者没有明显过零(过中线)的信号的一个周期的时间?

出0入0汤圆

发表于 2013-6-24 23:57:37 | 显示全部楼层
标记下               

出0入0汤圆

发表于 2013-6-25 07:59:54 来自手机 | 显示全部楼层
meisen999 发表于 2013-6-24 23:42
有什么方法做到严格控制频率非已知或者没有明显过零(过中线)的信号的一个周期的时间? ...

先用比较器把频率检出来    就可以算出一个周期时间  

出0入0汤圆

发表于 2013-9-16 10:45:38 | 显示全部楼层
这个帖子好

出0入0汤圆

发表于 2013-9-23 09:23:04 | 显示全部楼层
mark一记!

出0入0汤圆

发表于 2013-9-29 13:13:55 | 显示全部楼层
原来真有效值就是均方根,现在终于明白了

出0入0汤圆

发表于 2013-10-1 09:22:51 | 显示全部楼层
学习了 支持LZ

出0入0汤圆

发表于 2013-10-1 10:20:00 | 显示全部楼层
好好的技术帖又吵起来了我还是安心看大家都技术性回复吧。

出0入0汤圆

发表于 2013-10-1 11:56:49 | 显示全部楼层
好代码,一个问题带出了大牛啊

出0入0汤圆

发表于 2013-10-8 20:34:04 | 显示全部楼层
bh4ilp 发表于 2012-10-16 20:30
这话说的就有点难听了,什么叫卖弄,有现成的性能好的芯片不用非要编程序自己采,而且还不能保证精准度, ...

电能表只是针对一个正弦波,踩个峰值简单算一下就行了当然用不着专用芯片……
你还真敢胡说八道丫。

出0入0汤圆

发表于 2013-10-8 20:35:26 | 显示全部楼层
xizi 发表于 2012-10-13 22:03
uint16_t isqrt32(uint32_t x)
{
  uint32_t m, y, b;

该算法的原始出处我已经上传到此贴17楼,第11章。
http://www.amobbs.com/thread-5553858-1-1.html

出0入0汤圆

发表于 2013-10-8 22:06:14 来自手机 | 显示全部楼层
不顶不行啊

出0入0汤圆

发表于 2013-10-10 00:02:42 | 显示全部楼层
schwarz 发表于 2013-10-8 20:35
该算法的原始出处我已经上传到此贴17楼,第11章。
http://www.amobbs.com/thread-5553858-1-1.html ...

多谢你上传了一本好书。

出0入0汤圆

发表于 2013-10-18 11:56:23 | 显示全部楼层
    mark!!!

出0入0汤圆

发表于 2013-10-25 11:16:08 | 显示全部楼层
uint16_t isqrt32(uint32_t x)
{
  uint32_t m, y, b;
  m = 0x40000000;
  y = 0;
  while (m != 0) {
    b = y | m;
    y = y >> 1;
    if (x >= b) {
      x = x - b;
      y = y | m;
    }
    m >>= 2;
  }
  return y;
}

uint16_t rms(uint16_t * ptr)
{
  uint64_t t = 0;
  uint16_t i;

  for (i = 0; i < BUF_SIZE; i++)
    t += (uint32_t) * ptr * (uint32_t) * ptr;
  return (isqrt32(t / BUF_SIZE));
}

出0入0汤圆

发表于 2013-12-19 11:48:32 | 显示全部楼层
有这种芯片,就是太贵了

出0入13汤圆

发表于 2014-1-22 13:50:55 | 显示全部楼层
真是不错,留着以后用

出0入0汤圆

发表于 2014-4-15 16:52:08 | 显示全部楼层
记号,有用

出0入0汤圆

发表于 2014-5-5 16:51:49 | 显示全部楼层
太给力了,太有用了

出0入13汤圆

发表于 2014-5-9 10:20:46 | 显示全部楼层
恩,这个真要多学习

出0入0汤圆

发表于 2014-5-22 01:11:18 | 显示全部楼层
mark mark mark

出0入0汤圆

发表于 2014-5-22 09:39:06 | 显示全部楼层
计算 均方根

出0入0汤圆

发表于 2014-5-22 10:47:17 | 显示全部楼层
这个电路用得很多了!

出0入0汤圆

发表于 2014-5-22 11:14:25 | 显示全部楼层
电表的AD直接出有效值,没有软件开销,价格只有几块钱

出0入14汤圆

发表于 2014-5-26 01:23:45 | 显示全部楼层
算法很给力,mark

出0入0汤圆

发表于 2014-5-26 08:18:45 | 显示全部楼层
呵呵很不错的帖子!收藏了!

出0入0汤圆

发表于 2014-6-25 14:54:20 | 显示全部楼层
i55x 发表于 2012-10-16 17:47
好吧,我来总结一下。

现在技术发展的特点就是数字化,模拟量尽快数字化,然后用软件进行处理,模拟电路的 ...

思路很专业,是行业中人哈,学习了,谢谢。

有一疑问,电能表芯片对非正弦波的真有效值转换结果怎么样。

出0入0汤圆

发表于 2014-7-24 11:39:42 | 显示全部楼层
根据 傅里叶变换 任意波形 可以看作 正弦波各种频率的组合,所以看看芯片的带宽

出0入0汤圆

发表于 2014-11-1 09:53:09 | 显示全部楼层
又学习了!

出0入0汤圆

发表于 2014-11-1 10:32:57 | 显示全部楼层
不错,也学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 20:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表