一. 摘要
这篇文章详细介绍了一个“多路信号采集系统”的开发过程。“多路信号采集系统”是一个可伸缩的信号采集系统,通道可以选择从0~100路不同的信号源。单个采集板都能够采集10路数据,用户可以根据自己的需求方便地扩展或者收缩信号通道数。本系统可以用于常见的民用或者工业现场监控、仪器仪表等数据采集场合。该系统基于Arm Context M3内核处理器实现,有基板和采集板两大部分组成,基板主要负责整个采集时序的控制,而采集板则完成真是的数据采集并将采集到的数据发送到数据总线,进而传输到主机端。数据传输采用了串口通信的方式(RS485),并采用Modbus协议实现,从而方便地实现了采集板地址的检索、数据量控制、以及CRC校验值确定等功能。软件系统则采用了固件库编程的方式,全程开发均使用C语言完成,从而为以后升级做好准备。开发使用了今日标企业工作平台以及Github代码托管平台相结合完成开发的方式,使用今日标企业工作平台管理项目开发流程,而使用Github则方便地实现了不同地区开发者协作开发的目的。而系统调试则选择了传统的调试方式,先进行单个功能模块测试,再测试系统功能,进而Burning实验。二. 本文提纲
1. 摘要
2. 本文提纲
3. 项目起始
4. 开发方式选择
5. 系统构架
6. 硬件设计
7. 软件设计
8. 系统调试
9. 总结
三. 项目起始
该系统是应兰州交通大学自动化研究所(一下简称为研究所)的项目需求进行开发。项目开始的时候谈的最多的问题主要有两个,一个是“钱”的问题,还有一个就是项目需求了。至于钱最后的商定结果为,天佑电子有限公司(以下简称天佑)只负责产品研发,开发过程中所有的元器件、材料、以及测试系统的所有成本均由研究所承担,而天佑则只承担人力成本。最后研究所应该支付天佑XXX研发费用。由于以前有过很多次的合作经历了,所以谈判过程也比较顺利,也没有书面的合同约束双方。不过这也仅仅建立在双方已经有过很多次的合作经历,彼此都是很熟的人,项目本身技术上没有太大的复杂度,而且最终产品的应用场合也不会造成大的损失的基础之上。不过一般的项目合同是很重要的一个方面,合同不仅仅为双方的行为建立起了约束,而且如果项目失败等造成损失,双方也能够明确自己的责任。至于项目需求,则只有以下几点需求:1. 信号通道数必须在50~100路之间(可伸缩)项目本身是个很简单的项目,几乎没有技术上的难点。产品需求也一目了然,看了项目需求之后解决方案就已经呼之欲出了。经初步分析,整个设计过程中唯一可能需要仔细斟酌的也就是多个板子之间通信时的时序问题,事实证明,这部分到后面的确测试了挺长时间才实现功能,而且测试了好多边界条件才最终确定下来最后的最优化参数。
2. 单路信号误差限定在0.03V之内
3. 数据传输使用485协议
4. 数据协议遵循Modbus协议
5. 传送数据中必须包含数据量以及CRC校验值
6. 上电或者数据传送过程都需要有相应的指示灯指示其状态
四. 开发方式选择
项目的开发方式选择了“今日标企业工作平台”和Github结合进行开发的方式。 在本次开发中使用金目标的目的在于管控项目开发流程,实现整个开发过程简单的文档化。虽然该开发过程与现在所倡导的敏捷开发模式相违背,但是考虑到目前我们的开发条件,最后还是决定使用传统的文档化开发模式。在本次开发中由于参与开发的主要人员在不同的地方(软件开发在江苏,而硬件开发在广东),造成了沟通上的诸多不便,而文档化则会改善一些沟通上的困难。将所有的开发过程都存放在一个公共平台上,大家可以随时查阅。这样也最大化地降低了沟通歧义所带来的项目风险。 众所周知,Github是一个不仅强大而且简单易用的分布式代码托管平台。对于不同地域开发人员之间的协作开发来说,拥有一个强大的代码共享平台至关重要。而Github刚好满足这些需求:五. 系统架构
系统架构 系统设计时考虑到可伸缩性,以及采集通道要求太多,故而将数据采集任务分给多个采集板去完成。每个采集板各自完成自己的采集任务,并将采集到的数据传送到数据总线。而具体的何时采集数据,以及何时传送数据到数据总线并交给PC段,则有Base Board控制。在这里设计的时候并没有将采集到的数据由Base Board传送到PC上,而是放到数据总线上直接由PC提取。这种设计是基于以下考虑,如果所有采集到的数据全都交由Base Board向上传送,则相当于多了一级路由,这样会降低整个系统的数据采集速率。也家中了Base Board的工作任务,使其控制逻辑变得复杂,严重违背“简单即为美”的编程原则。六. 硬件设计
有关硬件设计的部分,由于我本人对于硬件不是很擅长,所以可能总结不好。故而请了我们团队中的另一位硬件工程师撰写。在这里我就只上两张设计的电路图。七. 软件设计
在本系统中软件设计分为两个部分,采集板软件设计和基板软件设计。下面分别就这两方面介绍整个软件开发的过程。//加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch; } #endifView Code 驱动文件列表 完成了驱动程序的设计之后,则设计业务逻辑。 业务逻辑 是指从用户需求的角度完成用户需要的功能的一部分代码。这部分代码一般都是指Main函数中的逻辑。在此次设计中主要的执行流程可以使用以下的图表示。 业务逻辑 最后设计的是中间件,中间件的设计不仅要考虑到业务逻辑的需求,更要兼顾底层驱动模型的实现方式。只有将这两者比较好地结合起来,最终才能得到比较理想的产品。 从底层往上层看,中间件是对底层驱动更高一级的封装,底层驱动只是实现独立的单个功能点。而通过中间件不仅实现了这些功能点,而且融入了一部分系统功能的成分在里面。从上层往底层看,中间件则可以理解成对于系统业务逻辑的细化。业务逻辑类似于将用户需求文本化或者“代码化”,从本质上来讲,它还是在用户需求一级。而通过中间件的作用,则将抽象的业务逻辑实现了具体化,成为对于处理器来说能够识别并执行的真实代码。
八. 系统调试
在完成了系统硬件设计以及软件设计之后,接下来的主要任务就是单个模组测试以及系统测试。测试过程主要地可以分为以下几个部分:1. 单个驱动功能点测试下面分别介绍此次开发过程中针对前面5个测试点的具体实现过程。
2. 采集板功能测试
3. BaseBoard功能测试
4. 系统功能测试
5. 系统稳定性测试
void Send_Data(USART_TypeDef* usartx, uint16_t data) { USART_SendData(usartx, data); } void Send_String(USART_TypeDef* usartx, char *str) { while(*str != '\0') //判断字符串是否发送完毕 { Send_Data(usartx, *str); //发送单个字符 str++; //字符地址加1,指向先下一个字符 delay_ms(5); } }View Code
4. 系统功能测试 在完成了前面几个部分的测试之后,对于后面系统功能测试,其实需要做的工作就少了很多。基本上只需要处理好整个系统工作时的时序即可。 测试的过程中,首先不是将所有的采集板全都挂载到基板上去测试,而是只挂载一个测试基板和采集板的协同工作是否正确。这部分的测试大概使用了4个小时的时间,期间调整了两个板子同时上电后的时序,这个时序是通过延时来控制的。基本的流程是上电之后采集板完成系统初始化之后,置位在线信号(置位这个信号之后基板就能够检测到采集板是否在线,如果采集板不在线,对应的端口呈现的状态应该是低电平输入),然后以个比较长的延时(我用了大概5S的时间),而基板则是完成初始化之后也是在一个比较长的延时(我选择2S)之后,再检测采集板的在线情况。使用这样的时序,就可以保证只要整个系统同时上电,能够安全采集到在线采集板的信息。这里虽然是一个比较简单的逻辑,但是设计之时由于忽略了两个板子上电之后完成初始化的过程所使用的时间相差比较大,在经过了很多的测试,并评估之后还是决定采用长延时这种安全的方式去处理上电后检测采集板在线信息的任务。
九. 总结
以上就是整个这次《信号采集系统》的开发过程。就如在前文所说,这个系统是一个很简单的系统,没有任何技术难点可言。写这篇博文,只是想抛砖引玉,希望大家以后可以多推出类似的关于开发流程管理等的文章,大家共同学习进步。在开发的过程中肯定还有很多不完善的地方,非常期待有这方面爱好的朋友能够提出宝贵的意见,以便我改进。最后再上几张产品的图片吧。