Page 1 of 1

luckfox plus的ADC端口频率怎么设置?

Posted: 2024-03-30 5:38
by ezreal
我给plus配置了一块麦克风放大器,其中麦克风的VCC、GND、OUT分别连接plus的3V3、GND、SARADC_IN0.

麦克风的采样频率比如是16000hz。

但发现默认的ADC端口只有几百Hz。

测试代码如下:
import time

ADC_DIR = "/sys/bus/iio/devices/iio:device0"


def read_value(file_path):
with open(file_path, "r") as file:
return file.read().strip()


def main():
print("Press Ctrl+C to quit")
start_time = time.time()
voltage_change = []
while time.time() - start_time < 1:
scale_value = float(read_value(f"{ADC_DIR}/in_voltage_scale"))
IN0_raw_value = float(read_value(f"{ADC_DIR}/in_voltage0_raw"))

IN0_voltage = f"{IN0_raw_value * scale_value / 1000:.2f}"

voltage_change.append(IN0_voltage)
print(f"{len(voltage_change)}Hz")


if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
pass
输出为:
Press Ctrl+C to quit
538Hz
如果我在 while 循环里加中断,即
time.sleep(1/16000)
输出结果如下:
Press Ctrl+C to quit
491Hz
可以看到反而降低了。

此外,我从https://whycan.com/files/members/9058/Rockchip%20RV1103%20Datasheet%20V1.1-20220427.pdf查看了RV1103的支持的最大ADC采样频率(如下图),最高值为1M。
Snipaste_2024-03-31_22-21-06.jpg
plus的ADC端口的采样频率应该怎么设置?还请不吝赐教!感谢!

Re: luckfox plus的ADC端口频率怎么设置?

Posted: 2024-04-01 2:28
by Crocodile
ezreal wrote: 2024-03-30 5:38 我给plus配置了一块麦克风放大器,其中麦克风的VCC、GND、OUT分别连接plus的3V3、GND、SARADC_IN0.

麦克风的采样频率比如是16000hz。

但发现默认的ADC端口只有几百Hz。

测试代码如下:
import time

ADC_DIR = "/sys/bus/iio/devices/iio:device0"


def read_value(file_path):
with open(file_path, "r") as file:
return file.read().strip()


def main():
print("Press Ctrl+C to quit")
start_time = time.time()
voltage_change = []
while time.time() - start_time < 1:
scale_value = float(read_value(f"{ADC_DIR}/in_voltage_scale"))
IN0_raw_value = float(read_value(f"{ADC_DIR}/in_voltage0_raw"))

IN0_voltage = f"{IN0_raw_value * scale_value / 1000:.2f}"

voltage_change.append(IN0_voltage)
print(f"{len(voltage_change)}Hz")


if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
pass
输出为:
Press Ctrl+C to quit
538Hz
如果我在 while 循环里加中断,即
time.sleep(1/16000)
输出结果如下:
Press Ctrl+C to quit
491Hz
可以看到反而降低了。

此外,我从https://whycan.com/files/members/9058/Rockchip%20RV1103%20Datasheet%20V1.1-20220427.pdf查看了RV1103的支持的最大ADC采样频率(如下图),最高值为1M。

Snipaste_2024-03-31_22-21-06.jpg

plus的ADC端口的采样频率应该怎么设置?还请不吝赐教!感谢!
您好,根据luckfox-pico 关于 adc 的设备树信息的compatible:
MIC_ADC06.jpg
可以找到对应的驱动程序在 <kernel文件夹 >/drivers/iio/adc/rockchip_saradc.c,对应的配对信息为
MIC_ADC07.jpg
其中的.data文件就设置了采样时钟速率的大小,可以看到默认设置的大小就是1MHz
MIC_ADC05.jpg
所以ADC端口的采样频率不需要配置。

而您的测试得不到1Mhz的原因是ADC采集在时钟的驱动下不断更新数据,但是您使用python脚本本身需要经过解释器(cpu调用)转换为机器指令,还进行了多次文件信息读取和真实测量值的计算才读取一次ADC采集值,这个时候已经有很多次的ADC数值更新被错过了,所以测出的频率取决于您程序的运行时间而不是ADC的采集速率。

Re: luckfox plus的ADC端口频率怎么设置?

Posted: 2024-04-02 3:00
by ezreal
Crocodile wrote: 2024-04-01 2:28
ezreal wrote: 2024-03-30 5:38 我给plus配置了一块麦克风放大器,其中麦克风的VCC、GND、OUT分别连接plus的3V3、GND、SARADC_IN0.

麦克风的采样频率比如是16000hz。

但发现默认的ADC端口只有几百Hz。

测试代码如下:
import time

ADC_DIR = "/sys/bus/iio/devices/iio:device0"


def read_value(file_path):
with open(file_path, "r") as file:
return file.read().strip()


def main():
print("Press Ctrl+C to quit")
start_time = time.time()
voltage_change = []
while time.time() - start_time < 1:
scale_value = float(read_value(f"{ADC_DIR}/in_voltage_scale"))
IN0_raw_value = float(read_value(f"{ADC_DIR}/in_voltage0_raw"))

IN0_voltage = f"{IN0_raw_value * scale_value / 1000:.2f}"

voltage_change.append(IN0_voltage)
print(f"{len(voltage_change)}Hz")


if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
pass
输出为:
Press Ctrl+C to quit
538Hz
如果我在 while 循环里加中断,即
time.sleep(1/16000)
输出结果如下:
Press Ctrl+C to quit
491Hz
可以看到反而降低了。

此外,我从https://whycan.com/files/members/9058/Rockchip%20RV1103%20Datasheet%20V1.1-20220427.pdf查看了RV1103的支持的最大ADC采样频率(如下图),最高值为1M。

Snipaste_2024-03-31_22-21-06.jpg

plus的ADC端口的采样频率应该怎么设置?还请不吝赐教!感谢!
您好,根据luckfox-pico 关于 adc 的设备树信息的compatible:
MIC_ADC06.jpg
可以找到对应的驱动程序在 <kernel文件夹 >/drivers/iio/adc/rockchip_saradc.c,对应的配对信息为
MIC_ADC07.jpg
其中的.data文件就设置了采样时钟速率的大小,可以看到默认设置的大小就是1MHz
MIC_ADC05.jpg
所以ADC端口的采样频率不需要配置。

而您的测试得不到1Mhz的原因是ADC采集在时钟的驱动下不断更新数据,但是您使用python脚本本身需要经过解释器(cpu调用)转换为机器指令,还进行了多次文件信息读取和真实测量值的计算才读取一次ADC采集值,这个时候已经有很多次的ADC数值更新被错过了,所以测出的频率取决于您程序的运行时间而不是ADC的采集速率。
谢谢您的快速回复!在使用C语言,以及一些加速优化后,采样频率达到了16k Hz!非常谢谢!🎈✨✨