第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

侃侃爾雅 2024-01-04 10:07:55
我正在做一項工作,使用 ADC mcp3008 樣本傳感器數(shù)據(jù)并收集它們直到 10k。然后將其發(fā)送到 influxdb。所有這些工作應(yīng)該在 1 秒內(nèi)完成。這才是重點?,F(xiàn)在的問題是,每條數(shù)據(jù)的時間戳非常不均勻。如你看到的:我希望時間戳統(tǒng)一為0.1ms。我的意思是 influsdb 中的時間精度應(yīng)該是 0.1ms。但不幸的是,寫入?yún)?shù)time_ precision只有's'、'ms'、'u'或'n'。所以我能做的就是讓采樣過程更加統(tǒng)一,對嗎?我使用多處理模塊來完成這項工作。這是我的原始代碼: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()是的...我必須經(jīng)過六個過程才能在平均一秒內(nèi)完成..
查看完整描述

1 回答

?
慕桂英546537

TA貢獻1848條經(jīng)驗 獲得超10個贊

幾個建議。

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

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

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

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

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


查看完整回答
反對 回復(fù) 2024-01-04
  • 1 回答
  • 0 關(guān)注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號