为了账号安全,请及时绑定邮箱和手机立即绑定

有什么办法可以让我的Mcp3008采样均匀吗?

有什么办法可以让我的Mcp3008采样均匀吗?

侃侃尔雅 2024-01-04 10:07:55
我正在做一项工作,使用 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个赞

几个建议。

  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 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信