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.

TMS320F280049C: ADC数值跳动

Part Number: TMS320F280049C
Other Parts Discussed in Thread: LAUNCHXL-F280049C,

使用官方的LAUNCHXL-F280049C开发板,跑adc_ex1_soc_software例程验证ADC采样的问题顶,我在while(1)循环中把最后的ESTOP0屏蔽,然后在线调试,观察myADC0Result0的数值变化,给开发板的A0通道接入了信号源,给1V,发现转换结果在1200-1300之间跳变,数据很不准确,想问下是什么原因?

  • //#############################################################################
    //
    // FILE:   adc_ex1_soc_software.c
    //
    // TITLE:  ADC Software Triggering
    //
    //! \addtogroup driver_example_list
    //! <h1>ADC Software Triggering</h1>
    //!
    //! This example converts some voltages on ADCA and ADCC based on a software
    //! trigger.
    //!
    //! The ADCC will not convert until ADCA is complete, so the ADCs will not run
    //! asynchronously. However, this is much less efficient than allowing the ADCs
    //! to convert synchronously in parallel (for example, by using an ePWM 
    //! trigger).
    //!
    //! \b External \b Connections \n
    //!  - A0, A1, C2, and C3 should be connected to signals to convert
    //!
    //! \b Watch \b Variables \n
    //! - \b myADC0Result0 - Digital representation of the voltage on pin A0
    //! - \b myADC0Result1 - Digital representation of the voltage on pin A1
    //! - \b myADC1Result0 - Digital representation of the voltage on pin C2
    //! - \b myADC1Result1 - Digital representation of the voltage on pin C3
    //!
    //
    //#############################################################################
    //
    //
    // $Copyright:
    // Copyright (C) 2024 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"
    #include "board.h"
    
    //
    // Globals
    //
    uint16_t myADC0Result0;
    uint16_t myADC0Result1;
    uint16_t myADC1Result0;
    uint16_t myADC1Result1;
    
    //
    // 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();
    
        //
        // Set up ADCs, initializing the SOCs to be triggered by software
        //
        Board_init();
    
        //
        // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
        //
        EINT;
        ERTM;
    
        //
        // Loop indefinitely
        //
        while(1)
        {
            //
            // Convert, wait for completion, and store results
            //
            ADC_forceMultipleSOC(myADC0_BASE, (ADC_FORCE_SOC0 | ADC_FORCE_SOC1));
    
            //
            // Wait for ADCA to complete, then acknowledge flag
            //
            while(ADC_getInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1) == false)
            {
            }
            ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1);
    
            ADC_forceMultipleSOC(myADC1_BASE, (ADC_FORCE_SOC0 | ADC_FORCE_SOC1));
            //
            // Wait for ADCC to complete, then acknowledge flag
            //
            while(ADC_getInterruptStatus(myADC1_BASE, ADC_INT_NUMBER1) == false)
            {
            }
            ADC_clearInterruptStatus(myADC1_BASE, ADC_INT_NUMBER1);
    
            //
            // Store results
            //
            myADC0Result0 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
            myADC0Result1 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER1);
            myADC1Result0 = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER0);
            myADC1Result1 = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER1);
    
            DEVICE_DELAY_US(100);
    
            //
            // Software breakpoint. At this point, conversion results are stored in
            // myADC0Result0, myADC0Result1, myADC1Result0, and myADC1Result1.
            //
            // Hit run again to get updated conversions.
            //
            //ESTOP0;
        }
    }
    

  • 您好

    这里有几个可能的原因和解决方案供你参考:

    1. 参考电压和分辨率问题‌:

      • F280049C的ADC模块通常有一个固定的参考电压(如Vref),并且具有固定的分辨率(如12位或16位)。你需要确认你的ADC配置是否正确设置了参考电压和分辨率。
      • 如果参考电压是3.3V(或你实际使用的电压值),那么1V的输入应该对应一个特定的ADC计数值。例如,如果分辨率是12位,那么理论上1V应该对应大约1V / 3.3V * 4096(假设参考电压为3.3V且分辨率为12位)的计数值,即约1241。
    2. 信号源和输入通道问题‌:

      • 确认你的信号源是否稳定且准确地输出了1V的电压。
      • 检查开发板上的A0通道是否连接正确,没有短路或断路的情况。
    3. ADC校准和偏移‌:

      • ADC模块可能需要校准来消除偏移和增益误差。检查你的代码中是否包含了ADC校准的步骤。
      • 如果没有,你可以尝试进行ADC校准,看看是否能改善采样结果的准确性。
    4. 噪声和干扰‌:

      • 外部噪声或电源波动可能会干扰ADC的采样结果。尝试使用屏蔽电缆或增加滤波电路来减少噪声的影响。
      • 检查开发板的电源是否稳定,以及是否有其他潜在的干扰源。
    5. 代码和配置问题‌:

      • 仔细检查你的代码,确保ADC的配置(如采样率、触发源等)是正确的。
      • 确认你的代码中没有其他逻辑错误或配置错误,这些错误可能会影响ADC的采样结果。

    为了更具体地诊断问题,你可以尝试以下步骤:

    • 使用示波器或万用表检查信号源的输出电压是否稳定且准确。
    • 在开发板上使用其他ADC通道进行采样,看看是否仍然存在同样的问题。
    • 尝试使用不同的参考电压设置,看看采样结果是否有所变化。
    • 检查并更新你的ADC校准参数。
  • 非常感谢您的解答,我这边情况是这样的,设计了一款基于TMS320F280049C的电源板,ADC这边数值跳动很大,大约波动有100左右,相对于12位ADC波动达到了2.5%,所以就回过头去看官方的开发板,发现用开发板跑官方例程,用信号源直接给信号的形式波动也比较大,今天又试了将模拟输入引脚短接到开发板的地和VREFHI,波动会小一点,但是也达到了10左右,相当于12位ad只能做到9位左右稳定度,想问下,这个片内的AD理论上能做到多高的稳定度,先不谈精度了?

  • 您好

    1. 电源稳定性

    • 影响‌:电源噪声会直接影响ADC的采样精度和稳定度。
    • 优化方法‌:使用高质量的电源滤波器,确保电源线路的稳定和干净。同时,将ADC的模拟电源(VDDA)和模拟地(VSSA)分别连接到单独的、干净的电源和地,以减少数字电路对模拟电路的干扰。

    2. 参考电压稳定性

    • 影响‌:参考电压的波动会导致ADC转换结果的偏移和不稳定。
    • 优化方法‌:使用稳定的参考电压源,并确保参考电压线路的稳定和干净。如果可能,可以使用外部精密参考电压源来提高稳定度。

    3. 输入信号质量

    • 影响‌:输入信号的噪声和干扰会影响ADC的采样结果。
    • 优化方法‌:在ADC输入端添加适当的滤波电路,以减少高频噪声的干扰。同时,确保输入信号在ADC的输入范围内,并避免过压或欠压情况。

    4. ADC配置和校准

    • 影响‌:ADC的配置参数(如采样速度、分辨率、输入衰减等)和校准状态会影响其稳定度。
    • 优化方法‌:根据实际应用需求,合理配置ADC的参数。同时,定期进行ADC校准,以消除内部电容器组变化带来的误差。校准过程中,需要确保ADC处于断电状态,并按照校准时序图进行操作。

    5. 时钟稳定性

    • 影响‌:ADC时钟的稳定性和精度会影响其采样结果的准确性和稳定度。
    • 优化方法‌:为ADC提供稳定且精确的时钟源。可以使用专用的可编程预分频器来调整ADC时钟的频率,以满足实际应用需求。

    6. 环境和布局因素

    • 影响‌:环境温度、湿度以及PCB布局和布线等因素也会对ADC的稳定度产生影响。
    • 优化方法‌:将ADC模块放置在温度稳定且湿度适中的环境中。同时,在PCB布局时,确保ADC相关的信号线路尽可能短且远离高噪声区域。此外,还可以采取适当的屏蔽措施来减少外部干扰。

    这是影响单片机内部ADC稳定的相关因素,建议您通过上述建议优化。

  • 非常感谢宝贵建议