ADC 的样本数据
Sample data for an ADC
我应用了以下代码 (https://circuitpython.readthedocs.io/projects/ads1x15/en/latest/examples.html) 来读取电压。
在 python 代码的最后一行,我将 time.sleep 命令设置为 (1/3300 s)
我有以下疑问:
- 在时间栏中,时间步长大约为(0.02 秒)。然而,预期的时间步长是 (1/3300)s。为什么会出现这种情况?
- 如何确保时间步长,即两个连续时间数据点之间的采样频率保持正好在 3300 Hz。?
- 如何确保第一个时间数据点以“0”开头?
谁能解开我的疑惑!
ADS1015的采样率仅在连续模式下为3300S/sec,一次采样一个通道。
这里有两个步骤:
- 确保您的 ADC 处于连续采样模式。
如果您的图书馆支持它,将其置于连续模式将类似于“adc.mode = 0”。这个我用过 https://github.com/adafruit/Adafruit_ADS1X15 确实支持。
- 确保配置寄存器中的数据速率设置为 3300。(数据表第 16 页 https://cdn-shop.adafruit.com/datasheets/ads1015.pdf)
纯粹这也是不够的,要充分发挥 ADC 的潜力,还需要一个兼容的处理器来处理其 i2c 总线上的大量数据。像 raspberry pi 这样的东西大多不够强大。
使用像 C/C++ 这样更快的语言也会有所帮助。
您至少有 3 个问题,需要阅读时间模块文档。
- 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.
- 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
- 打印到 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
我应用了以下代码 (https://circuitpython.readthedocs.io/projects/ads1x15/en/latest/examples.html) 来读取电压。
在 python 代码的最后一行,我将 time.sleep 命令设置为 (1/3300 s)
我有以下疑问:
- 在时间栏中,时间步长大约为(0.02 秒)。然而,预期的时间步长是 (1/3300)s。为什么会出现这种情况?
- 如何确保时间步长,即两个连续时间数据点之间的采样频率保持正好在 3300 Hz。?
- 如何确保第一个时间数据点以“0”开头?
谁能解开我的疑惑!
ADS1015的采样率仅在连续模式下为3300S/sec,一次采样一个通道。 这里有两个步骤:
- 确保您的 ADC 处于连续采样模式。 如果您的图书馆支持它,将其置于连续模式将类似于“adc.mode = 0”。这个我用过 https://github.com/adafruit/Adafruit_ADS1X15 确实支持。
- 确保配置寄存器中的数据速率设置为 3300。(数据表第 16 页 https://cdn-shop.adafruit.com/datasheets/ads1015.pdf)
纯粹这也是不够的,要充分发挥 ADC 的潜力,还需要一个兼容的处理器来处理其 i2c 总线上的大量数据。像 raspberry pi 这样的东西大多不够强大。 使用像 C/C++ 这样更快的语言也会有所帮助。
您至少有 3 个问题,需要阅读时间模块文档。
- 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.
- 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
- 打印到 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