2016-02-10 136 views
1

根據手冊,Arduino A/D轉換器大約需要0.1ms。實際上,我的測試表明,在一個Uno中,我可以在一個循環中每秒執行大約7700次。模擬期間的計算讀取Arduino

不幸的是analogRead在讀取過程中等待,很難完成任何事情。

我希望將計算與一系列A/D轉換交錯。是否有任何方法啓動analogRead,然後檢查時序並在稍後獲取完成的值?如果這需要低級別和不可移植到其他版本,我可以處理。

尋找一種解決方案,可以定期對Arduino上的所有通道進行採樣,然後通過SPI或I2C發送數據。我願意考慮中斷,但抽樣必須保持非常週期性。

回答

1

是的,你可以開始ADC轉換而不用等待它完成。不要使用analogRead,請查閱Nick Gammon的示例here,在「無需讀取的讀取」部分。

爲了實現一個常規的採樣率,您可以:

1)讓它在自由運行模式,它需要的樣品一樣快,因爲它可以操作,或

2)使用定時器ISR啓動ADC,或者

3)使用millis()定期啓動轉換(一種常見的「輪詢」解決方案)。請務必通過向先前計算轉換時間加入到當前的時間步驟到下一個轉換時間,

uint32_t last_conversion_time; 

void setup() 
{ 
    ... 
    last_conversion_time = millis(); 
} 

void loop() 
{ 
    if (millis() - last_conversion_time >= ADC_INTERVAL) { 
    <start a new conversion here> 

    // Assume we got here as calculated, even if there 
    // were small delays 
    last_conversion_time += ADC_INTERVAL; // not millis()+ADC_INTERVAL! 

    // If there are other delays in your program > ADC_INTERVAL, 
    // you won't get back in time, and your samples will not 
    // be regularly-spaced. 

不管你如何週期性地開始轉換,你可以完成任何調查附加一個ISR,當它完成時調用。

請確保將volatile關鍵字用於ISR和loop之間共享的變量。