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.

[参考译文] CCS/MSP432E401Y:单次触发模式下的最大采样率

Guru**** 2564565 points
Other Parts Discussed in Thread: MSP432E401Y

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/850869/ccs-msp432e401y-maximum-sampling-rate-in-one-shot-mode

器件型号:MSP432E401Y

工具/软件:Code Composer Studio

您好!

我正在尝试在 MSP432E401Y 上设置 ADC、以便在单次触发模式下以1或2 MSPS 采样。 出于某种原因、当我将采样频率设置为任何高于100kHz 的频率时、代码会挂起。 是否需要更改一些内部时钟设置以允许一次性模式在最大采样率下工作? 我正在开发 adcbufContinuous_MSP_EXP432E401Y_tirtos_ccs。  

这是我的设置:

/*调用 ADC 驱动程序初始化函数*/
ADCBuf_init ();

//ADCClockConfigSet (ADC0_BASE、ADC_CLOCK SRC_PLL | ADC_CLOCK RATE_FULL、24);

/*在 ADCBuf_RECURE_MODE_连续 中设置 ADCBuf 外设*/
ADCBuf_Params_init (&adcBufParams);
//adcBufParams.callbackFxn = adcBufCallback;
adcBufParams.RecurrencedMode = ADCBuf_Recurrence_mode_One_Shot;
//adcBufParams.returnMode = ADCBuf_return_mode_callback;
adcBufParams.returnMode = ADCBuf_return_mode_blocking;
//adcBufParams.samplingFrequency = 20E6;
adcBufParams.samplingFrequency = 100000;
adcBuf = ADCBuf_open (Board_ADCBUF0、&adcBufParams);




if (adcBuf == NULL){
/* ADCBuf 无法打开。 *
while (1);
}

/*配置转换结构*/
oneshotConversion.arg =空;
oneshotConversion.adcChannel = Board_ADCBUF0CHANNEL0;
oneshotConversion.sampleBuffer = sampleBufferOne;
//continuousConversion.sampleBufferTwo = sampleBufferTwo;
oneshotConversion.samplesRequestedCount = ADCSAMPLESIZE;

while (1){
SEM_WAIT (ADCGet);
/*开始转换。 *
if (ADCBuf_convert (adcBuf、oneshotConversion、1)!=
ADCBuf_STATUS_SUCCESS){
/*未正确启动转换过程。 *
while (1);
}

//标准化并转换为 uVolts

/*调整原始 ADC 值并将其转换为微伏*/
ADCBuf_AdjusterRawValues (adcBuf、oneshotConversion.samplpleBuffer、ADCSAMPLESIZE、
Board_ADCBUF0CHANNEL0);
ADCBuf_convertAdjustedToMicroVolts (adcBuf、Board_ADCBUF0CHANNEL0、
oneshotConversion.sampleBuffer、microVoltBuffer、ADCSAMPLESIZE);

最棒的

Ajay

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

    Ajay、

    当在 ADCBuf_Recurrent_mode_one_shot 中运行时、对 ADCBuf_convert ()的调用 将在一个信标上挂起、直到 ADCBuf_Conversion.samplesRequestedCount 样本完成或在 ADCBuf_Params.blockingTimeout 持续时间之后

    BR、

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

    是的、我知道这一点。 如何配置进入 ADC 的时钟、使其能够以最大速率(1或2 MSPS)对请求的采样数进行采样?

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

    您好!

    非常感谢您在这方面的帮助!

    最棒的

    Ajay Suresh

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

    Ajay、

    阻塞超时以系统时钟节拍为单位。 该值仅在使用 ADCBuf_return_mode_blocking 时有效。 对 ADCBuf_convert()的调用将在一段时间内被阻止,直到阻塞超时周期。 如果 ADCBuf_Conversion.samplesRequestedCount 中请求的样本数量已完成,则对 ADCBuf_convert()的调用将在之前返回。 blockingTimeout 应足够大、以便在给定 ADCBuf_Params.samplingFrequency 的情况下、可以收集 ADCBuf_Conversion.samplesRequestedCount 样本。

    BR、

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

    您好!

    感谢您的回答。 我已经尝试设置一个大型阻塞超时、但它似乎没有改变任何东西。 即使不设置 blockingTimeout、ADC 也会完全填满缓冲区。 我的问题是、它似乎没有足够大的采样率来捕获信号。 我使用的是 CCS v9.1.0和 SimpleLink SDK (simplelink_msp432e4_sdk_3_20_00_10)。  

    对于我的代码的这个片段、  

    uint32_t w = 0;
    
    /*调用 ADC 驱动程序初始化函数*/
    ADCBuf_init ();
    
    //ADCClockConfigSet (ADC0_BASE、ADC_CLOCK SRC_PLL | ADC_CLOCK RATE_FULL、24);
    
    /*在 ADCBuf_RECURE_MODE_连续 中设置 ADCBuf 外设*/
    ADCBuf_Params_init (&adcBufParams);
    //adcBufParams.callbackFxn = adcBufCallback;
    adcBufParams.RecurrencedMode = ADCBuf_Recurrence_mode_One_Shot;
    //adcBufParams.returnMode = ADCBuf_return_mode_callback;
    adcBufParams.returnMode = ADCBuf_return_mode_blocking;
    //adcBufParams.samplingFrequency = 20E6;
    adcBufParams.samplingFrequency = 100000;
    adcBuf = ADCBuf_open (Board_ADCBUF0、&adcBufParams);
    
    
    
    
    if (adcBuf == NULL){
    /* ADCBuf 无法打开。 *
    while (1);
    }
    
    /*配置转换结构*/
    oneshotConversion.arg =空;
    oneshotConversion.adcChannel = Board_ADCBUF0CHANNEL0;
    oneshotConversion.sampleBuffer = sampleBufferOne;
    //continuousConversion.sampleBufferTwo = sampleBufferTwo;
    oneshotConversion.samplesRequestedCount = ADCSAMPLESIZE;
    
    while (1){
    SEM_WAIT (ADCGet);
    /*开始转换。 *
    if (ADCBuf_convert (adcBuf、oneshotConversion、1)!=
    ADCBuf_STATUS_SUCCESS){
    /*未正确启动转换过程。 *
    while (1);
    }
    
    //标准化并转换为 uVolts
    
    /*调整原始 ADC 值并将其转换为微伏*/
    ADCBuf_AdjusterRawValues (adcBuf、oneshotConversion.samplpleBuffer、ADCSAMPLESIZE、
    Board_ADCBUF0CHANNEL0);
    ADCBuf_convertAdjustedToMicroVolts (adcBuf、Board_ADCBUF0CHANNEL0、
    oneshotConversion.sampleBuffer、microVoltBuffer、ADCSAMPLESIZE); 

    当我以该采样频率(20E6或100、000以上的任何频率)运行时、代码卡在此处

    静态空 dmaErrorFxn (uintptr_t arg)
    {
    int status = uDMAErrorStatusGet ();
    uDMAErrorStatusClear ();
    
    /*禁止未使用的变量警告*/
    (无效)地位;
    
    while (1);
    } 

    它仅以100kHz 的速率进行采样、没有任何问题。 不过、我需要对其进行更多采样。

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

    Ajay、

    我现在看到问题可能出在哪里。

    采样和保持时间至关重要。 您的 ADC 代码中使用的最大源时钟频率是多少? 必须考虑时钟频率、ADC 时钟周期和计时器占空比、以确保您的 ADC 测量成功完成并为下一次转换做好准备。

    虽然这是来自 MSP432P4 SimpleLink Academy、但 请参阅精密 ADC 实验的任务8、因为它对此进行了进一步说明。

    此外、您得到的 DMA 错误状态是什么?

    BR、

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

    您好!

    我认为 DMA 错误状态为"1"。 这就是我 在调用 uDMAErrorStatusGet ()时看到的情况。

    此外、我猜 ADC 使用的最大时钟频率为16MHz。 不过、我不太确定如何检查或更改它。  

    如何在代码中设置所有这些参数?

    最棒的

    Ajay

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

    Ajay、

    我已经咨询过主题专家、我了解到 E4与 P4驱动器不同、不会为计时器占空比提供可修改的配置。 对这种混乱表示歉意。

    采样频率可使用采样频率参数进行设置、您正在正确地执行此操作。 可以使用扩展参数中的采样持续时间值来设置 ADC 时钟周期。 为此、请添加以下代码:

    ADCBufMSP432E4_ParamsExtension customParams;
    
    customParams.sampleDuration =[此变量的选项位于/source/ti/drivers/adcbuf/ADCBufMSP432E4.h 中];
    
    adcBufParams.custom=&customParams; 


    另外,您还注释了“oneshotConversion.sampleBufferTwo = sampleBufferTwo”。 您是否曾尝试取消注释? 问题是否仍然存在?

    BR、

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

    您好!

    取消注释 “oneshotConversion.sampleBufferTwo = sampleBufferTwo”有效! 我现在能够以1MSPS 的速率进行采样。 谢谢!  

    最棒的

    Ajay

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

    Ajay、

    很高兴您能正常工作! 我将关闭此主题。 对于任何其他查询、请启动新的。

    BR、