下面和大家一起分享一下这个湿度计,顺便我也小总结一下。
实物图如下:
上位机软件GUI界面:
系统功能概述:该湿度计由湿度采集和显示两部分组成,显示部分通过串口排线与采集部分相连,并采用7段式LED显示湿度值,定标所需的最小二乘法直线拟合参数由上位机软件计算完成并将参数发回湿度计进行定标处理。软件的定标也分手动和自动两部分,定标功能和湿度控制器类似。参见http://bbs.ednchina.com/BLOG_ARTICLE_3006306.HTM
由于湿度显示部分较简单,接下来主要介绍湿度采集部分和上位机软件部分。
湿度采集板概述:该板的主要特点就是小,板子的尺寸只有54*11(mm)。在这个尺寸上放置了单片机MSP430F2132、CD4046、MAX3232、MC34063以及相关的外围电路等。至于电路原理和湿度控制器一样。印象最深的就是手工焊接的时候老是丢东西,而且这款430小单片机不是被静电打坏,就是被焊坏。开关电源的开关芯片也是如此。所以,以后要是再有类似的活我肯定是不合格的,得请专业人士来弄。
上位机软件概述:该软件是在串口调试助手代码的基础上修改的,当时并不是不熟悉VC或者其他语言,主要考虑到自己是学电子,以后主要从事信号处理的研究。参考上面贴出来的GUI界面,简单介绍一下各部分功能。
左板块:串口调试功能。扩展了10进制显示,uint32与float32发送。
右板块:湿度定标功能
1:设定任意5个由低到高的标准湿度环境
2:手动读取湿度值,记录读取次数,5次循环显示,清除数据。
3:定时自动读取湿度值,可设置环境切换时间与取样等待时间。
4:5次取数后进行数据拟合,打开图形窗打印拟合曲线与样点。同时得到拟合曲线方程系数,等待发送。
PS:通过调试已经加入了系统运行调试操作出错处理消息框。
从打印出的菜单中可以看到有0~4这五种操作模式,单片机的程序和网上很多开发板的test程序类似。
图文说明如下:
首先,发送十六进制命令“0”,打印菜单(此时字符显示)。
其次,发送十六进制命令“1”,显示当最新拟合公式计算的湿度定标数据(将字符显示转化为十进制显示)。如下图,从字符显示转为十进制的数据打印图。当前湿度为68%。
然后,发送十六进制命令“2”,等待发送直线拟合方程的浮点系数,窗口提示如下图。如不记得命令可以从新发“0”打印。
最后,将方程的斜率和截距以空格隔开同时输入,并切换为float32格式,点击发送即可。
这时,窗口会显示当前存储的数据个数,选择“0”表示没有定标拟合计算的湿度值,选择“1”表示使用刚才保存的拟合数据进行定标计算的湿度值。以此类推,每输入一次将往下加并显示次数,可以保存多组数据,这也与湿度控制器一样,只不过没有16次那么多。本来应该将输入一个简单的直线方程的计算结果截图说明一下,但时间太久,有些图片已经不在或者当时没有保留。不过这并不影响对定标功能的理解。该项目做到这一步并不是直接的产品,而只是一个样板。定标是为了工厂在批量生产时出厂前的数据校正,不可能用matlab的上位机软件。顺便指出一下,湿度的准确测量有两个难点,一个是标准湿度环境不容易实现,密封性要求非常高,而且要在密封的湿度环境中取样也不容易。另一个就是湿度传感器的特性不一,当前用的湿度传感器在极限温度下将出现异常,这不仅与datasheet不服,而且对不同板子锁相环的中心频率点不好取舍。要达到一定的精度,采集电路还需要改进。
接下来参考我以前写过的文档,将当时联调所遇到的问题以及怎么解决的总结一下(解决是解决了,但分析的原因可能不正确)。
所遇到的问题 |
解决办法 |
1.如何通过430单片机发送数据到PC中使Matlab GUI中的Edit控件换行,用于美化打印的命令菜单。 | 原因:Edit控件接收两种换行命令ASCII码10(LF),16(CR),使用10容易出现跑死,猜测是因为串口接收过程中,定时回调函数与输入缓冲区满回调函数对Edit控件的赋值过程冲突,造成程序跑死。而使用16正常。 |
2.如何通过PC向430单片机发送4个byte以内的各种数据类型。在发送4byte数据时,单片机中uint32能实时转化保存,而float32不行 | 原因:之前的接收方法多此一举。因为经过调试发现串口发送的本就是相应数据的数据格式,不必接收后转化为相应类型再保存,可直接受完将缓冲数组保存至FLASH,读取时使用指向需要类型的指针即可。 |
3.MSP430F2132单片机在IAR环境中,调试容易出现堆栈溢出现象,FLASH各种数据类型存储不方便。系统涉及到长字符串的处理,C语言处理麻烦。设想使用C\C++混编。 | 堆栈溢出的原因:在2132接收中断处理函数中分支语句不能嵌套2层以上,特别对于分支较多的程序,不能使用switch语句,容易堆栈溢出,同时不能过多的在函数中设定static变量。设定IAR堆栈不能超过250。另外,在线调试的断点数不能超过2个。深层次的原因不详。对于FLASH操作可使用C++中函数重载的方式,对于字符串问题可使用C++中string类,效率比较谁高谁低占不清楚。 |
经过这两个单片机项目的洗礼,可以说当时几乎把MSP430大小系列的单片机拥有的资源都用了一遍。相比早前用的STC,ARM7,她最大的优势就是低功耗编程模式。所有的代码都是在中断响应内完成的。这完全得益于430较其他单片机复杂的系统时钟结构。最近,我刚接触到了日本的Renesas(瑞萨)M16C/62P系列单片机。要知道,在十大芯片供应商中,以单片机为主的就是瑞萨。我个人认为瑞萨应该就是单片机之王。而在我们身边,又有多少人了解这种单片机。真正看过德国人和日本人做的东西的人就知道,他们一直用的东西到我们手里后,大多都被认为是我们已经被淘汰的东西,但结果却是他们的产品反到经久耐用。我想这就是大量引进外资,进口芯片让我们思想上形成的弊病,求新求快,反正有钱好办事。在这样的思维方式的牵引下,要想摆脱制造转型设计不知道有多难。
附件:
基于matlab的上位机定标软件RH.rar
用户1585063 2013-11-30 21:47
用户961355 2013-4-26 15:35
用户312471 2013-3-4 15:31
357028335_973093314 2013-1-8 19:24
用户427466 2012-9-6 16:49
用户425498 2012-9-4 23:50
用户403664 2012-8-10 17:23