问答

汇集网友智慧,解决技术难题

21ic问答首页 - esp8266想以40KHz的速度采样,怎么就不行呢?

ESP8266

esp8266想以40KHz的速度采样,怎么就不行呢?

糖21002023-03-07
ESP8266 ADC求助,目标采样率40kHz,用system_adc_read_fast(a,1,8); 结果发现1次ad转换就要花175us,这不对呀,按手册的说明这应该是80M的8分频就是10M的采样速度才对呀。然后又发现wifi_set_opmode(NULL_MODE);这句无论写不写结果都一样,速度还是这么慢,这是怎么回事呢?
回答 +关注 14
1158人浏览 5人回答问题 分享 举报
5 个回答
  • 问题还是没解决,难道ESP8266的ADC采样频率,最高只能到 8KHz 吗???
  • 本帖最后由 糖2100 于 2023-3-8 19:37 编辑
    m564522634 发表于 2023-3-8 13:47
    10M 估计是数据总线速度,不是AD转换的数据, AD转换本身就需要时间的,你在手册确认下转换速度是多少 ...

    手册里没说具体采样率。
    【摘录手册相关章节】
    快速⾼精度的 ADC 采样
       - 本接⼝必须在关闭 Wi-Fi 的状态下使⽤。
      - 如需进⾏连续测量 ADC,则还需要在关闭所有中断的状态下使⽤。
      - 因此,调⽤ system_adc_read_fast 时,不能使⽤ PWM 或者 NMI 类型的硬件定时器。
    函数定义
      void       system_adc_read_fast(uint16  *adc_addr,  uint16  adc_num,  uint8  adc_clk_div)
    参数
      • uint16        *adc_addr: ADC 连续采样输出的地址指针。
      • uint16   adc_num: ADC 连续采样的点数,输⼊范围 [1, 65535]
      • uint8        adc_clk_div: ADC ⼯作时钟 = 80M/adc_clk_div,输⼊范围 [8, 32],推荐值为 8
    范例
      wifi_set_opmode(NULL_MODE);
      ets_intr_lock();                 //close        interrupt
      uint16        adc_addr[10];
      uint16        adc_num        =        10;
      uint8        adc_clk_div        =        8;
      uint32        i;
      system_adc_read_fast(adc_addr,        adc_num,        adc_clk_div);

      for(i=0;        i<adc_num;        i++)        
          os_printf("i=%d,        adc_v=%d\n",        i,        adc_addr);

      ets_intr_unlock();         //open        interrup
    手册里就这些,还有一个普通采样,更慢了。

  • fxyc87 发表于 2023-3-8 08:53
    MicroPython本身就很慢的啊,你得用C语言开发,AD采集本身需要耗时,解释脚本本身也有大量耗时。 ...

    纯c做的,用的官方手册里的范例代码
  • 10M 估计是数据总线速度,不是AD转换的数据, AD转换本身就需要时间的,你在手册确认下转换速度是多少
  • MicroPython本身就很慢的啊,你得用C语言开发,AD采集本身需要耗时,解释脚本本身也有大量耗时。

您需要登录后才可以回复 登录 | 注册