提高arduino的ADC速率的一些思路/arduino示波器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zxylv/article/details/91989502
这几天在做arduino(ATmega328)的示波器,上次做的采样率不高。百度偶然得知居然有人把带宽做到1.5M?  怎么能不试一下呢。
国外大神的文章,写的很详细 https://www.instructables.com/id/Girino-Fast-Arduino-Oscilloscope/
程序用英文一搜就有,但有一些小错误,我陆陆续续折腾了两天弄懂了程序并改正。试了一下,带宽并没有所谓的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)产生的方波)
提高arduino的ADC速率的一些思路/arduino示波器

因为每次采样只能采1500个点,整个窗口有8000个点,拼接起来方波不均匀的问题之后再继续想办法解决,暂时就这样吧。

*********************转载请注明出处************************







猜你喜欢

转载自blog.csdn.net/zxylv/article/details/91989502