单片机采集并算电压有效值的问题

[复制链接]
12128|42
 楼主| wangpeng59 发表于 2015-7-2 15:14 | 显示全部楼层
gx_huang 发表于 2015-7-2 13:25
VOL=voltage*voltage;
这个语句错了,VOL是4字节的,后面是2字节的,结果还是2字节的,溢出了。 ...

VOL是4字节的,voltage是2字节的。应该是voltage相乘后,自动被隐式转换成4字节赋值给VOL吧?
gx_huang 发表于 2015-7-2 15:20 | 显示全部楼层
wangpeng59 发表于 2015-7-2 15:14
VOL是4字节的,voltage是2字节的。应该是voltage相乘后,自动被隐式转换成4字节赋值给VOL吧? ...

16*16还是16的,就是这里溢出了。我MCU的软件设计的多了,可以肯定是这里有问题。
要先强制转换一下。
另外,1毫秒的定时,你要计算这么多,估计时间不够呀。
 楼主| wangpeng59 发表于 2015-7-2 16:13 | 显示全部楼层
gx_huang 发表于 2015-7-2 15:20
16*16还是16的,就是这里溢出了。我MCU的软件设计的多了,可以肯定是这里有问题。
要先强制转换一下。
另 ...

VOL=(long)(voltage*voltage);这样吗?
gx_huang 发表于 2015-7-2 16:18 | 显示全部楼层
VOL=(long)voltage*voltage
你的voltage,最好先取绝对值,最好是uint类型。
 楼主| wangpeng59 发表于 2015-7-2 16:25 | 显示全部楼层
gx_huang 发表于 2015-7-2 16:18
VOL=(long)voltage*voltage
你的voltage,最好先取绝对值,最好是uint类型。

貌似还是不行。。看来我对数据类型的了解太low了
gx_huang 发表于 2015-7-2 16:27 | 显示全部楼层
因为,带符号数和不带符号数,强制转换,有很多问题的。
类型最好一致,一会int,一会long,一会ulong,自然问题很多的。
gx_huang 发表于 2015-7-2 16:29 | 显示全部楼层
int到long,uint到ulong,这些强制转换没有问题。
类型还是先搞一致呀,不要一会有符号一会无符号的。
 楼主| wangpeng59 发表于 2015-7-2 17:40 | 显示全部楼层
gx_huang 发表于 2015-7-2 16:29
int到long,uint到ulong,这些强制转换没有问题。
类型还是先搞一致呀,不要一会有符号一会无符号的。 ...

方便QQ聊一下吗?
我的是:17276594,谢谢!
Adu0227 发表于 2015-7-2 18:13 | 显示全部楼层
为何要平方?
你瞅啥 发表于 2015-7-2 18:45 | 显示全部楼层
  1. uint16_t isqrt32(uint32_t x)
  2. {
  3.   uint32_t m, y, b;
  4.   m = 0x40000000;
  5.   y = 0;
  6.   while (m != 0) {
  7.     b = y | m;
  8.     y = y >> 1;
  9.     if (x >= b) {
  10.       x = x - b;
  11.       y = y | m;
  12.     }
  13.     m >>= 2;
  14.   }
  15.   return y;
  16. }

  17. uint16_t rms(uint16_t * ptr)
  18. {
  19.   uint64_t t = 0;
  20.   uint16_t i;

  21.   for (i = 0; i < BUF_SIZE; i++){
  22.     t += (uint32_t) * ptr * (uint32_t) * ptr;
  23.     ptr++;}
  24.   return (isqrt32(t / BUF_SIZE));
  25. }

在Cortex-M3 @56MHz上面实测,输入数据流1Msps的情况下,该运算CPU负载率约65%。

死太惨没试过。
 楼主| wangpeng59 发表于 2015-7-2 21:27 | 显示全部楼层
你瞅啥 发表于 2015-7-2 18:45
在Cortex-M3 @56MHz上面实测,输入数据流1Msps的情况下,该运算CPU负载率约65%。

死太惨没试过。 ...

这是啥?
 楼主| wangpeng59 发表于 2015-7-2 21:27 | 显示全部楼层

均方根值,就是求有效值啊
 楼主| wangpeng59 发表于 2015-7-2 21:28 | 显示全部楼层
军训的茶杯 发表于 2015-7-2 13:02
LZ,给你个资料,你自己看下吧

谢谢,我好好学习一下!
 楼主| wangpeng59 发表于 2015-7-2 21:55 | 显示全部楼层
问一个问题:
voltage=U*17-8453;这句,若voltage和U都是uint型,U*17-8453结果如果是负数(比如U=0时),voltage的值应该是什么?8453吗?还是什么别的数??
ltbytyn 发表于 2015-7-2 22:45 | 显示全部楼层
楼主把51用的飞上天了。先不看程序,说说思路,8位单片机做32位乘法。1ms采样一次,均方根法意味着最少1ms以内要算一次32*32乘法。好牛X。51是没有乘法器的,只是不知道算一次32*32需要多长时间。
 楼主| wangpeng59 发表于 2015-7-3 07:02 | 显示全部楼层
ltbytyn 发表于 2015-7-2 22:45
楼主把51用的飞上天了。先不看程序,说说思路,8位单片机做32位乘法。1ms采样一次,均方根法意味着最少1ms ...

不好意思确实不太了解,因为以前只用过51。。
这样就必须替换了吗?请问可以用什么型号的单片机呢?
Leeone 发表于 2015-7-3 07:47 来自手机 | 显示全部楼层
先不要试1000点,先搞个10个点试试对的话再累加上去找原因
gx_huang 发表于 2015-7-3 08:33 | 显示全部楼层
ltbytyn 发表于 2015-7-2 22:45
楼主把51用的飞上天了。先不看程序,说说思路,8位单片机做32位乘法。1ms采样一次,均方根法意味着最少1ms ...

32*32,51的速度还可以的,因为51有8*8=16的乘法器。但是1ms,这么多算法,应该来不及。
liaojihua2010 发表于 2015-7-3 11:36 | 显示全部楼层
18楼正解
 楼主| wangpeng59 发表于 2015-7-3 20:20 | 显示全部楼层
谢谢各位的建议,今天忙了一天,明天一定再好好试试!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部