打印

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

[复制链接]
5148|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyboy|  楼主 | 2010-8-10 15:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如客户有条指令是读取当前10分钟内温度的最小值(单片机可通过温度传感器获得)。程序如何实现。谢谢!

我之前是10分钟清零统计一次。但发现是存在问题的,有没有什么好方法?谢谢

相关帖子

沙发
ayb_ice| | 2010-8-10 15:28 | 只看该作者
如果必须要读取任意最近10分钟的最小值
则必须记录10内的所有值,记录一个,丢掉一个
然后....

使用特权

评论回复
板凳
chunyang| | 2010-8-10 15:39 | 只看该作者
将开始时读取的初值置入寄存器,再次读取时则与之比较,如果小于则替换,重复读取比较,到周期结束时回到第一步循环往复即可,期间无清零,寄存器也不需要初始化。

使用特权

评论回复
地板
zyboy|  楼主 | 2010-8-10 15:40 | 只看该作者
是种方法,我想到这样
每一分钟取一个,10分钟取10个值,我在里面找个最小值。然后采用先进先出,当下一分钟来的时候,抛弃最开头的一分钟,其他依次前移。感觉好像可行。不知道有没有其他更好的方法

使用特权

评论回复
5
zyboy|  楼主 | 2010-8-10 15:55 | 只看该作者
chunyang大侠

不好意思,我说的清零就是重新读取温度值。但这样存在问题。。比如第9分钟出现一个最小值,到10分钟之后,清零(重新读取新温度值),第9分钟数据被抛弃,这样就出问题了

使用特权

评论回复
6
ayb_ice| | 2010-8-10 16:54 | 只看该作者
谁叫你清零
记录一个最新的,去掉一个最老的数据,然后从所有记录数据中查找最小值
先要填满空间
这最多就是初中的数学问题....

使用特权

评论回复
7
chunyang| | 2010-8-10 17:45 | 只看该作者
该功能用一个程序模块即可,占用两个内存字节就可以了,干嘛要十个,也不存在抛弃哪个数值的问题,更无需什么“先进先出”,两个寄存器一为极小值,一为当前值,一个十分钟周期结束时,最小值要送出给其它相关功能程序模块,否则还有什么意义?

使用特权

评论回复
8
new1988| | 2010-8-10 21:20 | 只看该作者
chunyang前辈的方法让我想起了小学的一篇课文。好像意思是这样的:
一只猴子在回家的路上,经过一片玉米地,它就跑到玉米地里宅了一颗玉米。走着走着,又来到一片西瓜地,猴子就丢掉玉米,摘了一个西瓜。当它抱着西瓜往回走时,有看见一只兔子,猴子马上丢了西瓜去追兔子。到最后兔子没追着,西瓜和玉米都丢了。一无所获。
chunyang前辈的方法也差不多,不过是让单片机丢掉大了,留下小的。当然最后要把最小的留下,要不然就跟猴子样的,一无所获!!

使用特权

评论回复
9
chunyang| | 2010-8-10 22:00 | 只看该作者
呵呵,重点就是要把最小的留下,否则就真成猴子了。

使用特权

评论回复
10
hou| | 2010-8-10 22:20 | 只看该作者
chunyang前辈的在7楼发表的方法只用两个字,一个是当前值,一个是最小值,但是按照这种理解,当前值不需要存储器,它只出现在寄存器,每次读到一个采样值,肯定是通过累加器读的,那么比较之后,要么刷新最小值,要么保留原值、新数据丢弃,呵呵。

使用特权

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

还有一个问题,楼主提到了清零。我想搞明白,你所说的是10分钟内最小值,有两种理解(假定每分钟采样一次):
一种是如6楼的理解,包含当前采样时刻及其前面十分钟的采样数据,这十个采样数据是不断滚动的:如果当前已经有第1~10个数据了,最小值就存在于这十个数据之中;到第11次采样完成时,当前最小值存在于这第2~11个数据中,最初第1个值被丢弃。接着采样到第12个数据,则当前最小值存在于这第3~12个数据中,原来的第2个也被丢弃。如此反复。
另一种理解如2楼所说,是以某个时刻开始,每十分钟作为一个片段,所述最小值仅仅局限于这十分钟之内的采样值,而与前面十次采样没有关联,当前最小值只有采够10个数据以后才能得出。这样理解时仍然是只需要一个字的存储空间,过程是:从第一个数据开始,每采一个数据,记录临时最小值,采到第10个数据时,得出这10分钟之内的最小值;但随即这个最小值被清零,因为进入下一个10分钟,采样第11~20个数据,得到这后10分钟内的最小值。如此反复。
不知楼主到底要的是哪种理解?

使用特权

评论回复
12
踢球老越位| | 2010-8-10 23:18 | 只看该作者
1# zyboy FIFO解决

使用特权

评论回复
13
ljm810010| | 2010-8-11 00:50 | 只看该作者
chunyang这次想歪了,还得要用FIFO解决。

使用特权

评论回复
14
123jj| | 2010-8-11 07:30 | 只看该作者
用环型存储器组储存采样数据即可。

使用特权

评论回复
15
ncite| | 2010-8-11 08:18 | 只看该作者
1# zyboy
其实就是两个值,一个是现在采集的值,一个是显示值。

每隔10分钟用采集值更新显示值。

使用特权

评论回复
16
ar_dong| | 2010-8-11 08:43 | 只看该作者
用环型存储器组储存采样数据即可。
123jj 发表于 2010-8-11 07:30

这个可以,永远保存10分钟以内的值,

使用特权

评论回复
17
zyboy|  楼主 | 2010-8-11 09:02 | 只看该作者
chunyang大侠 可能理解错了。我之前就是按你这种方法的。这10分钟是从客户角度理解,比如当前时间8:30,此时客户查询10分钟内最小温度值(这个值应该是从8:20-8:30时间内的最小值)。假如你单片机10分钟片段对应为8:15-8:25; 8:25-8:35,依次类推。 如果8:22出现个最小值。 8:30去查询时,这个值就会被抛弃了,只会取(8:25-8:30)的最小值

除了FIFO方法外。有人说还是按10S重新统计的方法。只是每发现有新的最小值,就开始重新计算10S,这样保证如果有最新的最小值,总可以维持10S后,再被抛弃。感觉这样好像也可以

使用特权

评论回复
18
chenxu_1| | 2010-8-11 09:02 | 只看该作者
chunyang的挺好

使用特权

评论回复
19
程序匠人| | 2010-8-11 09:10 | 只看该作者
没有看明白楼主的需求是什么。你到底要怎样的最小值?

如果是要在任意时刻都取最近10分钟的最小值,则14楼是正解。

使用特权

评论回复
20
yuyetufu| | 2010-8-11 09:14 | 只看该作者
楼主还是先回答11楼的问题吧。

使用特权

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

本版积分规则

个人签名:学海无涯,回头是岸!

101

主题

356

帖子

0

粉丝