This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM2434:优化 ADC 数据更新函数执行时间

Guru**** 2393725 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1443926/am2434-optimize-adc-data-update-function-execution-time

器件型号:AM2434

工具与软件:

尊敬的 TI 专家:

客户使用 AM24x SDK9.2、通过执行以下主题、ADC 电压采样的功能现在正常运行。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1424959/am2432-fifo-words-in-fifo-reading-is-abnormal-when-using-adc-voltage-sampling

但是、客户发现其下面显示的 execute time 中的函数"Bsp_AdcValueUpdata" 55.4us。

 该值对于被调用的中断函数来说太大 频率(8k) . 这意味着 ADC 更新函数已被占用 44% 控制。 例如以下 pic:  

客户可能有以下两个问题、这两个问题可能需要您的支持。

1) 1)为什么这种执行方法具有如此大的开销、具体而言是在哪里产生成本?

2)是否有任何计划优化此开销并将时间减少到10us 以下?

谢谢!

Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kevin 老师、您好!

    我正在查看您的问题、您可能希望在一两天内得到回复。

    此致、

    Anil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kevin 老师、您好!

    您能否确认上述测量值(55.4usec)是在释放模式还是调试模式下完成的?

    我可以提供一些建议来减少开销、但请提供上述输入。

    此致、

    Anil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Anil:

    感谢您的答复。

    客户 使用了释放模式。

    谢谢!

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kevin 老师、您好!

    请尝试下面的建议并确认时间减少了多少。

    方法1:  

    在当前客户实现中、我们无法更改从 ADC 开始到 ADC 提取的时间。

    现在、要减少开销、请尝试执行以下步骤。

    ADC 提取数据后、我们称为 ADC 停止。 我们不调用 ADC 停止 API、

    只需停止 ADC 并等待 ADC 空闲。

    代码:  

    /* Stop ADC */
    ADCStart(baseAddr, FALSE);
    
    /* Wait for FSM to go IDLE */
    ADCGetSequencerStatus(baseAddr, &status);
    while ((ADC_ADCSTAT_FSM_BUSY_IDLE != status.fsmBusy) &&
    ADC_ADCSTAT_STEP_ID_IDLE != status.stepId)
    {
    ADCGetSequencerStatus(baseAddr, &status);
    }

    接下来、只需启用步骤、而无需调用 ADCconfig API。

    代码:  

        /* Step enable */
        for(chCnt = 0U; chCnt < APP_ADC_NUM_CH; chCnt++)
        {
            adcStep = ADC_STEP_1 + chCnt;   /* Step -> Channel one to one mapped */
            ADCStepEnable(baseAddr, adcStep, TRUE);
        }

    然后启动 ADC。

    方法2:  

    整个 ADC 功能将分为3个部分。 ADC 启动、ADC 停止和 ADC 处理。

    现在、您可以实现3个 ADC 状态。 ADC_START、ADC_processing 和 ADC_stop。

    案例 ADC_start:启动 ADC  

    案例 ADC_processing:  

    在这里、您需要 轮询 ADC 转换是否已完成。

    如果 ADC 转换完成、则提取 ADC 数据、然后转到下一个状态 ADC 停止。

    实例 ADC_STOP:停止 ADC、启用步骤、然后进入 ADC 启动状态。

    方法3:  

    组合方法1和方法2。

    如果用户仍然希望进一步减少开销、则应使用 ISR 方法。

    方法4:  

    ISR 方法:  

    在任务中、它们需要启动 ADC。

    在 ISR 例程中、用户需要提取 ADC 数据。 同样、用户需要根据任务中之前的转换完成状态启动 ADC。

    除了 这些 方法之外、没有进一步减少开销的方法。

    此致、

    Anil。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Anil:

    感谢您的大力支持、我们正在客户方面开展工作、下面详细介绍一下。

      1)使用方法1:

        缩短 bspADCStop()接口的任务、同时减少 ADCConfig 任务所需的时间和步骤。

    实际的 ADC 更新时间大约为8us、但实际上可以通过任务 C 来中断、因此大约为30us。

    2)结合方法1和方法2:

    假设没有中断、ADC 的当前执行时间约为每个周期5微秒、波动幅度约为3.5至4.5微秒。

    最后、目前可以满足 客户的要求。

    谢谢!

    Kevin