版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
这几天在做arduino(ATmega328)的示波器,上次做的采样率不高。百度偶然得知居然有人把带宽做到1.5M? 怎么能不试一下呢。
程序用英文一搜就有,但有一些小错误,我陆陆续续折腾了两天弄懂了程序并改正。试了一下,带宽并没有所谓的1.5M,没具体算,估计0.xM吧。
之后结合大神的程序,自己写了一个更精简的出来,如果有还能继续精简的,还望指点。
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include
"wiring_private.h"
unsigned char x[ 1500 ]; //缓存数组 int i; uint8_t pin; void setup() { Serial.begin( 2000000 ); //波特率2M(据说最高115200,但我设到 2 000 000 并没有什么问题) pin=A0- 14 ; ADMUX = (DEFAULT << 6 ) | (pin & 0x07); //这是用analogWrite()精简出来的几句,考虑到 //函数调用需要一定时间,所以干脆把其中用到的 //语句直接搬了过来,并把定义变量放到了外面 sbi(ADMUX,ADLAR); cbi(ADCSRA,ADPS2); // ADC时钟设为1/4主时钟,再小就转换不了了,一直输出0xff sbi(ADCSRA,ADPS1); // cbi(ADCSRA,ADPS0); // } //int analogRead1(uint8_t pin); void loop() { for (i= 0 ;i<</span>1500;i++) { sbi(ADCSRA, ADSC);//这也是用analogWrite()精简出来的 while (bit_is_set(ADCSRA, ADSC));//这也是用analogWrite()精简出来的 x[i]= ADCH;//这也是用analogWrite()精简出来的 } for(i=0;i<</span>1500;i++) { Serial.write(x[i]);// 串口输出数组 } } // bit_is_set() 、 sbi() 在头文件中是用 #define 定义的, //编译时侯会被换掉,也就没手动拿过来 |
这个程序AD转换一次的时间大约5.6us,应该算是比较快的了。效果图:(观察用arduino(ATmega328)的analogWrite(127)产生的方波)
*********************转载请注明出处************************