zoologist 发表于 2015-10-4 20:56:25

用示波器“看” arduino (1)

实验条件 Arduino Uno 16M 示波器 Teledyne LecoryWave Runner 606Zi 600Mhz 20GS/s
实验1,只使用DigitalWrite 能制造出来的最大频率是多少?

const int PinA =13;      

void setup() {
pinMode(PinA, OUTPUT);
digitalWrite(PinA,LOW);
}

void loop() {
digitalWrite(PinA,HIGH);
digitalWrite(PinA,LOW);
digitalWrite(PinA,HIGH);
digitalWrite(PinA,LOW);
digitalWrite(PinA,HIGH);
digitalWrite(PinA,LOW);
delay(500);
}
使用示波器抓图如下:


我们设置的Delay 是500ms, 然后示波器的水平方向每一格也是500ms,垂直方向是电压,当前选择每格2V,因此看起来差不多是5v左右,符合预期。
我选择了了Stop功能,放大波形查看。





实际上我们看到的黄色竖线实际上是一组波形,就是对应我们的拉高拉低。
示波器有测量功能,直接调用该功能进行测试:



首先看看幅度,是4.946V,具体的测量方法示波器直接给出。





再测量一下频率:是100kHz.
关于测试的方法可以在菜单中选择(通用的方法是斜率50%的位置)



测量周期,其实给出来了频率,周期是可以直接折算出来的



结论:如果我们用 DigitalWrite拼命上下拉,最高是可以输出100Khz频率的。

实验2,使用PortB赋值直接拉出来的频率是多少?

const int PinA =13;      
void setup() {
pinMode(PinA, OUTPUT);
digitalWrite(PinA,LOW);
}

void loop() {
PORTB = B100000; //digitalWrite(PinA,HIGH);
PORTB = B000000; //digitalWrite(PinA,LOW);
PORTB = B100000; //digitalWrite(PinA,HIGH);
PORTB = B000000; //digitalWrite(PinA,LOW);
PORTB = B100000; //digitalWrite(PinA,HIGH);
PORTB = B000000;//digitalWrite(PinA,LOW);

delay(500);
}

可能是因为速度太快的缘故,波形感觉畸变比较严重。




测试幅度,不知道为什么会达到5.248v



同样,使用自带功能测试频率:惊人的 7.99590Mhz




因为一个周期里面实际上是有两条指令的(拉上拉下),已经非常接近主芯片的16Mhz了。

maxims 发表于 2015-10-4 23:53:54

好精神~值得我们学习~

瘦网虫 发表于 2015-10-5 10:49:37

感谢分享,认真学习了。

asdfcgdc 发表于 2015-10-5 15:31:47

学习了                                                         

suoma 发表于 2015-10-5 20:00:17

谢谢分享学习一下

wxws 发表于 2015-10-6 11:54:20

这示波器也太高档了

darkorigin 发表于 2015-10-6 23:38:19

说明arduino的效率还是蛮高的吧?至少BOOSLOAD不会一直常驻 导致效率下降吧

sanyouhi 发表于 2015-10-8 12:07:08

使用PORT语句对端口赋值对应的汇编指令就一个OUT,且时钟数为1,效率自然高,不像digitalWrite要先一大堆if switch来判断。ARDUINO之于AVR犹如STM32固件库之于寄存器,效率没有可比性。
AVR IO翻转速率并不快,输出波形还是非常好,一般不会有这么大过冲的,畸变多半是因为你示波器探棒接地夹子没接对在测量线上产生了振铃。

P.S.杀AVR这种蚂蚁用不着用力科606这么高大上的牛刀吧。。。。。:L

hubertdong 发表于 2015-10-8 14:48:13

问题:
为什么是PORTB?而且是6为二进制?这6为二进制分别对应那几个脚?
谢谢!

zoologist 发表于 2015-10-8 15:28:30

hubertdong 发表于 2015-10-8 14:48 static/image/common/back.gif
问题:
为什么是PORTB?而且是6为二进制?这6为二进制分别对应那几个脚?
谢谢!

1.        关于Port x的说明https://www.arduino.cc/en/Reference/PortManipulation

PORTD maps to Arduino digital pins 0 to 7

DDRD - The Port D Data Direction Register - read/write
PORTD - The Port D Data Register - read/write
PIND - The Port D Input Pins Register - read only
PORTB maps to Arduino digital pins 8 to 13 The two high bits (6 & 7) map to the crystal pins and are not usable

DDRB - The Port B Data Direction Register - read/write
PORTB - The Port B Data Register - read/write
PINB - The Port B Input Pins Register - read only
PORTC maps to Arduino analog pins 0 to 5. Pins 6 & 7 are only accessible on the Arduino Mini

DDRC - The Port C Data Direction Register - read/write
PORTC - The Port C Data Register - read/write
PINC - The Port C Input Pins Register - read only

sanyouhi 发表于 2015-10-8 18:16:24

digitialwrite 的看起来平滑?你是指哪张图?第2、3张图吗?

只要探棒带宽100M以上就可以。下面这些做法可以有效改善探棒及同轴线对实际信号的影响:

1、被动探棒不用钩子而直接用里面的探针;
2、地线夹子与测量点附近最近地回路相连,如果你没用地线夹那就确保额外的地线尽可能的短;
3、探棒、示波器、被测源尽量阻抗匹配;

其实一般测量里只要带宽足够并且做到前两点就可以了,想做到完全看不见振铃在技术上和哲学上都是不可能,只是你发的图感觉明显是地线没接好。

sanyouhi 发表于 2015-10-19 16:59:05

看波形细节时基不可太大,再高端的示波器存储深度和采样率也是有限的。

zoologist 发表于 2015-10-19 20:06:49

sanyouhi 发表于 2015-10-19 16:59 static/image/common/back.gif
看波形细节时基不可太大,再高端的示波器存储深度和采样率也是有限的。

前面图片采样时间太长了,分配到短的时间上点数就太少了

白菜虫虫 发表于 2015-10-20 11:14:00

bootloader是重启之后才运行的,导致效率下降的是loop(){}外面的一些看不见代码的东西

红豆大红豆 发表于 2015-10-26 07:30:32

你们太会玩了
页: [1] 2
查看完整版本: 用示波器“看” arduino (1)