3.通信接口与DEV应用程序 硬件电路就好像是手和脚,真正指挥手脚动作的要靠软件。我做的这个图示仪,最复杂的部分其实是软件。从总体上讲,软件分成三个部分。 第一部分是单片机部分的设备测试操作软件(简称DEV软件); 第二部分是实现PC和单片机的通信协议软件; 第三部分是PC机上实现测试控制,数据处理,GUI界面展示的软件; 这里先介绍第一部分和第二部分的软件。第三部分的软件最复杂,工作量也最大,要在单独的部分介绍。 3.1 DEV软件 之所以称为设备测试操作软件。主要还是基于能通过软件做的,都通过软件做;能让PC干的活都让PC干。在硬件设备部分,单片机只执行最基本的测试操作。DEV软件主要做以下几件事: 1. 初始化 a) 对单片机端口初始化:现在的版本里端口基本没有,初始化很简单。 b) 初始化DA模块:MCP4725有封装好的Arduino应用包。只要调用现成的函数就可以创建DA对象实例,初始化DA芯片; c) 初始化AD模块:ADS1115也有封装好的Arduino应用包。只要调用现成的函数就可以创建AD对象实例,初始化AD芯片; 2. 等待从串口接收PC发来的指令 3. 当收到有效的指令后,开始执行指令。目前定义的指令有以下三条: 0x10: 初始化设备。 将所有的输出都置零 0x20: 测量。 根据收到的测量模式(mode),Ib/Vb,Vc的值,设置DA输出(先输出Ib,再输出Vc),读取AD的结果(Vbe采样值,Ic采样值,2.5V参考电压采样值)。将测试结果按通信协议打包后发回给PC; 测量模式目前只定义了两种: 1)工程模式:工程模式下,通过DA设定了Ib和Vc,读取AD采样结果后,Ib,Vc保持不变。这样便于交互式调测时了解实际输出的电压情况; 2)正常模式:正常模式下,测量完成后,将Ib,Vc清零。这在正常测量时非常重要,可以有效避免器件发热而导致特性漂移。 0x50:Echo 返回当前状态。基本就把PC发送过来的指令,在原样返回。返回时还带有当前的Ib, Vc,Vref采样值。特别是2.5V参考电压Vref非常有用。PC侧可以了解当前的Vref实际值,再基于这个值对要测量的数据进行编码,可以减少误差。 4. 自检测试 这部分其实是单独的应用。按照一定规律自动生成Ib,Vc,对Ib, Vc进行编码,通过DA发送;然后再采样回来,解码;将解码结果通过USB串口发送出来。利用Arduino开发环境自带的串口监视器,可以了解当前硬件的工作状况。 3.2 通信协议 通信协议的基本结构包括四层:最底层是物理层,确保物理连接可靠;之上是通信链路层,定义数据交换的基本格式;再往上是建立通信连接的网络层,确保信息可靠交换;最上层是应用层,执行真正的测试任务。
PC和测试硬件之间的物理层是通过USB接口连接。 链路层是仿真的RS232串口协议。因此,在PC侧需要根据Arduino Nano上串口芯片的型号安装虚拟串口软件,PC的设备管理才能发现硬件串口号;我买的这个Arduino Nano串口芯片是CH340,PC侧必须要安装CH340的驱动程序。 由于是仿真的串口,所以无论是PC侧,还是硬件设备侧,通信口的初始化与串口初始化是一样的。发送和接收函数也是面向字符的串口操作函数。 在链路层之上是建立通信连接的网络层。这一层要确保PC发送给设备(DEV),以及DEV返回给PC的消息能被准确的接收和解析。这就涉及到通信消息字段的定义,已经通信协议的实现; 在最上层是执行测试的应用层。负责对要设置的ib,vc进行编码,调用低层函数发送指令消息,并接受指令执行结果,对结果进行解码,解析。 3.2.1 通信消息字段定义
PC->DEV: 包括12个字节,4个部分。如下图:
DEV->PC:包括16个字节,5个部分。如下图:
由于消息字段是固定长度的字节串,不能直接传浮点数。哪怕是整数也不行。需要把要设置的ib, Vc转换成和DA匹配的字节串。因此数据的编解码,电平平移的计算,都在PC侧完成。只将编码后的适合DA转换的字节串发送个测试设备;而测试设备在完成采样后,直接将采样的结果(16bit)转换成4个16进制字节串发送给PC;由PC解析出最终的结果。这也符合把能让PC干的活都交给PC干的原则。 3.2.2网络层握手协议 为了保证PC和设备可靠通信,设计了一个简单的握手协议。 l 由PC发往DEV的每条信息,DEV首先原样返回,作为握手信号,然后再解析消息内容。根据消息中的指令,完成动作后,立即发送结果给PC; l PC侧在发送完消息后,首先读取第一条消息,如果和发送的消息一致,说明对端接收正常;然后再等待读取第二条消息,就是对指令的反馈; DEV发送给PC的消息就不考虑握手协议了。
网络层的工作方式如下图:
3.2.3 应用层测量控制 原来并没有考虑设计应用层的测量控制协议。通常情况就是根据要设定的Ib,Vc,根据硬件设备的DA分辨率进行编码,然后就发送给设备进行测试了。 但在当前版的硬件电路里,可以随时采集Vref的值。这个值就是当前的0电位值,这个值的两倍就是当前DA工作的参考压值,以此可以计算出更准确的DA分辨率。利用这个实时计算出的分辨率对要设定的数据进行编码,准确度也会提高。 因此设计了一个简单的应用层控制协议。即每次发送测试指令前,先发一个ECHO指令,获取当前设备的状态及Vref值,以这个值对要发送的ib,Vc进行编码。然后在发送测试指令,获取测试结果。
|