2021年10月19日 星期二

關於 atmeg328p 的 adc (類比轉數位) 取樣速率

當 atmega328p 使用 16MHz 振盪器運作時, adc clcok 除頻器設定可調整成 125kHz, 250kHz, 500kHz, 1MHz, 2MHz, 4MHz, 而完成一次 adc 取樣(sample)約需 13.5 個 adc clock cycle, 因此理論上每秒可以達到 9.259k, 18.518k, 37k, 74k, 148k, 296k 的取樣率(SPS:sample per second), 當 adc clcok 小於 1M 時, 用 cpu 搬動記憶體的速度遠比 adc 的取樣時間還快, 在 1M adc clock(含)以下, 達到 74k SPS 應該不成問題. 一旦超過像是 2M 或 4M 時, 記憶體搬動速度, 開始小於取樣時間, 取樣間隔將由記憶體搬動的時間為準, 除非有 DMA 加速, 否則用 CPU 搬動是一大瓶頸, 我實驗的結果, 保守估計:2M adc clock 時應可達到 140k SPS, 但 4M adc clock 時雜訊增多, 無法正確估計. 另外 2k 記憶體是造成取樣時間無法持續太久的主因, 但若是用來分析像是AC 110V/220V 50/60Hz 市電(通過電阻分壓器降壓至 5V 以下), 應當能勝任,且綽綽有餘.

備註:

如果固定使用 1000 取樣點作為示波器, 觀看波形: 當使用取樣率 fs = 100kHz 時, 每個取樣點間隔是 1/100k 秒, 1000 點就等於 1k * (1/100k) = 1/100 秒 = 0.01 秒 , 用來紀錄 100Hz 的波形時, 這 1000 點的時間(0.01 秒), 正好看到一個週期(1/100). 若提高取樣率成 2 倍, 例如 fs = 200k, 則一個取樣點是 1/200k 秒, 取樣 1000 點等於 1k * (1/200k) = 0.005 秒, 同樣觀看 100Hz 的頻率時,時間只足以看到半個週期(0.005 秒 = 0.5/100), 以此類推, 4 倍取樣率取 1000 點, 就只能看到 1/4 周期 ...

實驗一個取樣 1280 點來看 60Hz 旋波(測量點, 只要空接一條長導線, 就能感應到市電 60Hz 的旋波), 切到 74k SPS (1M adc clock)取樣率時, 能完整紀錄一個周期, 切換成 2M adc clock 樣取時, 看到半周期, 拉到 4M 時約略看到 1/4 周期的旋波. 但測量出的週期時間約莫多出 24% 左右, 因此估計 atmega328p 最大取樣率可能落在  296/1.24 = 238.7k SPS 左右.

文章閱讀: http://www.openmusiclabs.com/learning/digital/atmega-adc/

簡單 c 程式碼, 根據五行八卦相生相剋推斷吉凶

#include "stdio.h" // 五行: //               木2 //      水1           火3 //         金0     土4 // // 先天八卦 vs 五行 //                    ...