杯陕西省电子设计专题竞赛
表 5 数据帧格式
地址 数据 校验(异或) 1 字节 3 字节 1 字节
在这里,握手与应答信号不仅作为建立连接和断开连接的命令出现在通信的开始和结束,同时这种机制也存在于通讯的整个过程中。此时,它们提供的服务可以是报告当前的通信双方的状态,如“设备忙”(暂时无法接受)或“设备准备好”(可以接受)等,以保证通信的正常进行;也可以是对数据的传输结果的回应,如“传送成功”或“数据帧错误”等。 设计中使用到的握手与应答信号命令字如表 6 所示。
表 6 通信协议使用的握手信号命令字 执行机构 命令 字 命令字 解 码 0xFF 0xFE 0xFD 0xFC 上 位 机 发送命令 (接受数据) 请求发送数据 停止接受数据 数据传输错误 数据传输正确 NIOS II系统 接收(查询)命令 (发送数据) 开始发送数据 停止发送数据 重新发送错误数据 发送下一路数据 (3) 上位机通信编程
在Windows环境下,应用程序要使用串口进行通信之前,必须向系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。在Windows的系统函数中,均包含了支持通信中断的功能。对串口通信而言,Windows为相应的串口设备开放了用户自定义的输入、输出缓冲区,应用程序只能对输入、输出缓冲区进行操作,数据进出串口的操作均由系统后台完成。以接受为例,系统没接受到一个字符就产生一个低级的硬件中断,系统的串口驱动程序将接收到的字符送到输入缓冲区,此时应用程序就可以通过访问输入缓冲去得到接收到的字符信息。
数据采集系统的串口通信编程以Windows Visual Basic6.0 为开发工具,程序中使用MSComm控件实现串口通信底层技术。使用该控件不必花时间去了解较为复杂的API函数。通过简单的修改控件属性和使用方法和使用控件提供的方法,就可以实现对串口的配置。完成串口接收和发送数据。程序支持在线调整各种通信速率、奇偶校验、通信口等参数而无需重新启动程序并自动保存设计参数,可以实时显示接收到得16通道的数据。当数据采满了自定义接收缓冲区时,系统会自动保存数据到默认路径文件夹里的Excel表中,用户也可以手动保存数据,以便日后需要时可以查看或者作为绘图之用。
四、控制部分
1、控制算法
由A/D芯片资料给出输出,频率的最大值为输入频率的1/2,即Fout最大值为2MHz。 而选择的为16位计数器。则可求得最大门控时间TGATE216?S?32.7ms。考虑到不62?10 15
基于SOPC的工业现场高精度多路数据采集系统
容许有计数器的溢出和系统计算的方便,选取TGATE?25ms。此时系统能分辨的最低频率为FINmin1?103?40Hz。 25考虑到是工业现场的信号,选取测量输入电压的范围为0—5V;由于A/D芯片自身参数的影响,输入电压和输出频率不可能在0—5V上完全线性,把输入电压进行分段处理并把低端的电压适当的放大到A/D的线性区,再进行测量,从而提高测量的精度。
假设取v1,v2,v3,v4作为测量时的基准点。程序初始化时计算出基准电压对应的频率为f1、f2、f3、f4,四个基准电压对应的三段的放大倍数为k1、k2、k3。先比较出测得的电压属于哪段,当输入电压Vin在v1—v2段内时,将Vin放大k1倍后测的频率为fin,将v1、v2放大k1倍后测得频率为f5、f6,则可求得输入信号的电压值为
V?v2?k1?v1?k1?fin?k1
f6?f5同样的原理,当输入电压在v2—v3间时或v3—v4间时,将Vin放大k2倍或k3后再测量和计算。通过这种处理计算的方法,如果当测量得频率有误差,经过这种方法计算后,误差也会减小到1/k1。
另外,由于在实际的工业现场,采集系统一般都是长时间的工作,A/D肯定会存在温漂,因此在设计程序的时候,让系统每隔一段时间就要进行一次自校准, 重新核对基准源对应的频率。让系统在长时间的工作时候仍能保证测得很精确的输入值。
2、程序代码设计
a)、显示模块设计流程图下图25所示:
开 始 LCD初始化,按键中断注册 按SW17下? Y N 开机画面 显示 按SW16下? N Y 核对基准电压 按KEY2下? Y N 循环显示各路信号 按KEY3下? Y N 显示路数加一,并固定显示该路
图23 显示流程图
16
杯陕西省电子设计专题竞赛
b)、定时器模块设计流程图
开 始 定时器中断服务 程序入口 定时器设初值, 定 时 25ms 清中断标志, 读取计数器值 清零计数器 定时时间到? N 处理按键响应中断 调用数据处理子程序 Y 定时器中断服 务 程序 调用UART服务子程序 刷新记数值加一,校准记 数值加一,循环定时记数加一 调用自校准子程序 Y 校准记数到? N 刷新显示每路数据,循环记数到,则显示下路数据 Y 刷新记数到? 循环记数到? N 返 回
图24 定时器模块设计流程图
根据流程图,定时器中断服务程序代码如下: void timer_interrupts()
{ if(checktime==0&&check_enable==1) v_check(); else
{IOWR_ALTERA_AVALON_TIMER_STATUS(HIGH_RES_TIMER_BASE,0); IOWR_ALTERA_AVALON_PIO_DATA(GATE_BASE,1);
counters=IORD_ALTERA_AVALON_PIO_DATA(AD_DATA_BASE); printf(\,road,counters); send_road=road; send_n=n;
compute(counters);
17
基于SOPC的工业现场高精度多路数据采集系统
Receive_ISR();
IOWR_ALTERA_AVALON_PIO_DATA(MULT_V_SELECT_BASE,mul_v); switch(road) {case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12:
case 13:addr=road;break; case 14:addr=0x1e;break; case 15:addr=0x2f;break; default:addr=0;break; }
IOWR_ALTERA_AVALON_PIO_DATA(F_ADDR_SELECT_BASE,addr); if(checktime>=300)
checktime=0,check_enable=1; else
checktime++;
if(xunhuan_enable==1) if(xunhuantime>=100) {xunhuantime=0;
shuaxin_enable=1; if(xunhuan_road>=15) xunhuan_road=0; else
xunhuan_road++;
LCD_SHOW_CHANEL(xunhuan_road); shuaxintime=0; }
else xunhuantime++; else xunhuantime=0;
if(shuaxintime>=25&&shuaxin_enable==1) {shuaxintime=0;shuaxin(xunhuan_road);} else shuaxintime++;
18
杯陕西省电子设计专题竞赛
IOWR_ALTERA_AVALON_PIO_DATA(GATE_BASE,0);
IOWR_ALTERA_AVALON_TIMER_CONTROL(HIGH_RES_TIMER_BASE,0x5); } }
c)、控制算法设计流程图
开 始 Road=14或者15? N 转入频率信号计Y算,结果储存到RAM中,road++。 转入各段对应的算法程序,road++ M=1? N 判断duanshu=?road=? Y c 图25 控制算法设计流程图 五、算法实现 1.通过算法流程图,在对A/D分段线性处理并放大后,采集的数据可以达到一个很好 精度。为了减小干扰信号对数据采集带来的影响,除了在硬件电路上采用一定方法外,软件上加入数字滤波对采样数据进行处理,以提高采集数据的精度。 对于工业现场经常遇到的尖脉冲干扰信号,可采用去极值平均滤波,对m个数据比较,去掉最大值和最小值,再对m-2个数据取算术平均值。 将采集处理后的数据放在RAM中,原本想要使用DMA在RAM与UART之间进行数据传输,但是考虑到数据采集系统数据传输量不大,而且采集速度也较慢,最终放弃使用DMA,而直接使用NIOSII I/O读写程序来传输数据。 2.串行通讯 下面时系统串行通信工作流程图。图 26为上位机接收数据程序流程图,图28为 NIOS II系统查询发送程序流程图。 19

