【求助】T1-CHL ADC采集阻塞时间太长和adc ddev open error问题

Wi-Fi 设备、蜂窝设备、WuKongAI、开发板、TuyaOS 移植等


Post Reply
feige2023
Posts: 36

【1】tuyaOS版本:3.11.11
【2】问题描述:

  1. 将ADC采样频率设置为8000,每次连续采64个数据点。每隔一段时间,通过tkl_adc_read_data读取64个数据点的采样值,用IO,测量采样前后的时间。发现调用tkl_adc_read_data会导致IO阻塞18.5ms左右。
    具体参考图片测试。

    ADC采样阻塞.png

    其中相关的ADC代码如下:
    特别说明
    1.已经在driver/tkl_adc.c中将ADC_BUF_SIZE_MIN配置为65,能保证ADC连续采64次。
    2.哪怕我将ADC配置连续采样数量调整为4,调用tkl_Adc_read_data也需要18.5ms左右

    Code: Select all

    #define CONFIG_BSP_ADC_SAMPLE_TIMES 64
    static uint16_t adc_buf[CONFIG_BSP_ADC_SAMPLE_TIMES];

    static int init(void)
    {
    OPERATE_RET ret;

    const TUYA_ADC_BASE_CFG_T adc_cfg={
    .ch_list.data = 1<<CONFIG_BSP_ADC_CHANNEL,
    .ch_nums = 1,
    .width = 12,
    .mode = TUYA_ADC_CONTINUOUS,
    .type = TUYA_ADC_INNER_SAMPLE_VOL,
    .conv_cnt = CONFIG_BSP_ADC_SAMPLE_TIMES,
    .freq = 8000,
    };

    ret = tkl_adc_init(CONFIG_BSP_ADC_NUM,&adc_cfg);
    if(ret != OPRT_OK){
    ELOG("adc init fail:%d");
    return 1;
    }else{
    ILOG("adc init success");
    }

    return 0;

    }
    /// @brief 定时采集
    /// @param
    static void handler(void)
    {
    OPERATE_RET ret;

    uint32_t adc[CONFIG_BSP_ADC_SAMPLE_TIMES];
    bsp_gpio_test_ctrl(3,1);
    ret = tkl_adc_read_data(CONFIG_BSP_ADC_NUM,adc,CONFIG_BSP_ADC_SAMPLE_TIMES);
    bsp_gpio_test_ctrl(3,0);

    if(ret!=OPRT_OK){
    ELOG("adc read fail:%d",ret);
    return ;
    }
    for(int i=0;i<CONFIG_BSP_ADC_SAMPLE_TIMES;i++){
    adc_buf[i] = (uint16_t)(adc[i]);
    }
    }
  2. 以下是ADC报错的问题,我程序中仅有一个ADC采集任务,会出现偶尔ADC打开失败的问题,请问需要如何解决?
    (代码中handler(void)函数体)

    ADC报错问题.png
JSHANG
Posts: 77

Re: 【求助】T1-CHL ADC采集阻塞时间太长和adc ddev open error问题

问题1:本地复现,连续采样64个数据是要这么长时间;T1 ADC精度是准确的,不需要你采样多个再计算处理; 是否可以换一种方式,你可以一个一个的采,保存到你的数组里面,采样一次的时间在1ms左右;也可以尝试修改tkl_adc_init函数中的参数:
adc_desc.pre_div = 0;
adc_desc.samp_rate = 0x4; 或 adc_desc.pre_div = 0; adc_desc.samp_rate = 0; 来提高采样频率;

问题2: 报错是因为底层采样中断冲突了导致的,正常的,代码处理过滤掉就可以了。

Post Reply