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.

[参考译文] TMS320F28379D:用于传感器读取的 ADC 配置

Guru**** 2482225 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1448109/tms320f28379d-adc-configuration-for-sensor-reading

器件型号:TMS320F28379D

工具与软件:

大家好!

我正在电源转换器应用中使用 Delfino F2837xD controlCARD、并尝试获取施加到电源转换器的直流电压。

CPU 时钟设置为200 MHz、而 ADC 时钟为50 MHz。 我正在使用 C2000 Microcontroller Blockset 附加组件与 HW 通信的 Simulink 环境。

ADC 块配置如下:

        

如您所见、ADC 转换启动(SOC0)由 ePWM 模块以20kHz 的频率触发。

采集窗口就是此次讨论的重点。 我从文档中阅读 到、采样采集时间应该至少等于 ADC 周期(20ns)、在本例中、它会产生一个为3的最小采集窗口。 但是、使用该值、我读取的电压值相对于工作电压具有非常大的偏移(通过直流电压电源为系统提供)。 因此、采样窗口值设置为6、这会提供相对于工作电压的最小偏移。

有人能解释一下这一点的原因吗?

此外、电压值也有很大的噪声、您可以从下面的采集结果中看到:

在相同的配置下、温度值在变化方面更好。 信号质量差是否有任何原因? 我阅读了有关 PPB 块的信息、它们应对原始输入信号进行后处理。 这些块是否已"默认"激活、或者我是否应该将它们配置为使用该功能?  

非常感谢。  

此致、

Lorenzo

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

    您好!

    我需要几天时间才能回到你的身边。

    此致、

    Ben Collier

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    这些块是否已"默认"激活、或者我是否应该将它们配置为使用该功能?  [报价]

    您好、Lorenzo:

    如果使用 TI 示例工程、您必须在(hal.h)中配置 PPB、甚至是您自己的代码才能使用和读取 PPB 样本数据。 来自通用电机控制 SDK 的以下示例。

    // x49c MCU class
    
    #define MTR1_IU_ADC_SOC_NUM     ADC_SOC_NUMBER1         // ADCA-A4*/B8  -SOC1-PPB2
    #define MTR1_IV_ADC_SOC_NUM     ADC_SOC_NUMBER8         // ADCA-A8*     -SOC8-PPB3
    #define MTR1_IW_ADC_SOC_NUM     ADC_SOC_NUMBER9         // ADCB-B4*/C8  -SOC9-PPB4
    
    
    #define MTR1_IU_ADC_PPB_NUM     ADC_PPB_NUMBER2         // ADCA-A4*/B8  -SOC1-PPB2
    #define MTR1_IV_ADC_PPB_NUM     ADC_PPB_NUMBER3         // ADCA-A8*     -SOC8-PPB3
    #define MTR1_IW_ADC_PPB_NUM     ADC_PPB_NUMBER4         // ADCB-B4*/C8  -SOC9-PPB4
    
        // !(MOTOR1_DCLINKSS)
    #if defined(LPD_SITE_J5_J8) && defined(_F28004x) && defined(BSXL8320RS_REVA)
        // convert phase A current          ADCA-A4*/B8->RB0    
        value = (float32_t)ADC_readPPBResult(MTR1_IU_ADCRES_BASE, MTR1_IU_ADC_PPB_NUM);
        pADCData->I_A.value[0] = value * pADCData->current_sf;
    
        // convert phase B current          ADCA-A8*->RA0      
        value = (float32_t)ADC_readPPBResult(MTR1_IV_ADCRES_BASE, MTR1_IV_ADC_PPB_NUM);
        pADCData->I_A.value[1] = value * pADCData->current_sf; //
    
        // convert phase C current          ADCB-B4*/C8->RC0    
        value = (float32_t)ADC_readPPBResult(MTR1_IW_ADCRES_BASE, MTR1_IW_ADC_PPB_NUM);
        pADCData->I_A.value[2] = value * pADCData->current_sf;
        
        //hal.c setup PPB's
        
        // Configure PPB2 to eliminate subtraction related calculation
        // PPB is associated with ADCA_SOC1
        ADC_setupPPB(MTR1_IU_ADC_BASE, MTR1_IU_ADC_PPB_NUM, MTR1_IU_ADC_SOC_NUM);
    
        // Write zero to this for now till offset calibration complete PPB2
        ADC_setPPBCalibrationOffset(MTR1_IU_ADC_BASE, MTR1_IU_ADC_PPB_NUM, 0);
        
        // Configure PPB3 to eliminate subtraction related calculation
        // PPB is associated with ADCB_SOC8
        ADC_setupPPB(MTR1_IV_ADC_BASE, MTR1_IV_ADC_PPB_NUM, MTR1_IV_ADC_SOC_NUM);
    
        // Write zero to this for now till offset calibration complete PPB3
        ADC_setPPBCalibrationOffset(MTR1_IV_ADC_BASE, MTR1_IV_ADC_PPB_NUM, 0);
        
        // Configure PPB4 to eliminate subtraction related calculation
        // PPB is associated with ADCA_SOC9
        ADC_setupPPB(MTR1_IW_ADC_BASE, MTR1_IW_ADC_PPB_NUM, MTR1_IW_ADC_SOC_NUM);
    
        // Write zero to this for now till offset calibration complete PPB4
        ADC_setPPBCalibrationOffset(MTR1_IW_ADC_BASE, MTR1_IW_ADC_PPB_NUM, 0);