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

這幾天在做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)產生的方波)
提高arduino的ADC速率的一些思路/arduino示波器

因爲每次採樣只能採1500個點,整個窗口有8000個點,拼接起來方波不均勻的問題之後再繼續想辦法解決,暫時就這樣吧。

*********************轉載請註明出處************************







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章