大家好! 我正在尝试检查 MCU 的 ADC 输出。 我使用了 AdcGTO 的可用 C2000示例。 我所做的就是为我的设置提供3.3V 和0V、并测量输出 ADC 值。 对于0V、它显示635数字输出、而对于3.3V、它显示3025值。 我使用万用表测量引脚上的电压、它会提供准确的值。 我想知道我为什么得到这个偏差值。
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.
大家好! 我正在尝试检查 MCU 的 ADC 输出。 我使用了 AdcGTO 的可用 C2000示例。 我所做的就是为我的设置提供3.3V 和0V、并测量输出 ADC 值。 对于0V、它显示635数字输出、而对于3.3V、它显示3025值。 我使用万用表测量引脚上的电压、它会提供准确的值。 我想知道我为什么得到这个偏差值。
你好,Bhashini,
请参阅 ADC:初始转换公告在 F2806x 勘误表中、此注释介绍了如何进行初始转换。 您是在 序列中的每一次/多次转换、还是仅在序列中的第一次转换上看到此问题? 这 很可能就是原因。

此致、
阿米尔·奥马尔
//########################################################################### // // FILE: Example_2806xAdcSoc.c // // TITLE: ADC Start of Conversion Example // //! \addtogroup f2806x_example_list //! <h1> ADC Start of Conversion (adc_soc)</h1> //! //! This ADC example uses ePWM1 to generate a periodic ADC SOC - ADCINT1. //! Two channels are converted, ADCINA4 and ADCINA2. //! //! \b Watch \b Variables \n //! - Voltage1[10] - Last 10 ADCRESULT0 values //! - Voltage2[10] - Last 10 ADCRESULT1 values //! - ConversionCount - Current result number 0-9 //! - LoopCount - Idle loop counter // //########################################################################### // $TI Release: $ // $Release Date: $ // $Copyright: // Copyright (C) 2009-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 "DSP28x_Project.h" // Device Headerfile and Examples Include File // // Function Prototypes // __interrupt void adc_isr(void); void Adc_Config(void); // // Globals // Uint16 LoopCount; Uint16 ConversionCount; Uint16 Voltage1[10]; Uint16 Voltage2[10]; // // Main // void main(void) { // // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the F2806x_SysCtrl.c file. // InitSysCtrl(); // // Step 2. Initialize GPIO: // This example function is found in the F2806x_Gpio.c file and // illustrates how to set the GPIO to it's default state. // // InitGpio(); // Skipped for this example // // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts // DINT; // // Initialize the PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the F2806x_PieCtrl.c file. // InitPieCtrl(); // // Disable CPU interrupts and clear all CPU interrupt flags: // IER = 0x0000; IFR = 0x0000; // // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in F2806x_DefaultIsr.c. // This function is found in F2806x_PieVect.c. // InitPieVectTable(); // // Interrupts that are used in this example are re-mapped to // ISR functions found within this file. // EALLOW; // This is needed to write to EALLOW protected register PieVectTable.ADCINT1 = &adc_isr; //interrupt service request EDIS; // This is needed to disable write to EALLOW protected registers // // Step 4. Initialize all the Device Peripherals: // This function is found in F2806x_InitPeripherals.c // InitPeripherals(); // Not required for this example // InitAdc(); // For this example, init the ADC AdcOffsetSelfCal();//ADC Zero Offset Calibration // // Step 5. User specific code, enable interrupts: // // // Enable ADCINT1 in PIE // PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // Enable INT 1.1 in the PIE IER |= M_INT1; // Enable CPU Interrupt 1 EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM LoopCount = 0; ConversionCount = 0; // // Configure ADC // EALLOW; AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; // Enable non-overlap mode - overlap sample is not allowed // // ADCINT1 trips after AdcResults latch // AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // INt Pulse generation occurs 1 cycle prior to ADC result latching into its result register AdcRegs.INTSEL1N2.bit.INT1E = 1; // Enabled ADCINT1 AdcRegs.INTSEL1N2.bit.INT1CONT = 0; // Disable ADCINT1 Continuous mode // // setup EOC1 to trigger ADCINT1 to fire // AdcRegs.INTSEL1N2.bit.INT1SEL = 1; AdcRegs.ADCSOC0CTL.bit.CHSEL = 4; // set SOC0 channel select to ADCINA4 AdcRegs.ADCSOC1CTL.bit.CHSEL = 2; // set SOC1 channel select to ADCINA2 // // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts // first then SOC1 // AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts // first then SOC1 // AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1) // AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1) // AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; EDIS; // // Assumes ePWM1 clock is already enabled in InitSysCtrl(); // EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from CMPA on upcount EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event EPwm1Regs.CMPA.half.CMPA = 0x0080; // Set compare A value EPwm1Regs.TBPRD = 0xFFFF; // Set period for ePWM1 EPwm1Regs.TBCTL.bit.CTRMODE = 0; // count up and start // // Wait for ADC interrupt // for(;;) { LoopCount++; } } // // adc_isr - // __interrupt void adc_isr(void) { Voltage1[ConversionCount] = AdcResult.ADCRESULT0; Voltage2[ConversionCount] = AdcResult.ADCRESULT1; // // If 20 conversions have been logged, start over // if(ConversionCount == 9) { ConversionCount = 0; } else { ConversionCount++; } // // Clear ADCINT1 flag reinitialize for next SOC // AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE return; } // // End of File //
1.您好。 上面是我用于测试的代码。 我使用了 TMS320F28069 开发板、并为 ADCINA4和 ADCINA2引脚提供3.3V 和0V 电压。 我使用开发板中的3.3V 引脚提供3.3V 电压、并通过接地端提供0V 电压。 我使用跳线连接了这些引脚。 然后构建和调试上述示例、并使用实时表达式查看 Voltage1和 Voltage2的值。 但根据计算、0V 的预期值为0、3.3V 的预期值为4095。 但我没有在实时表达式中观察到这些值。 我需要首先解决该误差。
2.然后我需要更改上述代码以显示 ADCINB1的输出,即上述 MCU 中的29个引脚。
你好,Bhashini,
您是否已经 验证 ACQPS 足以用于连接到引脚的信号? 该值根据提供该电压的电路的阻抗进行设置、 有关详细信息、请参阅第8.2.1节"ADC 采集(采样保持)窗口"。
您使用的器件是哪种类型的器件、它是 controlCARD 吗? 此外、您能否向我展示0V 和3.3V 信号范围的图像? 您是否还看过了器件的电源轨范围、以确保 它们处于预期的范围内?
此致、
阿米尔·奥马尔