打印

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

[复制链接]
楼主: wangpeng59
手机看帖
扫描二维码
随时随地手机跟帖
21
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吧?

使用特权

评论回复
22
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毫秒的定时,你要计算这么多,估计时间不够呀。

使用特权

评论回复
23
wangpeng59|  楼主 | 2015-7-2 16:13 | 只看该作者
gx_huang 发表于 2015-7-2 15:20
16*16还是16的,就是这里溢出了。我MCU的软件设计的多了,可以肯定是这里有问题。
要先强制转换一下。
另 ...

VOL=(long)(voltage*voltage);这样吗?

使用特权

评论回复
24
gx_huang| | 2015-7-2 16:18 | 只看该作者
VOL=(long)voltage*voltage
你的voltage,最好先取绝对值,最好是uint类型。

使用特权

评论回复
25
wangpeng59|  楼主 | 2015-7-2 16:25 | 只看该作者
gx_huang 发表于 2015-7-2 16:18
VOL=(long)voltage*voltage
你的voltage,最好先取绝对值,最好是uint类型。

貌似还是不行。。看来我对数据类型的了解太low了

使用特权

评论回复
26
gx_huang| | 2015-7-2 16:27 | 只看该作者
因为,带符号数和不带符号数,强制转换,有很多问题的。
类型最好一致,一会int,一会long,一会ulong,自然问题很多的。

使用特权

评论回复
27
gx_huang| | 2015-7-2 16:29 | 只看该作者
int到long,uint到ulong,这些强制转换没有问题。
类型还是先搞一致呀,不要一会有符号一会无符号的。

使用特权

评论回复
28
wangpeng59|  楼主 | 2015-7-2 17:40 | 只看该作者
gx_huang 发表于 2015-7-2 16:29
int到long,uint到ulong,这些强制转换没有问题。
类型还是先搞一致呀,不要一会有符号一会无符号的。 ...

方便QQ聊一下吗?
我的是:17276594,谢谢!

使用特权

评论回复
29
Adu0227| | 2015-7-2 18:13 | 只看该作者
为何要平方?

使用特权

评论回复
30
你瞅啥| | 2015-7-2 18:45 | 只看该作者
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;
    ptr++;}
  return (isqrt32(t / BUF_SIZE));
}

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

死太惨没试过。

使用特权

评论回复
31
wangpeng59|  楼主 | 2015-7-2 21:27 | 只看该作者
你瞅啥 发表于 2015-7-2 18:45
在Cortex-M3 @56MHz上面实测,输入数据流1Msps的情况下,该运算CPU负载率约65%。

死太惨没试过。 ...

这是啥?

使用特权

评论回复
32
wangpeng59|  楼主 | 2015-7-2 21:27 | 只看该作者

均方根值,就是求有效值啊

使用特权

评论回复
33
wangpeng59|  楼主 | 2015-7-2 21:28 | 只看该作者
军训的茶杯 发表于 2015-7-2 13:02
LZ,给你个资料,你自己看下吧

谢谢,我好好学习一下!

使用特权

评论回复
34
wangpeng59|  楼主 | 2015-7-2 21:55 | 只看该作者
问一个问题:
voltage=U*17-8453;这句,若voltage和U都是uint型,U*17-8453结果如果是负数(比如U=0时),voltage的值应该是什么?8453吗?还是什么别的数??

使用特权

评论回复
35
ltbytyn| | 2015-7-2 22:45 | 只看该作者
楼主把51用的飞上天了。先不看程序,说说思路,8位单片机做32位乘法。1ms采样一次,均方根法意味着最少1ms以内要算一次32*32乘法。好牛X。51是没有乘法器的,只是不知道算一次32*32需要多长时间。

使用特权

评论回复
36
wangpeng59|  楼主 | 2015-7-3 07:02 | 只看该作者
ltbytyn 发表于 2015-7-2 22:45
楼主把51用的飞上天了。先不看程序,说说思路,8位单片机做32位乘法。1ms采样一次,均方根法意味着最少1ms ...

不好意思确实不太了解,因为以前只用过51。。
这样就必须替换了吗?请问可以用什么型号的单片机呢?

使用特权

评论回复
37
Leeone| | 2015-7-3 07:47 | 只看该作者
先不要试1000点,先搞个10个点试试对的话再累加上去找原因

使用特权

评论回复
38
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,这么多算法,应该来不及。

使用特权

评论回复
39
liaojihua2010| | 2015-7-3 11:36 | 只看该作者
18楼正解

使用特权

评论回复
40
wangpeng59|  楼主 | 2015-7-3 20:20 | 只看该作者
谢谢各位的建议,今天忙了一天,明天一定再好好试试!!

使用特权

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

本版积分规则