亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有什么辦法可以讓我的Mcp3008采樣均勻嗎?

有什么辦法可以讓我的Mcp3008采樣均勻嗎?

侃侃爾雅 2024-01-04 10:07:55
我正在做一項工作,使用 ADC mcp3008 樣本傳感器數據并收集它們直到 10k。然后將其發送到 influxdb。所有這些工作應該在 1 秒內完成。這才是重點?,F在的問題是,每條數據的時間戳非常不均勻。如你看到的:我希望時間戳統一為0.1ms。我的意思是 influsdb 中的時間精度應該是 0.1ms。但不幸的是,寫入參數time_ precision只有's'、'ms'、'u'或'n'。所以我能做的就是讓采樣過程更加統一,對嗎?我使用多處理模塊來完成這項工作。這是我的原始代碼:import Adafruit_GPIO.SPI as SPI # Import Adafruit GPIO_SPI Moduleimport Adafruit_MCP3008         # Import Adafruit_MCP3008import serialimport timeimport datetimefrom influxdb import InfluxDBClientfrom multiprocessing import Process, Queuedef producer(name):    i=0    while True:        begin=time.time()        body = []        while i<10000:            val = round(mcp.read_adc(0),4) #here read the data from SPI port            current_time = datetime.datetime.utcnow()            js = {                "measurement": "Double",                "time": current_time,                "tags": {                },                "fields": {                    "sensor2": val                }            }            body.append(js)            i+=1        i=0        res = client.write_points(body) #Send influxdb 10k data at once        body.clear()        end=time.time()-begin        print(end,name)           if __name__ == "__main__":    HW_SPI_PORT = 0 # Set the SPI Port. Raspi has two.    HW_SPI_DEV  = 0 # Set the SPI Device    mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(HW_SPI_PORT, HW_SPI_DEV))    client = InfluxDBClient(host='XXXXX', port=8086, username='admin', password='admin', database= 'db',ssl=False, verify_ssl=False)    p1 = Process(target=producer,args=(0,))    p2 = Process(target=producer,args=(1,))    p3 = Process(target=producer,args=(2,))    p4 = Process(target=producer,args=(3,))    p5 = Process(target=producer,args=(4,))    p6 = Process(target=producer,args=(5,))    p1.start()    p2.start()    p3.start()    p4.start()    p5.start()    p6.start()是的...我必須經過六個過程才能在平均一秒內完成..
查看完整描述

1 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

幾個建議。

  1. 如果需要對 ADC 進行均勻采樣,這是一個更難的問題。

  2. 如果您“只需要”統一的時間戳間距,則可以根據需要進行采樣,然后將時間戳設置begin + iteration * 0.1ms為. 此選項對于任何類型的科學數據收集都不是很好。10k 樣本/秒聽起來像是您需要均勻間隔的采樣(例如對于音頻)。所以我會忽略選項2。

對于選項 1,您需要循環具有一致的迭代時間。這對于 RPi 上的 python 來說很難保證(我假設你使用的是 Pi)。RPi 操作系統不是實時的,因此您的循環可能會隨機延遲。這里唯一真正的選擇是使用外部微處理器來觸發具有保證時序的 ADC。

不過,我們可以嘗試使您的采樣循環寫得更好一些。datetime.datetime.utcnow()可能是一個緩慢的系統調用。相反,您可能會得到更好的結果time.perf_counter()。您可能還想將val和存儲current_time在循環內的列表中,并在不同的進程中在循環外組裝完整的 json 正文,因為看起來您永遠想要 10ksps(并且也在單獨的進程中發送到 influxdb)。

一般來說,樹莓派硬件未設置為在這些頻率下對 ADC 進行連續實時采樣。


查看完整回答
反對 回復 2024-01-04
  • 1 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號