|
本帖最后由 mmgg1721620 于 2021-8-17 19:30 编辑
感谢【XlinliY.Zhang】前辈提醒,让我得知 逻辑分析仪 这一神器,老实买了个26块钱的逻辑分析仪,解决问题了。
用逻辑分析仪读取出来一共71个脉冲,而uno使用pulseIn只读取到20余个,丢失太多太多,数好脉冲宽度和时序写好笨代码,用uno发给LPC802它也正确识别并正确动作,可能如果用对方法uno也能读取出正确的脉冲波形?不得而知。
下面这个就是usbee读取到的,某共享单车的开锁指令时序。
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板循环发送固定波形脉冲,如下
- int qin=2;
- int i;
- int tL[]={100,150,200,250,300,350,400,450,500,550,600,650,700};
- int tH[]={100,150,200,250,300,350,400,450,500,550,600,650,700};
- void setup(){
- pinMode(qin,1);
- }
- void loop(){
- digitalWrite(qin,1);
- delay(2000);
- for(i=0;i<=12;i++)
- {digitalWrite(qin,0);
- delayMicroseconds(tL[i]);
- digitalWrite(qin,1);
- delayMicroseconds(tH[i]);
- }
- digitalWrite(qin,0);
- delayMicroseconds(800);
- digitalWrite(qin,1);
- delay(2000);
- }
复制代码
然后,使用uno读取,都用的D2脚,使用pulseIn代码如下
- int qin=2;
- unsigned long time;
- void setup() {
- Serial.begin(115200);
- pinMode(qin,0);
- Serial.println("LOW");
- }
- void loop() {
- time=pulseIn(qin,LOW);
- Serial.println(time);
- }
复制代码
uno,使用中断口读取,如下
- int qin=2;
- unsigned long time1,time2,time_;
- void setup() {
- Serial.begin(115200);
- pinMode(qin,0);
- attachInterrupt(0,change,CHANGE);
- }
- void loop() {
- Serial.println("RISING");
- delay(1000);
- }
- void change(){
- time1=time2;
- time2=micros();
- time_=time2-time1;
- Serial.println(time_);
- }
复制代码
结果如下,使用pulseIn读取时,高低脉冲的150us那一个都不见了,而用中断时200us以下的不对,总的脉冲时间倒是差不多。
也试过把两块板子互换,uno做信号发生nano接收,结果也一样,早上还因为插错线把uno板上的3V3稳压芯片烧了,发现板子好像不用3V3供电,就拆掉它,板子也能正常工作。
|
|