猿问

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

我正在做一项工作,使用 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 Module

import Adafruit_MCP3008         # Import Adafruit_MCP3008

import serial

import time

import datetime

from influxdb import InfluxDBClient

from multiprocessing import Process, Queue

def 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()

是的...我必须经过六个过程才能在平均一秒内完成..


侃侃尔雅
浏览 100回答 1
1回答

慕桂英546537

几个建议。如果需要对 ADC 进行均匀采样,这是一个更难的问题。如果您“只需要”统一的时间戳间距,则可以根据需要进行采样,然后将时间戳设置begin + iteration * 0.1ms为.&nbsp;此选项对于任何类型的科学数据收集都不是很好。10k 样本/秒听起来像是您需要均匀间隔的采样(例如对于音频)。所以我会忽略选项2。对于选项 1,您需要循环具有一致的迭代时间。这对于 RPi 上的 python 来说很难保证(我假设你使用的是 Pi)。RPi 操作系统不是实时的,因此您的循环可能会随机延迟。这里唯一真正的选择是使用外部微处理器来触发具有保证时序的 ADC。不过,我们可以尝试使您的采样循环写得更好一些。datetime.datetime.utcnow()可能是一个缓慢的系统调用。相反,您可能会得到更好的结果time.perf_counter()。您可能还想将val和存储current_time在循环内的列表中,并在不同的进程中在循环外组装完整的 json 正文,因为看起来您永远想要 10ksps(并且也在单独的进程中发送到 influxdb)。一般来说,树莓派硬件未设置为在这些频率下对 ADC 进行连续实时采样。
随时随地看视频慕课网APP

相关分类

Python
我要回答