想用arduino复制一段波形,试验失败,读取100us脉冲会丢数据-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5355|回复: 17

[已解决] 想用arduino复制一段波形,试验失败,读取100us脉冲会丢数据

[复制链接]
发表于 2021-8-10 13:44 | 显示全部楼层 |阅读模式
本帖最后由 mmgg1721620 于 2021-8-17 19:30 编辑

感谢【XlinliY.Zhang】前辈提醒,让我得知 逻辑分析仪 这一神器,老实买了个26块钱的逻辑分析仪,解决问题了。
用逻辑分析仪读取出来一共71个脉冲,而uno使用pulseIn只读取到20余个,丢失太多太多,数好脉冲宽度和时序写好笨代码,用uno发给LPC802它也正确识别并正确动作,可能如果用对方法uno也能读取出正确的脉冲波形?不得而知。
下面这个就是usbee读取到的,某共享单车的开锁指令时序。
360截图20210817192557315.jpg
2021.8.17

各位前辈好。新手求助,在下是刚接触arduino没几天的小白。
我的是想用arduino复制一段指令的波形,这段指令是32F401发送给LPC802的。
本意是先读取指令的波形后,在电脑上显示出高低电平时间,再据此写一段代码用arduino来输出相同波形,这样理论上就可以绕过32F401主机了,LPC802只是一个执行模块。
具体是什么设备就不方便说。
试验了一下,硬件是arduino uno,发现所需读取的波形中脉宽应该是100us,200us,300us,400us这几种。
但是不知道是硬件所限,还是所用函数限制,在读取100us-200us的脉冲时会出现丢失现象,这样读取的数据就是错误的,再怎么弄都不能输出一样的波形,肯定是不行的。

为了解决不能稳定读取100us脉冲,又买了块nano板,用它做为信号发生器,来验证读取和发送是不是一样。
试验过程如下。
我是先在nano板写入了一段代码,是包含100us,150us,200us,等,直到700us脉冲宽度的方波,再用uno板来读取,用了两种方法,一是用pulseIn函数分别读取高低电平脉冲再合并,另一种是用中断口读取完整的波形高低电平时间,发现两种方法都会丢失部分脉冲数据,完败。

首先,nano板循环发送固定波形脉冲,如下

  1. int qin=2;
  2. int i;

  3. int tL[]={100,150,200,250,300,350,400,450,500,550,600,650,700};
  4. int tH[]={100,150,200,250,300,350,400,450,500,550,600,650,700};

  5. void setup(){
  6.   pinMode(qin,1);
  7. }
  8. void loop(){
  9.   digitalWrite(qin,1);
  10.   delay(2000);
  11.   for(i=0;i<=12;i++)
  12.   {digitalWrite(qin,0);
  13.   delayMicroseconds(tL[i]);
  14.   digitalWrite(qin,1);
  15.   delayMicroseconds(tH[i]);
  16.   }
  17.   digitalWrite(qin,0);
  18.   delayMicroseconds(800);
  19.   digitalWrite(qin,1);
  20.   delay(2000);
  21. }
复制代码


然后,使用uno读取,都用的D2脚,使用pulseIn代码如下

  1. int qin=2;
  2. unsigned long time;
  3. void setup() {
  4. Serial.begin(115200);
  5. pinMode(qin,0);
  6. Serial.println("LOW");
  7. }

  8. void loop() {
  9. time=pulseIn(qin,LOW);
  10. Serial.println(time);
  11. }
复制代码


uno,使用中断口读取,如下

  1. int qin=2;
  2. unsigned long time1,time2,time_;

  3. void setup() {
  4. Serial.begin(115200);
  5. pinMode(qin,0);
  6. attachInterrupt(0,change,CHANGE);
  7. }

  8. void loop() {
  9. Serial.println("RISING");

  10. delay(1000);
  11. }

  12. void change(){
  13.   time1=time2;
  14.   time2=micros();
  15.   time_=time2-time1;
  16.   Serial.println(time_);
  17. }
复制代码


结果如下,使用pulseIn读取时,高低脉冲的150us那一个都不见了,而用中断时200us以下的不对,总的脉冲时间倒是差不多。
360截图20210810133456659.jpg
也试过把两块板子互换,uno做信号发生nano接收,结果也一样,早上还因为插错线把uno板上的3V3稳压芯片烧了,发现板子好像不用3V3供电,就拆掉它,板子也能正常工作。
发表于 2021-8-10 18:40 | 显示全部楼层
pulseIn 太慢了,导致快速的脉冲丢失。你需要逻辑分析仪,实在没有的话,
这个 UNO 软逻辑分析仪拿去用吧,采样率 0.3MSPS,最长采样 6ms,大致能满足你的需求: UnoProbe(0.3M).zip (316.4 KB, 下载次数: 6)
由于是自写的,暂不开源。

用法:
a. 安装压缩包内 NtGraph 控件,搜索“安装ocx控件" 即可知具体方法;
b. 向 UNO 烧录压缩包内 hex 文件;
c. 运行压缩包内 exe 文件,填入正确的串口号,连接UNO;
d. UNO_IO2 任意跳变沿开始采样,同步采样 IO2_IO7 总计六个通道。
发表于 2021-8-10 15:09 | 显示全部楼层
老老实实上逻分
发表于 2021-8-10 14:50 来自手机 | 显示全部楼层
求资源,Arduino uno r3   的仿真库文件,大佬,谢谢你!
发表于 2021-8-10 16:35 | 显示全部楼层
用Change作中断触发模式,怎么着也得分清是下降沿还是上升沿啊···
发表于 2021-8-11 00:28 | 显示全部楼层
照理應該是先用示波器抓出溝通波形
(電壓、波形、頻率、佔空比...)
再試著用 ARDUINO 再現同樣的波形,
誤差不要超出接收方的容許值,估計
就能成功吧,用微秒函數 micros() 去做,
如果 16MHz 速度不夠,換 20MHz晶振
 楼主| 发表于 2021-8-11 19:31 | 显示全部楼层
t3486784401 发表于 2021-8-10 18:40
pulseIn 太慢了,导致快速的脉冲丢失。你需要逻辑分析仪,实在没有的话,
这个 UNO 软逻辑分析仪拿去用吧, ...

收到,谢谢,我试试,感谢前辈!
 楼主| 发表于 2021-8-11 19:33 | 显示全部楼层

感谢回复!
我是弄一个东西玩,所以不太可能使用专业的仪器的啦。
 楼主| 发表于 2021-8-11 19:38 | 显示全部楼层
shouzama 发表于 2021-8-11 00:28
照理應該是先用示波器抓出溝通波形
(電壓、波形、頻率、佔空比...)
再試著用 ARDUINO 再現同樣的波形,

感谢回复!
理想状态是自然是要像前辈说的那样用专业设备的,我是弄一个东西弄着玩的,所以专业设备就不太可能啦。
另外试过用micro(),是在中断函数中用的,然而在150us以下的脉冲就抓不住,会丢失,还突发奇想用Serial.println(micro())想读每个脉冲沿时间然后自己算,以为是程序运行步骤导致延时,可是这样读取的us数更是乱七八糟。
 楼主| 发表于 2021-8-11 19:42 | 显示全部楼层
frankhan747 发表于 2021-8-10 16:35
用Change作中断触发模式,怎么着也得分清是下降沿还是上升沿啊···

感谢回复!
只用上升沿或下降沿的时候,丢失的脉冲数会更多
下降沿        上升沿
352                 348
168          276
412          460
512          564
616          668
712          760
812          864
916          968
1016        1068
1120        1164
1216        1276
1324        1368
1416        1516
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 02:42 , Processed in 0.080558 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表