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**** 2560580 points
Other Parts Discussed in Thread: LAUNCHXL-F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1287419/tms320f28379d-adc-measurement-changes-when-connecting-two-channels

器件型号:TMS320F28379D
主题中讨论的其他器件:REF5030LAUNCHXL-F28379D

我在 ADCINB5上有一个信号、我想与 CMPSS 一起使用。  由于 ADCINB5不与 CMPSS 输入共用一个引脚、因此我使用 LaunchPad 上的接头引脚将 ADCINB5连接至 ADCINA2。  (J7-5至 J3-9)

我所观察到的情况:

在空载条件下并在 ADCINB5从 ADCINA2断开的情况下、我看到 ADC 测量值为0x8CC。

当我将 ADCINB5连接到 ADCINA2时、ADCINB5测量跳转到~0x8DB。  ADCINA2处的测量结果是~0x88B。

  • 我不希望 ADCINB5测量
  • 我希望 ADCINB5的测量结果与 ADCINA2相同

LaunchPad 修订版本为2.0。  ( 关于修订版1.1中 ADCINA2与修订版1.1上的 VREFHI 的注释不适用)

在此应用中、ADCINA2未连接。  (Launchpad 连接到定制子板、但 ADCINA2未使用)

我对 ADCINA2使用 ADCA 上的 SOC1、对 ADCINB5使用 ADCB 上的 SOC1。

两种情况下的 SOC1均由 EPWM6A 触发


有任何关于 B5不匹配 A2的建议吗?  或者为什么在连接 A2时 B5改变?

谢谢!

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

    标记、

    您能否评论一下连接到 C2000 ADCINB5/A2的输入电路?  这将有助于全面了解源阻抗等。  我假设上面提到的信号本质上是直流、如果没有、请告诉我。

    1)连接到 A2时出现错误:  

    • 当您连接/采样 ADCINA2时、B5的采样顺序是否被保存?  即 B5、然后 A2。  
    • 如果您重复采样 B5 (可能相当于一行8次)、它是否会收敛回您在短接引脚前测量的原始值?  也许可以用原始配置尝试这样做、以验证您看到的基线值的范围
    • 您是否可以尝试相同的实验(连接引脚)、但不启用连接到 A2的 CMPSS、并查看 B5是否仍受影响? 采样 A2、看看该值是否

    2) ADCA 到 ADCB 的错误

    • 此处的 delta 幅度(80个 ADC 代码)超出了 我们在 DS (总共+/-9LSB)中列出的任何 ADC 到 ADC 误差的规格。  您正在使用的两个引脚之间存在引脚电容差、启用 CMPSS 也会为 ADCA 增加一些 pF (如下)。  但我不确定这会解释差值、即使不知道您的输入电路。  我们可以尝试使用上述 A2与 B5进行相同的过采样、以查看是否考虑到某些驱动效应。

    此致!
    马修

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

    Matthew、您好!

    根据您的第一个问题、

    • 我尝试同时对它们进行采样。  均由 EPWM6A 触发。  两者都采用 SOC1。  使用 SOC0时、在任一通道上均不进行转换。   在两个通道上都使用 SOC2、但也会由 EPWM6A 触发。   唯一的区别:我对 ADCINB5/SOC1使用 PPB、并且已对 ADCINA2/SOC1配置 CMPSS1。
    • 我在"Expressions"窗口中观察 ADCRESULT1寄存器。  它通常在+/- 3 ADC 计数周围反弹。  我现在正在我键入时观察它、它通常介于0x8C5和0x8C9之间且已连接 ADCINA2、0x8CC 到0x8CE 之间未连接 ADCINA2
    • 在 ADCINA2断开的情况下、我在 ADCA/SOC1的 ADCRESULT1寄存器中看到了0x0000
    • 在 CMPSS 未初始化、ADCINA2连接到 ADCINB5的情况下、我仍然看到差异。  例如、ADCINB5上的0x08B3和 ADCINA2上的0x089B。   ADCINA2似乎抖动多一点、至少在更宽的范围方面。  在我观看的短时间内从0x088A 一直到0x089C。  ADCINB5在0x08B7至0x8BC 范围内。  

    它是一个电流感应电路。  如果需要的话、我可以在 PM 之前向您发送原理图片段。

    谢谢!

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

    标记、

    感谢您添加的详细信息、也感谢您通过 PM 发送的电路图像。

    我想分别尝试2件事

    1)在 ADCINA2未连接的情况下、ADCINB5背靠背采样8次、保持 ADC 被载入。  为此、您需要将 SOC0-7设置为具有相同的设置、然后您可以使用 ADCSOCFRC1并写入0xFF 来触发所有这些设置、以便序列发生器处理采样并保持 ADC 加载。  记录这些结果

    2)使用 ADCINA2执行相同的操作、如果可能无法将模拟源连接到 ADCINB5、但如果不能连接、则不要在 ADCA2正在采样同一个信号时使用 ADCB。

    我想看看我们用1个 ADC 样本获得的值是否与上面的样本8获得的值匹配、以确保网络可以正确地为 ADC 样本电容器充电。

    3)说明:连接到 ADCINA2的最初目的是使用 ADCINB5上没有的比较器功能、执行此操作时您会注意到 ADCINB5转换发生改变、然后您添加了 ADCINA2样本;或者之前有 ADCINA2被采样。  我要确保只是比较器功能导致了问题、而不是采样。

    此致!

    马修

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

    Matthew、您好!

    下面是添加的代码、供参考:

        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN5, 15);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN5, 15);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN5, 15);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN5, 15);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN5, 15);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER5, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN5, 15);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER6, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN5, 15);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER7, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN5, 15);
    
    
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN2, 15);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN2, 15);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN2, 15);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN2, 15);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN2, 15);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER5, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN2, 15);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER6, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN2, 15);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER7, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN2, 15);
    
    
        while(1){
    
            ADC_forceMultipleSOC(ADCB_BASE,ADC_FORCE_SOC0 |
                                 ADC_FORCE_SOC1 |
                                 ADC_FORCE_SOC2 |
                                 ADC_FORCE_SOC3 |
                                 ADC_FORCE_SOC4 |
                                 ADC_FORCE_SOC5 |
                                 ADC_FORCE_SOC6 |
                                 ADC_FORCE_SOC7);
    
            while(ADC_isBusy(ADCB_BASE))
                ;
    
            ADC_forceMultipleSOC(ADCA_BASE,ADC_FORCE_SOC0 |
                                 ADC_FORCE_SOC1 |
                                 ADC_FORCE_SOC2 |
                                 ADC_FORCE_SOC3 |
                                 ADC_FORCE_SOC4 |
                                 ADC_FORCE_SOC5 |
                                 ADC_FORCE_SOC6 |
                                 ADC_FORCE_SOC7);
    
            while(ADC_isBusy(ADCA_BASE))
                ;
    
    
        }

    ADCINB5和 ADCINA2断开。  要测量的信号连接到 ADCINB5。

    1) 1)以下是 ADCBIN5的结果、来自上电复位和首次尝试捕捉:

    2) 2) ADCINA2结果似乎有变化。  第一个采样通常为非零、然后收敛为零。  但不同运行之间似乎并不相同。  几个示例:

    3)您对原始意图的理解是正确的。  我仅添加了 ADCINA2以使用比较器功能。  除了比较器功能、我增加了 ADC 采样、以验证引脚的值是否与 ADCINB5相同。

    为了再次确认、Launchpad 定制子板的原理图中显示 ADCINA2未连接到任何东西。  在未连接至 ADCINB5时保持悬空。

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

    标记、
    感谢您为我整理这些数据。  对于 B5、看起来电路驱动良好、采样保持时间对于该连接合适、也就是说我们没有看到后续结果四处移动。

    对于 A2来说、这很有趣、因为如果它是悬空的、我不会期望它收敛到零(接地)。  当地的 S/H 电容器将只保持充电到 VREFHI 的1/2或1/4左右(我不记得确切的余值)。  通常我们不关心浮点结果、但在本例中、由于连接时它似乎影响了 B5、因此我想看到此数据。

    更多问题:

    q1)在上面的中、连接到 ADCINA2的比较器是否已启用?  如果可以、您能否将其关闭、然后再次采集样本?

    Q2)让我们重复 A2采样、但这一次连接电压、就像您在开头并行连接到 B5那样。  让我们在启用/禁用比较器的情况下执行此操作。

    Q3)您能否对电路板上其他 ADCINA 通道的连接发表评论?

    Q4)还对电路板上与 VREFHIS/VREFLO (A/B/C/D)的连接进行注释

    此致!

    马修

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

    问题1)我已禁用 CMPSS 初始化、因此应该采用任何默认设置、我认为这些设置已被禁用。

    问题2)  

    在禁用 CMPSS 初始化的情况下、连接 A2/B5:

     启用 CMPSS 初始化的情况下、连接 A2/B5:

    Q3)我必须更详细地查看原理图、但从更高层次看:

    ADCINA0:温度检测、但在此测试用例中未配置

    ADCINA1:温度检测、但在此测试用例中未配置

    ADCINA2:未使用/悬空

    ADCINA3:未使用/悬空

    ADCINA4:电压检测、但在此测试用例中未配置

    ADCINA5:电流检测、但在此测试用例中未配置

    Q4)我确认了 LaunchPad 在标记为5V 的接头引脚上具有5V 电压、在标记为3.3V 的引脚上具有3.3V 电压。  我没有地方在 LaunchPad 上直接探测这些信号

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

    标记、

    感谢您提供的数据、感谢您提醒我、我们现在位于 LaunchPad 上。  ADC 基准生成来自电路板上的单个 REF5030 (U13)。  有2个放大器 U19/U11分别被路由至 ADCA/C 和 ADCB/D。

    如果您可以探测 R11 (REFHIA)和 R52 (REFHIB)以确保它们的外观与将该问题摆在桌面上的外观相同、  我要确保我们不存在向 ADC 提供不同 VREFHI 的板级问题。

    关于新数据的一个有趣现象是、ADCINA2不会因为打开比较器而受到影响、但是 ADCINB5会受到影响(除了通常是来自 ADCAINA2读数的偏移之外)。

    您还能验证并告知我您的 LAUNCHXL-F28379D 修订版本吗?  这应该位于板的正面、丝印上的火箭符号(左下)下方。

    马特

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

    您好、Matt、

    R52在电路板的底部、我无法(很容易)使用附加的定制子板(子板供电)探针。

    移除子板并通过 USB 供电、我在 R11和 R52上测量3.0V。

    电路板版本为2.0。

    谢谢。

    标记

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

    Mark、您好!

    Matt 在1月8日之前不在办公室、请在1月8日之前等待、以便进行后续回复。

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

    Mark、您好!

    为了排除 ADC 设置的影响、如果您并行运行两个 ADC A 和 B、您能否尝试此代码来查看在 A2和 B5中得到的值?

    您可以在项目中使用以下代码。 变量 adcAResults 和 adcBResults 应该非常接近(4~5 LSB 差异)

    //#############################################################################
    //
    // FILE:   adc_ex2_soc_epwm.c
    //
    // TITLE:  ADC ePWM Triggering
    //
    //! \addtogroup driver_example_list
    //! <h1>ADC ePWM Triggering</h1>
    //!
    //! This example sets up ePWM1 to periodically trigger a conversion on ADCA.
    //!
    //! \b External \b Connections \n
    //!  - A2 and B5 should be connected to a signal to convert
    //!
    //! \b Watch \b Variables \n
    //! - \b adcAResults and  adcBResults- A sequence of analog-to-digital conversion samples from
    //!   pin A2 and B5. The time between samples is determined based on the period
    //!   of the ePWM timer.
    //!
    //
    //#############################################################################
    //
    // 
    // $Copyright:
    // Copyright (C) 2013-2023 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without 
    // modification, are permitted provided that the following conditions 
    // are met:
    // 
    //   Redistributions of source code must retain the above copyright 
    //   notice, this list of conditions and the following disclaimer.
    // 
    //   Redistributions in binary form must reproduce the above copyright
    //   notice, this list of conditions and the following disclaimer in the 
    //   documentation and/or other materials provided with the   
    //   distribution.
    // 
    //   Neither the name of Texas Instruments Incorporated nor the names of
    //   its contributors may be used to endorse or promote products derived
    //   from this software without specific prior written permission.
    // 
    // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // $
    //#############################################################################
    //
    
    //
    // Included Files
    //
    #include "driverlib.h"
    #include "device.h"
    
    //
    // Defines
    //
    #define RESULTS_BUFFER_SIZE     256
    #define EX_ADC_RESOLUTION       12
    // 12 for 12-bit conversion resolution, which supports (ADC_MODE_SINGLE_ENDED)
    // Sample on single pin (VREFLO is the low reference)
    // Or 16 for 16-bit conversion resolution, which supports (ADC_MODE_DIFFERENTIAL)
    // Sample on pair of pins (difference between pins is converted, subject to
    // common mode voltage requirements; see the device data manual)
    
    //
    // Globals
    //
    uint16_t adcAResults[RESULTS_BUFFER_SIZE];   // Buffer for results
    uint16_t adcBResults[RESULTS_BUFFER_SIZE];
    uint16_t index;                              // Index into result buffer
    volatile uint16_t bufferFull;                // Flag to indicate buffer is full
    
    //
    // Function Prototypes
    //
    void initADC(void);
    void initEPWM(void);
    void initADCSOC(void);
    __interrupt void adcA1ISR(void);
    __interrupt void adcB1ISR(void);
    
    //
    // Main
    //
    void main(void)
    {
        //
        // Initialize device clock and peripherals
        //
        Device_init();
    
        //
        // Disable pin locks and enable internal pullups.
        //
        Device_initGPIO();
    
        //
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        //
        Interrupt_initModule();
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        //
        Interrupt_initVectorTable();
    
        //
        // Interrupts that are used in this example are re-mapped to ISR functions
        // found within this file.
        //
        Interrupt_register(INT_ADCA1, &adcA1ISR);
        Interrupt_register(INT_ADCB1, &adcB1ISR);
    
        //
        // Set up the ADC and the ePWM and initialize the SOC
        //
        initADC();
        initEPWM();
        initADCSOC();
    
        //
        // Initialize results buffer
        //
        for(index = 0; index < RESULTS_BUFFER_SIZE; index++)
        {
            adcAResults[index] = 0;
            adcBResults[index] = 0;
        }
    
        index = 0;
        bufferFull = 0;
    
        //
        // Enable ADC interrupt
        //
        Interrupt_enable(INT_ADCA1);
        Interrupt_enable(INT_ADCB1);
    
        //
        // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
        //
        EINT;
        ERTM;
    
        //
        // Loop indefinitely
        //
        while(1)
        {
            //
            // Start ePWM1, enabling SOCA and putting the counter in up-count mode
            //
            EPWM_enableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
            EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP);
    
            //
            // Wait while ePWM1 causes ADC conversions which then cause interrupts.
            // When the results buffer is filled, the bufferFull flag will be set.
            //
            while(bufferFull == 0)
            {
            }
            bufferFull = 0;     // Clear the buffer full flag
    
            //
            // Stop ePWM1, disabling SOCA and freezing the counter
            //
            EPWM_disableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
            EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);
    
            //
            // Software breakpoint. At this point, conversion results are stored in
            // adcAResults.
            //
            // Hit run again to get updated conversions.
            //
            //ESTOP0;
        }
    }
    
    //
    // Function to configure and power up ADCA.
    //
    void initADC(void)
    {
        
        //
        // Set ADCDLK divider to /4
        //
        ADC_setPrescaler(ADCA_BASE, ADC_CLK_DIV_4_0);
        ADC_setPrescaler(ADCB_BASE, ADC_CLK_DIV_4_0);
    
        //
        // Set resolution and signal mode (see #defines above) and load
        // corresponding trims.
        //
    #if(EX_ADC_RESOLUTION == 12)
        ADC_setMode(ADCA_BASE, ADC_RESOLUTION_12BIT, ADC_MODE_SINGLE_ENDED);
        ADC_setMode(ADCB_BASE, ADC_RESOLUTION_12BIT, ADC_MODE_SINGLE_ENDED);
    #elif(EX_ADC_RESOLUTION == 16)
        ADC_setMode(ADCA_BASE, ADC_RESOLUTION_16BIT, ADC_MODE_DIFFERENTIAL);
    #endif
    
        //
        // Set pulse positions to late
        //
        ADC_setInterruptPulseMode(ADCA_BASE, ADC_PULSE_END_OF_CONV);
        ADC_setInterruptPulseMode(ADCB_BASE, ADC_PULSE_END_OF_CONV);
    
        //
        // Power up the ADC and then delay for 1 ms
        //
        ADC_enableConverter(ADCA_BASE);
        ADC_enableConverter(ADCB_BASE);
        DEVICE_DELAY_US(1000);
    }
    
    //
    // Function to configure ePWM1 to generate the SOC.
    //
    void initEPWM(void)
    {
        //
        // Disable SOCA
        //
        EPWM_disableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
    
        //
        // Configure the SOC to occur on the first up-count event
        //
        EPWM_setADCTriggerSource(EPWM1_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_U_CMPA);
        EPWM_setADCTriggerEventPrescale(EPWM1_BASE, EPWM_SOC_A, 1);
    
        //
        // Set the compare A value to 1000 and the period to 1999
        // Assuming ePWM clock is 100MHz, this would give 50kHz sampling
        // 50MHz ePWM clock would give 25kHz sampling, etc. 
        // The sample rate can also be modulated by changing the ePWM period
        // directly (ensure that the compare A value is less than the period). 
        //
        EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 1000);
        EPWM_setTimeBasePeriod(EPWM1_BASE, 1999);
    
        //
        // Set the local ePWM module clock divider to /1
        //
        EPWM_setClockPrescaler(EPWM1_BASE,
                               EPWM_CLOCK_DIVIDER_1,
                               EPWM_HSCLOCK_DIVIDER_1);
    
        //
        // Freeze the counter
        //
        EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);
    }
    
    //
    // Function to configure ADCA's SOC0 to be triggered by ePWM1.
    //
    void initADCSOC(void)
    {
        //
        // Configure SOC0 of ADCA to convert pin A0. The EPWM1SOCA signal will be
        // the trigger.
        // - For 12-bit resolution, a sampling window of 15 (75 ns at a 200MHz
        //   SYSCLK rate) will be used.  For 16-bit resolution, a sampling window
        //   of 64 (320 ns at a 200MHz SYSCLK rate) will be used.
        // - NOTE: A longer sampling window will be required if the ADC driving
        //   source is less than ideal (an ideal source would be a high bandwidth
        //   op-amp with a small series resistance). See TI application report
        //   SPRACT6 for guidance on ADC driver design.
        //
    
    #if(EX_ADC_RESOLUTION == 12)
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN2, 15);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                         ADC_CH_ADCIN5, 15);
    #elif(EX_ADC_RESOLUTION == 16)
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN0, 64);
    #endif
    
        //
        // Set SOC0 to set the interrupt 1 flag. Enable the interrupt and make
        // sure its flag is cleared.
        //
        ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0);
        ADC_setInterruptSource(ADCB_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER0);
        ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1);
        ADC_enableInterrupt(ADCB_BASE, ADC_INT_NUMBER1);
        ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
        ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1);
    }
    
    //
    // ADC A Interrupt 1 ISR
    //
    __interrupt void adcA1ISR(void)
    {
        //
        // Add the latest result to the buffer
        //
        adcAResults[index++] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
        //
        // Set the bufferFull flag if the buffer is full
        //
        if(RESULTS_BUFFER_SIZE <= index)
        {
            index = 0;
            bufferFull = 1;
        }
    
        //
        // Clear the interrupt flag
        //
        ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
        //
        // Check if overflow has occurred
        //
        if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
        {
            ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
            ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
        }
    
    
        //
        // Acknowledge the interrupt
        //
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    }
    //
    // ADC B Interrupt 1 ISR
    //
    __interrupt void adcB1ISR(void)
    {
        //
        // Add the latest result to the buffer
        //
    
        adcBResults[index++] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER0);
        //
        // Set the bufferFull flag if the buffer is full
        //
        if(RESULTS_BUFFER_SIZE <= index)
        {
            index = 0;
            bufferFull = 1;
        }
    
        //
        // Clear the interrupt flag
        //
    
        ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1);
        //
        // Check if overflow has occurred
    
        if(true == ADC_getInterruptOverflowStatus(ADCB_BASE, ADC_INT_NUMBER1))
        {
            ADC_clearInterruptOverflowStatus(ADCB_BASE, ADC_INT_NUMBER1);
            ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1);
        }
    
        //
        // Acknowledge the interrupt
        //
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    }
    
    

    此致、

    哈迪