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.

[参考译文] TMS320F28379S:为 f28379s 设置 ADC 基准

Guru**** 2380860 points
Other Parts Discussed in Thread: LAUNCHXL-F280025C, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1193607/tms320f28379s-setting-up-adc-reference-for-f28379s

器件型号:TMS320F28379S
主题中讨论的其他器件:LAUNCHXL-F280025CC2000WARE

您好!

我尝试使用 HAL_setupADCs()函数设置 ADC。 我重复使用最初为 f280025示例编写的函数。 我在以下两行中遇到编译器错误。 编译器正在查找 adc_setVREF()的定义和声明、  f28379s driverlib 的 adc.c 中缺少该定义和声明。  设置 f28379s 基准电压的功能是什么?   

//基于 LAUNCHXL-F280025C 的套件
adc_setVREF (obj->adcHandle[0]、adc_reference_internal、adc_reference_3_3V);
adc_setVREF (obj->adcHandle[1]、adc_reference_internal、adc_reference_3_3V);

void HAL_setupADCs(HAL_Handle handle)
{
    HAL_Obj *obj = (HAL_Obj *)handle;

    SysCtl_delay(100U);

#if defined(BSXL8323RS_REVA) || defined(BSXL8323RH_REVB) || \
    defined(BSXL8353RS_REVA) || defined(BSXL3PHGAN_REVA) || \
    defined(BSXL8316RT_REVA) || defined(DRV8329AEVM_REVA)
    /* commented JS
    // LAUNCHXL-F280025C based kits
    ADC_setVREF(obj->adcHandle[0], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
    ADC_setVREF(obj->adcHandle[1], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
      */ // end commented JS
#elif defined(HVMTRPFC_REV1P1)
    // TMDSCNCD280025C based kits
    ADC_setVREF(obj->adcHandle[0], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
    ADC_setVREF(obj->adcHandle[1], ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
#else
#error Select the right clock of PLL for the board
#endif  // ADC Reference

    SysCtl_delay(100U);

    // Set main clock scaling factor (50MHz max clock for the ADC module)
    ADC_setPrescaler(obj->adcHandle[0], ADC_CLK_DIV_2_0);
    ADC_setPrescaler(obj->adcHandle[1], ADC_CLK_DIV_2_0);

    // set the ADC interrupt pulse generation to end of conversion
    ADC_setInterruptPulseMode(obj->adcHandle[0], ADC_PULSE_END_OF_CONV);
    ADC_setInterruptPulseMode(obj->adcHandle[1], ADC_PULSE_END_OF_CONV);

    // set priority of SOCs
    ADC_setSOCPriority(obj->adcHandle[0], ADC_PRI_ALL_HIPRI);
    ADC_setSOCPriority(obj->adcHandle[1], ADC_PRI_ALL_HIPRI);

    // enable the ADCs
    ADC_enableConverter(obj->adcHandle[0]);
    ADC_enableConverter(obj->adcHandle[1]);

    // delay to allow ADCs to power up
    SysCtl_delay(1000U);

    //-------------------------------------------------------------------------
#if defined(MOTOR1_ISBLDC)
    // configure the interrupt sources
    // Interrupt for motor 1
    ADC_setInterruptSource(MTR1_ADC_INT_BASE,
                           MTR1_ADC_INT_NUM, MTR1_ADC_INT_SOC);

    // Idc 1st
    ADC_setupSOC(MTR1_IDC1_ADC_BASE, MTR1_IDC1_ADC_SOC_NUM, MTR1_IDC_TRIGGER_SOC,
                 MTR1_IDC1_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCA_SOC0
    ADC_setupPPB(MTR1_IDC1_ADC_BASE, MTR1_IDC1_ADC_PPB_NUM, MTR1_IDC1_ADC_SOC_NUM);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(MTR1_IDC1_ADC_BASE, MTR1_IDC1_ADC_PPB_NUM, 0);

    // Idc 2nd
    ADC_setupSOC(MTR1_IDC2_ADC_BASE, MTR1_IDC2_ADC_SOC_NUM, MTR1_IDC_TRIGGER_SOC,
                 MTR1_IDC2_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCC_SOC0
    ADC_setupPPB(MTR1_IDC2_ADC_BASE, MTR1_IDC2_ADC_PPB_NUM, MTR1_IDC2_ADC_SOC_NUM);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(MTR1_IDC2_ADC_BASE, MTR1_IDC2_ADC_PPB_NUM, 0);

    // VSEN_A_M1
    ADC_setupSOC(MTR1_VU_ADC_BASE, MTR1_VU_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_VU_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // VSEN_B_M1
    ADC_setupSOC(MTR1_VV_ADC_BASE, MTR1_VV_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_VV_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // VSEN_C_M1
    ADC_setupSOC(MTR1_VW_ADC_BASE, MTR1_VW_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_VW_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // VSEN_DCBUS_M1-->Trig Interrupt
    ADC_setupSOC(MTR1_VDC_ADC_BASE, MTR1_VDC_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_VDC_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

#if defined(CMD_POT_EN) || defined(DRV8329AEVM_REVA)
    // POT_M1
    ADC_setupSOC(MTR1_POT_ADC_BASE, MTR1_POT_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_POT_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);
#endif  // CMD_POT_EN | DRV8329AEVM_REVA

#else // !MOTOR1_ISBLDC
    // configure the SOCs for M1
#if defined(MOTOR1_DCLINKSS)
    // configure the interrupt sources
    // Interrupt for motor 1
    ADC_setInterruptSource(MTR1_ADC_INT_BASE,
                           MTR1_ADC_INT_NUM, MTR1_ADC_INT_SOC);

    // Idc 1st
    ADC_setupSOC(MTR1_IDC1_ADC_BASE, MTR1_IDC1_ADC_SOC_NUM, MTR1_IDC1_TRIGGER_SOC,
                 MTR1_IDC1_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCA_SOC0
    ADC_setupPPB(MTR1_IDC1_ADC_BASE, MTR1_IDC1_ADC_PPB_NUM, MTR1_IDC1_ADC_SOC_NUM);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(MTR1_IDC1_ADC_BASE, MTR1_IDC1_ADC_PPB_NUM, 0);

    // Idc 2nd
    ADC_setupSOC(MTR1_IDC2_ADC_BASE, MTR1_IDC2_ADC_SOC_NUM, MTR1_IDC2_TRIGGER_SOC,
                 MTR1_IDC2_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCC_SOC0
    ADC_setupPPB(MTR1_IDC2_ADC_BASE, MTR1_IDC2_ADC_PPB_NUM, MTR1_IDC2_ADC_SOC_NUM);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(MTR1_IDC2_ADC_BASE, MTR1_IDC2_ADC_PPB_NUM, 0);

    // Idc 3rd
    ADC_setupSOC(MTR1_IDC3_ADC_BASE, MTR1_IDC3_ADC_SOC_NUM, MTR1_IDC3_TRIGGER_SOC,
                 MTR1_IDC3_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCA_SOC0
    ADC_setupPPB(MTR1_IDC3_ADC_BASE, MTR1_IDC3_ADC_PPB_NUM, MTR1_IDC3_ADC_SOC_NUM);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(MTR1_IDC3_ADC_BASE, MTR1_IDC3_ADC_PPB_NUM, 0);

    // Idc 4th
    ADC_setupSOC(MTR1_IDC4_ADC_BASE, MTR1_IDC4_ADC_SOC_NUM, MTR1_IDC4_TRIGGER_SOC,
                 MTR1_IDC4_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCC_SOC0
    ADC_setupPPB(MTR1_IDC4_ADC_BASE, MTR1_IDC4_ADC_PPB_NUM, MTR1_IDC4_ADC_SOC_NUM);

    // Write zero to this for now till offset calibration complete
    ADC_setPPBCalibrationOffset(MTR1_IDC4_ADC_BASE, MTR1_IDC4_ADC_PPB_NUM, 0);


#else   // !(MOTOR1_DCLINKSS)
    // configure the interrupt sources
    // Interrupt for motor 1
    ADC_setInterruptSource(MTR1_ADC_INT_BASE,
                           MTR1_ADC_INT_NUM, MTR1_ADC_INT_SOC);
    // ISEN_A_M1
    ADC_setupSOC(MTR1_IU_ADC_BASE, MTR1_IU_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_IU_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCA_SOC0
    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
    ADC_setPPBCalibrationOffset(MTR1_IU_ADC_BASE, MTR1_IU_ADC_PPB_NUM, 0);

    // ISEN_B_M1
    ADC_setupSOC(MTR1_IV_ADC_BASE, MTR1_IV_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_IV_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCC_SOC0
    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
    ADC_setPPBCalibrationOffset(MTR1_IV_ADC_BASE, MTR1_IV_ADC_PPB_NUM, 0);

    // ISEN_C_M1
    ADC_setupSOC(MTR1_IW_ADC_BASE, MTR1_IW_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_IW_ADC_CH_NUM, MTR1_ADC_I_SAMPLEWINDOW);

    // Configure PPB to eliminate subtraction related calculation
    // PPB is associated with ADCA_SOC0
    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
    ADC_setPPBCalibrationOffset(MTR1_IW_ADC_BASE, MTR1_IW_ADC_PPB_NUM, 0);
#endif   // !(MOTOR1_DCLINKSS)

#if defined(MOTOR1_FAST) || defined(MOTOR1_ISBLDC)
    // VSEN_A_M1
    ADC_setupSOC(MTR1_VU_ADC_BASE, MTR1_VU_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_VU_ADC_CH_NUM, MTR1_ADC_V_SAMPLEWINDOW);

    // VSEN_B_M1
    ADC_setupSOC(MTR1_VV_ADC_BASE, MTR1_VV_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_VV_ADC_CH_NUM, MTR1_ADC_V_SAMPLEWINDOW);

    // VSEN_C_M1
    ADC_setupSOC(MTR1_VW_ADC_BASE, MTR1_VW_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_VW_ADC_CH_NUM, MTR1_ADC_V_SAMPLEWINDOW);
#endif  // MOTOR1_FAST || MOTOR1_ISBLDC

    // VSEN_DCBUS_M1-->Trig Interrupt
    ADC_setupSOC(MTR1_VDC_ADC_BASE, MTR1_VDC_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_VDC_ADC_CH_NUM, MTR1_ADC_V_SAMPLEWINDOW);


#if defined(CMD_POT_EN) || defined(DRV8329AEVM_REVA)
    // POT_M1
    ADC_setupSOC(MTR1_POT_ADC_BASE, MTR1_POT_ADC_SOC_NUM, MTR1_ADC_TRIGGER_SOC,
                 MTR1_POT_ADC_CH_NUM, MTR1_ADC_V_SAMPLEWINDOW);
#endif  // CMD_POT_EN | DRV8329AEVM_REVA
#endif  // !MOTOR1_ISBLDC

    return;
} // end of HAL_setupADCs() function

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

    Jagbir、您好!

    缺少该功能的原因是 F2837xS 器件没有用于内部/外部 VREFHI 的选项、因此只允许外部 VREFHI (您可以通过比较两个器件数据表的模拟外设部分来验证这一点)。

    此致、

    Omer Amir

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

    谢谢、Omer。

    另一个问题:主时钟缩放因子的工作方式与280025相同。

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

    您好 Jagbir、

    您是否在讨论 ADC 时钟?   两个器件的时钟要求和预分频器应该相同。

    此致、

    Omer Amir

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

    您好、Omer、

    对于 f28379、我已经保持了相同的时钟。

    现在、我尝试读取 ADC D 端口上的 ADCIND1引脚。 然而、ADCIND1测得的值(37.27V)不正确。 正确的值为48V。  

    在引脚上测量的电压为2.16V、与我的48V 电阻分压器一致。

    两个问题:

    1、ADC 的测量值为何不正确。

    2、什么 ADC 寄存器存储  f2839器件的 ADCIND1值。  它是 ADCresult6寄存器。

          

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

    Jagbir、您好!

    1. 您使用的 VREF 配置是什么? 通过使用此工具、我们可以确定您的读数的偏离量
    2. C2000器件中使用的 ADC 基于 SOC、这意味着根据 SOC 设置配置。 如果您将 SOC 配置为从特定通道读取、则结果应显示相同的 SOC 编号。 ADC 结果不会根据其读取的通道/引脚进行存储。

    此致、

    Omer Amir

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

    1.我使用的是3.3V 电压,如上面的原理图所示。  

    这里是我的 SOC 和 PPB 配置。 您能否检查我是否正确配置了 ADC。

    #define MTR1_IU_ADC_BASE        ADCA_BASE               // ADCA-A3
    #define MTR1_IV_ADC_BASE        ADCA_BASE               // ADCA-A4
    #define MTR1_IW_ADC_BASE        ADCA_BASE               // ADCA-A5
    
    #define MTR1_IU_ADCRES_BASE     ADCARESULT_BASE         // ADCA-A3
    #define MTR1_IV_ADCRES_BASE     ADCARESULT_BASE         // ADCC-A4
    #define MTR1_IW_ADCRES_BASE     ADCARESULT_BASE         // ADCC-A5
    
    #define MTR1_IU_ADC_CH_NUM      ADC_CH_ADCIN3          // ADCA-A3
    #define MTR1_IV_ADC_CH_NUM      ADC_CH_ADCIN4           // ADCA-A4
    #define MTR1_IW_ADC_CH_NUM      ADC_CH_ADCIN5           // ADCA-A5
    
    #define MTR1_IU_ADC_SOC_NUM     ADC_SOC_NUMBER1         // ADCA-A3-SOC1-PPB1
    #define MTR1_IV_ADC_SOC_NUM     ADC_SOC_NUMBER2         // ADCA-A4-SOC2-PPB2
    #define MTR1_IW_ADC_SOC_NUM     ADC_SOC_NUMBER3         // ADCA-A5-SOC3-PPB3
    
    #define MTR1_IU_ADC_PPB_NUM     ADC_PPB_NUMBER1         // ADCA-A3-SOC1-PPB1
    #define MTR1_IV_ADC_PPB_NUM     ADC_PPB_NUMBER2         // ADCA-A4 -SOC2-PPB2
    #define MTR1_IW_ADC_PPB_NUM     ADC_PPB_NUMBER3         // ADCA-A5- SOC3-PPB3
    
    
    // ADC - Voltage, Phase and dc-bus
    #define MTR1_VU_ADC_BASE        ADCB_BASE               // ADCB-B3
    #define MTR1_VV_ADC_BASE        ADCB_BASE               // ADCB-B4
    #define MTR1_VW_ADC_BASE        ADCB_BASE               // ADCB-B5
    #define MTR1_VDC_ADC_BASE       ADCD_BASE               // ADCD1-D1
    #define MTR1_POT_ADC_BASE       ADCD_BASE               // NC
    
    #define MTR1_VU_ADCRES_BASE     ADCBRESULT_BASE         // ADCB3-B3
    #define MTR1_VV_ADCRES_BASE     ADCBRESULT_BASE         // ADCB4-B4
    #define MTR1_VW_ADCRES_BASE     ADCBRESULT_BASE         // ADCB5-B5
    #define MTR1_VDC_ADCRES_BASE    ADCDRESULT_BASE         // ADCD1-D1
    #define MTR1_POT_ADCRES_BASE    ADCDRESULT_BASE         // NC
    
    #define MTR1_VU_ADC_CH_NUM      ADC_CH_ADCIN4           // ADCB3-B3
    #define MTR1_VV_ADC_CH_NUM      ADC_CH_ADCIN5           // ADCB4-B4
    #define MTR1_VW_ADC_CH_NUM      ADC_CH_ADCIN6           // ADCB5-B5
    #define MTR1_VDC_ADC_CH_NUM     ADC_CH_ADCIN7           // ADCD1-D1
    #define MTR1_POT_ADC_CH_NUM     ADC_CH_ADCIN8          // NC
    
    #define MTR1_VU_ADC_SOC_NUM     ADC_SOC_NUMBER4         // ADCB-B3   -SOC4
    #define MTR1_VV_ADC_SOC_NUM     ADC_SOC_NUMBER5         // ADCB-B4   -SOC5
    #define MTR1_VW_ADC_SOC_NUM     ADC_SOC_NUMBER6         // ADCB-B5   -SOC6
    #define MTR1_VDC_ADC_SOC_NUM    ADC_SOC_NUMBER7         // ADCD-D1   -SOC7
    #define MTR1_POT_ADC_SOC_NUM    ADC_SOC_NUMBER8         // NC
    

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

    Jagbir、您好!

    您为此使用了什么 ADC 分辨率? 2.16V 时的预期值为2681、但结果寄存器具有2651。 根据您使用的 ADC 分辨率(12位或16位)、这可能在误差范围内。

    此致、

    Omer Amir

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

    我使用的是12位 ADC。 如何选择 ADC 通道。 例如、ADC 输入连接在 D1引脚上。 我应该为其分配通道1、还是可以为其分配其他通道。

    #define MTR1_VDC_ADC_CH_NUM   ADC_CH_ADCIN7       // ADCD1-D1

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

    Jagbir、您好!

    ADC 通道通常通过使用" ADC_setupSOC (uint32_t base、ADC_SOCNumber Number、ADC_Trigger、ADC_Channel Channel、uint32_t sampleWindow)"函数进行选择。 您可以选择 ADC、该 ADC 内的 SOC、触发器、通道和采样窗口。 您在初始代码中使用的是正确的函数;要检查可用于 ADC 的通道(具体 SOC 无关紧要)、您可以查看技术参考手册的模拟子系统一章。 如果您想进一步了解如何为 F2837xS 器 件设置 ADC、可以查看 C2000Ware 中提供的示例(C2000Ware_4_XX_XX_XX\driverlib\f2837xs\examples\cPU1\ADC)。

    您收到的结果似乎超出了数据表值;您只是读取直流值吗? 输入是否完全缓冲? 是否同时使用了其他任何 ADC?

    此致、

    Omer Amir

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

    谢谢 Amir。

    我的所有 ADC 都位于通道 A 上。我能否为所有 ADC 分配一个 SoC。

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

    不可以、每个 SOC 一次只能对1个通道进行采样;要为其分配多个通道、您需要 在每次采样/触发 SOC 之前更改通道。