ADC 的样本数据

Sample data for an ADC

我应用了以下代码 (https://circuitpython.readthedocs.io/projects/ads1x15/en/latest/examples.html) 来读取电压。

在 python 代码的最后一行,我将 time.sleep 命令设置为 (1/3300 s)

我有以下疑问:

  1. 在时间栏中,时间步长大约为(0.02 秒)。然而,预期的时间步长是 (1/3300)s。为什么会出现这种情况?
  2. 如何确保时间步长,即两个连续时间数据点之间的采样频率保持正好在 3300 Hz。
  3. 如何确保第一个时间数据点以“0”开头?

谁能解开我的疑惑!

ADS1015的采样率仅在连续模式下为3300S/sec,一次采样一个通道。 这里有两个步骤:

  1. 确保您的 ADC 处于连续采样模式。 如果您的图书馆支持它,将其置于连续模式将类似于“adc.mode = 0”。这个我用过 https://github.com/adafruit/Adafruit_ADS1X15 确实支持。
  2. 确保配置寄存器中的数据速率设置为 3300。(数据表第 16 页 https://cdn-shop.adafruit.com/datasheets/ads1015.pdf

纯粹这也是不够的,要充分发挥 ADC 的潜力,还需要一个兼容的处理器来处理其 i2c 总线上的大量数据。像 raspberry pi 这样的东西大多不够强大。 使用像 C/C++ 这样更快的语言也会有所帮助。

您至少有 3 个问题,需要阅读时间模块文档。

  1. time.time不保证精确到一秒以上。在下文中,在 Win 10 上的 IDLE Shell 中,多个 time.time() 调用给出相同的时间。
>>> for i in range(30):
        print(time.perf_counter(), time.time(), time.perf_counter())

8572.4002846 1607086901.7035756 8572.4002855
8572.4653746 1607086901.756807 8572.4653754
8572.4706208 1607086901.7724454 8572.4706212
8572.4755909 1607086901.7724454 8572.4755914
8572.4806756 1607086901.7724454 8572.4806759
... # time.time continues repeating 3 or 4 times.
  1. time.sleep(t) 具有最小的系统相关间隔,即使 t 小得多。在 Windows 上,大约是 .015 秒。如果有其他系统,则没有特定的上限 activity.
>>> for i in range(5):
        print(time.perf_counter())
        time.sleep(.0000001)

9125.1041623
9125.1188101
9125.134417
9125.1565579
9125.1722012
  1. 打印到 IDLE 的 shell 比 运行 直接使用 Python(从命令行)并打印到系统控制台的程序慢。一方面,IDLE 在单独的进程中运行用户代码,增加了进程间的开销。另一方面,IDLE 是一个 GUI 程序和 GUI 框架,tk via tkinter,增加了更多的开销。 IDLE 专为学习 Python 和开发 Python 程序而设计。它没有针对 运行 Python 个程序进行优化。

如果用户代码输出到它在同一进程中创建的 tkinter GUI,避免进程间延迟,最小间隔要短得多,在这个特定示例中约为 .0012 秒。

>>> import tkinter as tk
>>> r = tk.Tk()
>>> t = tk.Text(r)
>>> t.pack()
>>> for i in range(5):
    t.insert('insert', f'{time.perf_counter()}\n')
    r.update()

# In the text widget...
9873.6484271
9873.6518752
9873.6523338
9873.6527421
9873.6532307