项目概述
客户要做一款测试锁体的治具设备,当被测锁体双向舌受到一个100N的力时,会触发一个解锁信号;检测到信号后便收回主锁舌,主锁舌的伸出和收回都有相应的信号被触发。还有其他一些杂七杂八的信号就不拿出来废话了,反正要求能设定压力值,能判断测试通过与否,能显示数据,关键是还要连接客户公司的MES。听到这我心态都要崩了呀,这通讯协议不好对接。后面协商说留个通讯接口就OK了。
测试方案
方案一:原先想用气缸来推动锁舌,以此来触发锁体信号。但是想想觉得气缸这玩意不合适,1、其行程位置不合适,位置就原点和尽点。当气缸行至尽点时,气压允许的情况下则是其所能输出的最大压力;想要达到压力值可调,那么就要求气缸的行程能够动态的也发生改变,但是看着这玩意想想还是算了。2、其动力源不合适,气缸伸缩速度的快与慢会影响到整个测试;快了会产生很大的震动及噪音,甚至会打坏测试产品。慢了则会影响测试效率,当设定压力较大时,还有可能输出压力不足;因为气缸的低速是以降低气压量换取的。气压低了,输出力自然也低。据此否定此方案
方案二:用单片机控制步进电机的行程,以此来向锁舌输出100N的力,同时用传感器采集压力变化量(网上有很多压力传感器,都是已经采集转换好的数字数据,直接用485通讯就能获取,成本较高。但是因为我懒,不想去编那个通讯程序。后来直接买了个八位的数模转换芯片ADC0809自己焊,这省钱的本事也真没谁了。哈哈哈!),再用ADC0809将模拟量转变成数字量传送给单片机处理,经单片机处理后的数据再传输到液晶屏进行显示。完美!
关于串口通讯的坑!
由于保密原因这里就不把产品图片和设备的照片发出来了。废话不多说,来!上菜。
下面是部分程序截图。
1、这是通讯格式:
2、串口中断服务函数
PC收到指令后,先返回指令码。再返回查询信息。这时有个小问题,串口一次只能发送八位数据(即255),但是我要把产品测试OK和测试NG的数量发送给PC,如果数量超过255,那么只会发送数据的低八位,高位被舍弃。例如测试OK数量为300(0X12C),当把300发送给PC时,PC只收到2C,而不是12C。遇到问题,鞭它!这时就需要用到开始定义的几个变量了,程序判断数据超过255,就先将数据转化一次,求出十六进制的每一位,在以两位两位(十六进制的一位是二进制的四位)的形式通过串口发送给PC。(这是晚上做梦的时候想出来的,哈哈!)
3、在测试过程中向PC反馈测试信息(坑在此!)
这串口发送程序有问题,当发送完数据后程序就停止不前了,导致后面测试无法进行。刚开始以为是while(!TI);等待数据发送结束的问题,改用delay(100);以延时来判定数据发送完毕,上机后还是不行。又以为是串口初始化的问题,改了几种串口的工作方式,也还是不行。反复加bug调试程序,也找不出问题。气死哥了!没办法,只能祭出大脑了,用脑子跑一便程序。跟着程序走了走,发现程序原来卡在串口中断函数那里了。
这个问题的关键点是,只要开启串口中断允许位ES,无论是发送还是接收引起的中断,程序都会执行一次中断服务函数。而我恰好在中断函数开始处等待接收数据(上图标记处),这就矛盾了,程序跑进坑里去了。解决办法,1、不走这条路,在发送数据前关掉串口中断ES,发送完在开启ES。2、程序走到这时自己把坑填平,把while(!RI);换成delay(100);用延时来判定接收结束。nice!
总结
关于编程的一些个人看法。想编程呢,首先要会看别人的程序。如果拿到一份程序,你看了就能知道别人想干嘛,编的是什么程序,达到什么目的。那你就是大拇指!如果你拿到一份程序,你连别人想干嘛都不知道,想要用程序达到什么目的都不清楚。显然你编的程序也没多少看点。CSDN不错,有很多大佬,每次看完他们的程序我都刷新一次对编程的看法,诸如格式的规范,程序算法、以及程序优化。其实编程不是写得满屏代码就是好;也不是用一大堆指针来把数据当皮球踢来踢去的,搞得人人都看不懂写的什么鬼东西就很厉害。编程应该是把复杂的问题简单化,把自己的控制想法用代码告诉机器该做什么,该怎么做!由于时间问题就不多废话了…以上纯属个人观点,那里有不对的还请忽略!