发新帖我要提问
12
返回列表
打印

编程问题—单片机如何统计10分钟的最小值

[复制链接]
楼主: zyboy
手机看帖
扫描二维码
随时随地手机跟帖
21
zyboy|  楼主 | 2010-8-11 09:23 | 只看该作者 回帖奖励 |倒序浏览
客户协议上一条命令要求“给出10分钟内的最小值”,如果给大家如何理解?我认为最好的解释就是从接收到这条命令之前的10分钟的最小值。

11楼应该是第一种。第二种应该说没什么意义,从以某个时刻开始?这个时刻根本没办法保证和客户的统一性,单片机计数是从单片机上电开始,客户并不知道单片机什么时候上电,这种10分钟一次的统计一次没什么意义了。

使用特权

评论回复
22
jiabin1024| | 2010-8-11 09:34 | 只看该作者
看来LZ都没搞懂客户的要求啊,还是先把客户的要求搞清楚。

使用特权

评论回复
23
zyboy|  楼主 | 2010-8-11 09:39 | 只看该作者
这要求很清楚呀:就是PC发条命令,下位机回应”统计10分钟内的最小值“,就是这呀,有什么不清楚的呀,晕

使用特权

评论回复
24
hou| | 2010-8-11 09:53 | 只看该作者
同意21楼观点,如果按我在11楼所列第二种理解,确实没有多大意义。即使在前面10分钟的最小值不立刻被清零、而是一直保持到当前10分钟结束才被刷新,也很难与客户的10分钟相同步。

如果是要求任意采样时刻及其前面10分钟的数据为对象求最小值,必须用循环队列,因为:只记录最小值和当前值的做法,如chunyang所述,只能得到从上电到现在的所有历史数据中的最小值,不能得到最近10分钟内的最小值!

使用特权

评论回复
25
ayb_ice| | 2010-8-11 10:12 | 只看该作者
不管什么要求
这都是基本的简单的数学问题

使用特权

评论回复
26
ayb_ice| | 2010-8-11 10:12 | 只看该作者
不管什么要求
这都是基本的简单的数学问题

使用特权

评论回复
27
xiaoyu9632| | 2010-8-11 10:35 | 只看该作者
顶,问题解答的应该很清楚了,一开始我也理解成只需记录最小数值即可了呵呵,14楼正解

使用特权

评论回复
28
李冬发| | 2010-8-11 10:38 | 只看该作者
chunyang真的错了,LZ要的不是历史最小值,是最近10分钟最小值,那就得用FIFO!

使用特权

评论回复
29
seabada| | 2010-8-11 10:43 | 只看该作者
先设一个大的值然后比较,就10000好了,你每次取的值和它比,小了替换,大了不替换!

使用特权

评论回复
30
hou| | 2010-8-11 10:52 | 只看该作者
本帖最后由 hou 于 2010-8-11 10:55 编辑

用循环队列表示:分配10个单位的连续存储空间(地址编号0~9)。用两个指针:p_head记录当前队首位置(为最新采样数据),p_min记录最小值所在位置。
在进行第一次采样后,用该采样值d_sample填充全部空间。此时p_head=p_min=0。然后执行以下循环:
{
   wait_sample_time();         //等待下一次采样时刻的到来。
   p_head=(p_head+1)/10;
   *p_head=sample();
  
   if(p_head==p_min)
      p_min=min_ptr();  // 此时原来最小值成为最古老数据,被挤出队列,
                                 //新的最小值在当前的10个数据中重新生成。
   else
   {                           // 此时原来最小值仍为队列有效成员,
                                //新最小值在原最小值和新采样值之间选择。
       if(*p_head<*p_min)
           p_min=p_head;
   }
}  //循环结束

使用特权

评论回复
31
kooshare| | 2010-8-11 12:36 | 只看该作者
循环记录FIFO正解。

使用特权

评论回复
32
mxh0506| | 2010-8-11 14:17 | 只看该作者
不知道采样率有多高?如果象音频采样那样,10分钟可够受的。

使用特权

评论回复
33
ljm810010| | 2010-8-11 15:34 | 只看该作者
如楼上所说,如果采样率较高,那么能不能不使用大量内存,仍能得到最后十分钟内的最小值?

使用特权

评论回复
34
5880527| | 2010-8-11 15:58 | 只看该作者
温度能变化多快,真是的

使用特权

评论回复
35
ouyangsue| | 2010-8-12 19:48 | 只看该作者
设置一个中间变量,记录一个,放入中间变量中,在读入下一个,和下一个比较大小,比下一个大就小的这个设置为中间变量,大的舍去,在读入下一个

使用特权

评论回复
36
chunyang| | 2010-8-12 20:09 | 只看该作者
这个确实要描述清楚采集周期的定义,如果存在固定的采集周期那就如前面我所指的那样,如果不存在,那就只能全部记录,那也不必用FIFO,操作起来会比较麻烦,开个数组,这时需要初始化,全填最大值,然后依次循环记录,再用一个寄存器做索引,以便知道当前值在哪里,存数的时候由索引决定覆盖的数组元素地址。关于中间寄存器(就是我前面说的两个寄存器中的一个)是有必要的,特别是系统存在中断时,取极小值用专门的一个程序块、函数之类的实现,但在运行之前,要确保当前值已经被压入数组,这可利用标志寄存器实现。

使用特权

评论回复
37
esthrth| | 2011-2-16 10:21 | 只看该作者
这个有点类似智能电表中的滑差式需量的算法~
1这个最小值是“时间窗口”(10分钟)中出现的最小值而不是历史最小值
2时间的推移是连续的(“滑差时间”不应取太小,因为对于温度参量而言一般没意义,再者就是数据量太大)
记得“存新去旧梛一梛”就对了,呵呵

使用特权

评论回复
38
culk_2008| | 2011-2-16 20:31 | 只看该作者
不应该清零的

使用特权

评论回复
39
whlz58| | 2011-2-17 17:21 | 只看该作者
采样高,记下最小值和产生的时刻就行

使用特权

评论回复
40
shiba1986| | 2013-5-18 15:43 | 只看该作者
zyboy 发表于 2010-8-11 09:23
客户协议上一条命令要求“给出10分钟内的最小值”,如果给大家如何理解?我认为最好的解释就是从接收到这条 ...

楼I住 你这个问题后来是怎么解决的 能说下流程吗
我也碰到了一个同样的问题 需要统计最后1分钟的最大值最小值

使用特权

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

本版积分规则