題:
我怎麼知道採樣頻率?
user3284376
2014-03-11 02:30:34 UTC
view on stackexchange narkive permalink

我開始對採樣率和波特率等感到困惑。我有以下Arduino代碼:

  #include <eHealth.h>extern volatile unsigned long timer0_overflow_count; float fanalog0; int模擬0; unsigned long time;字節serialByte; void setup(){Serial.begin(9600);} void loop(){而(Serial.available()>0){ ();如果(serialByte =='S'){while(1){fanalog0 = eHealth.getECG(); //使用timer0 = >每4 us 1個滴答時間=(timer0_overflow_count << 8)+ TCNT0; //微秒轉換。時間=(時間* 4); //打印文件進行仿真//Serial.print(time); //Serial.print(“”); Serial.print(fanalog0,5); Serial.print(“ \ n”);如果(Serial.available()>0){serialByte = Serial.read();如果(serialByte =='F')中斷; }}}}}  

既然沒有延遲中斷,那麼採樣率/頻率是多少?它基於Arduino ADC的速度嗎?當我增加波特率時,我是在增加採樣頻率還是在通過串行端口發送數據的速率?

七 答案:
alexan_e
2014-03-11 03:23:02 UTC
view on stackexchange narkive permalink

在..arduino-1.5.5 \ hardware \ arduino \ avr \ cores \ arduino \ wiring.c中設置Arduino ADC時鐘速度。

這是相關部分

  #if defined(ADCSRA)//將A / D預縮放因子設置為128 // 16 MHz / 128 = 125 KHz,在所需的50-200 KHz範圍內。 // XXX:這不適用於其他時鐘速度,並且//此代碼應使用F_CPU確定預分頻因子。 sbi(ADCSRA,ADPS2); sbi(ADCSRA,ADPS1); sbi(ADCSRA,ADPS0); //啟用A / D轉換sbi(ADCSRA,ADEN);#endif  

對於16MHz Arduino,ADC時鐘設置為16MHz / 128 = 125KHz。 AVR中的每次轉換都需要13個ADC時鐘,因此125KHz / 13 = 9615Hz。由於您讀取結果並通過串行端口發送結果,因此延遲會隨著波特率的降低而增加。波特率越低,發送相同長度的數據所需的時間就越長,調用下一次ADC轉換所花費的時間也就越長。

應用中的實際採樣率可以通過使用確定調試器或模擬器,但更簡單的解決方案是每次執行轉換時都切換數字引腳,並測量數字引腳切換的頻率。

另外,我的時間戳之間的時間從1300一直增加到16400,確定它們應該保持不變嗎?也就是說,在9600處,在115200處,經過很多時間,它們僅增加到大約1500。
@user3284376關於您的時間戳代碼,我認為它不能始終有效(可能會在錯誤的時間因某些中斷而產生偏差)。我建議您發布一個有關如何在Arduino上獲得高精度定時的特定問題,並將代碼的相關部分放在那裡。
Salar Khan
2015-09-26 18:05:19 UTC
view on stackexchange narkive permalink

我也想為一個項目獲得高采樣率。事實證明,可以將ADCSRA寄存器的ADPS2,ADPS1,ADPS0位配置為獲得76923 s / s或76.8 ks / s的採樣率。但是,請注意,我正在以自由運行模式運行arduino的ADC,以下幾行對我有用。

  #ifndef cbi#define cbi(sfr,bit)(_SFR_BYTE(sfr)& = 〜_BV(bit))#endif#ifndef sbi#定義sbi(sfr,bit)(_SFR_BYTE(sfr)| = _BV(bit))#endifvoid setup(){//將預分頻器設置為16(16000KHz / 16 = 1MHz )//警告:超過200KHz的10位結果不可靠.//ADCSRA | = B00000100; sbi(ADCSRA,ADPS2); cbi(ADCSRA,ADPS1); cbi(ADCSRA,ADPS0); //在ADCSRA中設置ADIE( // ADCSRA | = B00001000; sbi(ADCSRA,ADIE)}  

在此頻率下通常10位結果不可靠。這意味著增加採樣率會降低結果的精度。因此,我僅使用高8位,因為在此預分頻器中,高8位是可靠的。您可以在此頁面上詳細介紹,這傢伙真是太棒了!他使用UNO http://www.instructables.com/id/Girino-Fast-Arduino-Oscilloscope/

製作了高采樣率示波器
user34028
2015-12-21 01:32:34 UTC
view on stackexchange narkive permalink

以9600的波特率通過串行發送11位,但是對於採樣,我將其存儲在盡可能少的延遲的數組中,然後一旦完成,我就通過串行端口將其發送以供python讀取腳本。我正在使用matplotlib進行FFT。我收聽0-5V信號,然後不使用delay()函數,而是將AnalogRead()值存儲到該數組中。在瞬間完成讀取,然後開始串行數據轉儲。當我使用另一個連接的Arduino的tone()校準輸入頻率時,我意識到必須將索引除以8915,才能使精度達到0.1 Hz之內。因為必須除以採樣頻率才能獲得正確的索引間隔,所以我的猜測是Arduino採樣頻率(至少我的代碼是8915Hz)。

Cybergibbons
2014-03-11 03:14:33 UTC
view on stackexchange narkive permalink

每個循環都通過9600bps串行鏈路打印8個字符。每個字符佔用10位(1個開始,8個字符,1個停止)。這意味著您只能經歷大約120次/秒的循環。

analogRead()函數在理論上可以大約9600次/秒進行採樣,實際上大約是8600次/秒。次/秒

您正受到串行通信的束縛。

那麼增加到115200,給出1440次/秒,是採樣率嗎?
給予或接受,是的。您需要記住,串行要求另一端做出響應,因此您依賴於PC做出響應。這不是確定性的,因此會產生抖動。
您在Arduino端上是正確的,一切似乎都很好,但是在Python上,它要慢得多,我需要做些什麼來提高計算機端的性能?
您不必將其視為PC上串行性能的問題,而是如何使採樣與數據發送分離。
@Cybergibbons-不,因為它是在Uno上運行的,USB和串行接口已解耦,所以除了發出'S'字符和不發出'F'字符外,對PC的依賴都沒有。此處發布的草圖及其運行平台將很高興在USB串行配套微型計算機上拋出串行數據,而忽略了USB另一端的數據是否跟上。
ThermoRestart
2019-07-06 01:52:31 UTC
view on stackexchange narkive permalink

有關採樣率和波特率之間差異的部分,它們是不同的測量值。

採樣率是設備(arduino)可以重新創建輸入模擬值的數字表示的頻率。

波特率是在通信通道中傳輸信息的速率。它描述了微控制器與外界(計算機)之間的通信速率。

我建議使用這個electronics_stack_exchange鏈接。 https://electronics.stackexchange.com/questions/135056/sampling-rate-data-rate-and-bandwidth

E_Sh
2019-11-14 04:39:03 UTC
view on stackexchange narkive permalink

8915Hz-非常接近125000/14〜= 8928.6我最初的猜測是相鄰轉換之間需要一個間隙,一個採樣的ADC時鐘和本身轉換的13個ADC時鐘,很小的誤差可能是不完美的時鐘源的影響我還不確定。這個話題對我來說已經很實際了,因為採樣數據必須饋入數字濾波器。

我不確定當您說“這個話題對我來說現在是實際的,因為採樣數據必須饋入數字濾波器時”的意思。您有類似的問題嗎?
每次轉換都在ADC時鐘的上升沿開始,並且至少有一個ADC時鐘週期丟失了執行代碼。所以是的,8928.6 Hz是通過緊密循環調用`analogRead()`獲得的最快速度。在自由運行模式下保持非常一致的9615.4 Hz。
Gil
2020-08-20 00:34:06 UTC
view on stackexchange narkive permalink

您是否考慮過購買Saleale或類似的邏輯分析儀。簡單便宜的方法效果很好,使您可以輕鬆進行這些測量。這比我大多數應用程序中的範圍要好。如果存在信號重疊,則會顯示。我只是將一個引腳專用於測試,並將其稱為testpin。只需在啟動例程時將其設置為高,然後在完成時將其設置為低即可。它具有8個輸入,因此您可以看到信號之間的關係。您可以監視A / D,啟動觸發器並將串行放置在另一個引腳上。您還剩下6個其他東西。花幾個小時,它將成為您最重要的工具之一。我使用Linux Mint,所以我只是將其保留在另一個屏幕上,因此只需單擊一下即可將其顯示在視圖中,無論該窗口是否在視圖中,它都將運行。如果您有未使用的輸入,請當心,它們將充當天線並拾取雜散信號,尤其是來自開關電源的雜散信號。只需選擇所需的頻道或忽略不相關的頻道即可。內置分析儀可以縮短串行信號的工作時間。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...