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

  • 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的采集速率。
  • 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!非常谢谢!🎈✨✨