高分悬赏:单片机如何接受来自一个设备的触发信号然后控制另一个设备的状态

小弟我刚刚开始学习用arduino解决一点实验中的设备通讯问题,诚恳向大家求助。

1 问题背景
用单片机监控来自一台设备(dev1)的TTL触发信号,如果检测到信号就立刻控制另一台设备(dev2)的开启。dev2实际是一台激光器,所以发出是一组参数,控制激光的频率和占空比以及开启时长。

小弟设计了一个很简单的方案,从dev1的DB9口中引出三根线连到单片机上的rx,tx和GND上,单片机上引出两根线(GND 和一个pin脚)连到dev2的BNC接口引出的两根线上。用while(Serial.available()>0)来监控串口信息,一旦有信息来就控制pin的电平输出。

2 问题描述
现在单片机可以实现接受信号再发出触发信号,但有几个问题
1)因为dev1无论设置为发出的是高电平还是低电平,单片机串口显示的都是0。因为dev1的手册没有提供通讯协议内容,我用的波特兰9600监测的。
2)dev1可以设置发出TTL的时间长短,但只能在设置为1s(只能为整数秒)时单片机能收到信号,高于1s就侦测不到信号。
3)从dev1发出信号,到dev2的激光触发,肉眼可见显著的延迟,大概在1.5~2秒之间。因为小弟做的实验对同步要求非常,要到毫秒级别,所以这个问题是最严重的。

3 求助内容
因为小弟没有计算机或者工科背景,对单片机和数字电路知识薄弱,任何有助于我理解该问题现象或者解决该问题的方案或者建议,小弟感激不尽并殷勤献上积分币。谢谢~

3个回答

分别回答你的几个问题:
1、检验串口是否真的有信息输出,可以下载一些串口调试工具,如secureCRT和putty,在这些软件上设置不同的波特率,看是否有信息输出,
如果把所有的波特率都试过了,还没有信息输出,则应该就是串口没有输出信息。
2、不知道你单片机这边是如何检查TTL信号的,如果是自己用if之类的代码写的,即以轮询的方式检查某个gpio的TTL信号,会受到代码执行时间的限制,
比如说每隔0.5s才轮询一次,则你的TTL信号时间必须大于0.5s单片机才能检测到,建议更换为外部中断触发的方式。如果已经是中断触发了,还不能达到你的要求,
看看你的单片机的晶振频率是多少的,更换更高频率的。
3、第三个问题应该就是你的第二个问题导致了吧

mermana
mermana 谢谢兄弟的建议!
2 个月之前 回复
mermana
mermana 谢谢~
2 个月之前 回复

你的单片机没有中断吗? 用中断触发就好了,可以设置边沿触发,这样反应快

mermana
mermana 谢谢,还没学习怎么用中断触发,想先用简单的方法试试,不过我会去看看相关资料
2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问