我正在做一项工作,使用 ADC mcp3008 样本传感器数据并收集它们直到 10k。然后将其发送到 influxdb。所有这些工作应该在 1 秒内完成。这才是重点。现在的问题是,每条数据的时间戳非常不均匀。如你看到的:我希望时间戳统一为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
提交
取消