我正在做一項工作,使用 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個贊
幾個建議。
如果需要對 ADC 進行均勻采樣,這是一個更難的問題。
如果您“只需要”統一的時間戳間距,則可以根據需要進行采樣,然后將時間戳設置
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 進行連續實時采樣。
添加回答
舉報
0/150
提交
取消