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.

[参考译文] TMS320F28388D:ADC 实验问题和 ePWM 功能。 您想获取更多 ADC 结果样本、

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1293393/tms320f28388d-problems-with-the-adc-lab-and-a-functionality-with-epwm-want-more-samples-of-the-adc-results

器件型号:TMS320F28388D
主题中讨论的其他器件: C2000WARESysConfig

各位同事:

我正在学习使用德州仪器的微控制器、以具有 controlCARD 和集线卡的 TMS320F28388D 为例。
为了了解如何对它们进行编程、我已经开始进行 C2000Ware 实验、如下所示: https://dev.ti.com/tirex/explore/node?node=A__AVSjOwDYHkfv9LUHQuulzA__C2000-ACADEMY__3H1LnqB__LATEST  

本实验涉及使用 ADC 和 PWM。 我能够执行实验、因为该实验设置正确。

但我的想法是在该实验室中测试以下内容。
-我希望 ADC 读取由另一个独立于 ADC 触发器的 PWM 创建的 PWM 生成的方波信号。
-我想看看不同的采样率如何影响获得的信号。

对于具有 PWM 的 ADC 触发器与 ADC 采样率之间的关系以及它们的关系、我有点困惑。
我想在 ADC 上创建一个 PWM 触发器、这个触发器在每次转换完成时都会触发 ADC。 我不知道使用 PWM 实现此功能或设置 ADC 采样率并让其在每次完成转换时触发是否理想。

这是我有的代码 、从实验室中复制和粘贴、我不在乎它、因为它不会影响我想添加的功能(除了 ADC 的读取)

//#############################################################################
//
// FILE: lab_main.c
//
// TITLE: adc lab
//
// C2K ACADEMY URL: dev.ti.com/.../node
//
//! \addtogroup academy_lab_list
//! <h1> Using Analog Subsystems Lab - Sysconfig </h1>
//!
//! The objective of this lab exercise is to become familiar with the
//! programming and operation of the on-chip analog-to-digital converter (ADC).
//! The microcontroller (MCU) will be setup to sample a single ADC input
//! channel at a prescribed sampling rate and store the conversion result in a
//! circular memory buffer. In the second part of this lab exercise, the
//! digital-to-analog converter (DAC) will be explored. 
//!
//! \b External \b Connections \n
//!  - Refer to Academy Lab instruction for exact pin for your device/board
//!
//! \b Watch \b Variables \n
//!  - None.
//!
//#############################################################################
// $Copyright:
// Copyright (C) 2022 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 "board.h"

//
// Global variables and definitions
//
#define ADC_BUF_LEN         50
uint16_t DEBUG_TOGGLE = 1;    // Used for real-time mode
uint16_t AdcBuf[ADC_BUF_LEN];  // ADC buffer allocation

#ifdef DACB_BASE
uint16_t DacOutput;
uint16_t DacOffset;
uint16_t SINE_ENABLE = 0;

// quadrature look-up table: contains 4 quadrants of sinusoid data points
#define SINE_PTS 25
int QuadratureTable[SINE_PTS] = {
        0x0000,         // [0]  0.0
        0x1FD4,         // [1]  14.4
        0x3DA9,         // [2]  28.8
        0x579E,         // [3]  43.2
        0x6C12,         // [4]  57.6
        0x79BB,         // [5]  72.0
        0x7FBE,         // [6]  86.4
        0x7DBA,         // [7]  100.8
        0x73D0,         // [8]  115.2
        0x629F,         // [9]  129.6
        0x4B3B,         // [10] 144.0
        0x2F1E,         // [11] 158.4
        0x100A,         // [12] 172.8
        0xEFF6,         // [13] 187.2
        0xD0E2,         // [14] 201.6
        0xB4C5,         // [15] 216.0
        0x9D61,         // [16] 230.4
        0x8C30,         // [17] 244.8
        0x8246,         // [18] 259.2
        0x8042,         // [19] 273.6
        0x8645,         // [20] 288.0
        0x93EE,         // [21] 302.4
        0xA862,         // [22] 316.8
        0xC257,         // [23] 331.2
        0xE02C          // [24] 345.6
        };
#endif

//
// Function Declarations
//
void initEPWM3(void);
__interrupt void INT_myADCA_1_ISR(void);
__interrupt void epwm3ISR(void);
//
// Main
//
void main(void)
{
    // CPU Initialization
    Device_init();
    Interrupt_initModule();
    Interrupt_initVectorTable();

    // Configure the GPIOs/ADC/PWM through SysConfig generated files
    Board_init();

    // Enable global interrupts and real-time debug
    EINT;
    ERTM;

    // Main Loop
    while(1){}

}

interrupt void INT_myADCA_1_ISR(void)
{
    static uint16_t *AdcBufPtr = AdcBuf;
    uint16_t LED_count = 0;

    // Read the ADC Result
    *AdcBufPtr++ = ADC_readResult(myADCA_RESULT_BASE, myADCA_SOC0);

    // Brute Force the circular buffer
    if (AdcBufPtr == (AdcBuf + ADC_BUF_LEN))
    {
        AdcBufPtr = AdcBuf;
    }

    // Toggle the pin
    if(DEBUG_TOGGLE == 1)
    {
        GPIO_togglePin(myGPIOToggle);
    }


#ifdef DACB_BASE
    // Write to DAC-B to create input to ADC-A0
    static uint16_t iQuadratureTable = 0;        // Quadrature table index

    if(SINE_ENABLE == 1)
    {
        DacOutput = DacOffset + ((QuadratureTable[iQuadratureTable++] ^ 0x8000) >> 5);
    }
    else
    {
        DacOutput = DacOffset;
    }
    if(iQuadratureTable > (SINE_PTS - 1))        // Wrap the index
    {
        iQuadratureTable = 0;
    }
    DAC_setShadowValue(myDACB_BASE, DacOutput);
#endif

    Interrupt_clearACKGroup(INT_myADCA_1_INTERRUPT_ACK_GROUP);
    ADC_clearInterruptStatus(myADCA_BASE, ADC_INT_NUMBER1);
} // End of ADC ISR




//
// End of File
//

我将通过 SysConfig 配置系统的不同元件

-在第一种情况下(方波信号5kHz,触发 PWM ADC 25kHz):

  • 使用此设置的 myEPWM4 (使用 PWM 生成的方波信号):

  • 使用此设置的 myEPWM1 (ADC 触发):

  • 采用此设置的 ADC:

从示波器上可以看到、它们由5kHz 的 PWM 和 ADC 的触发 PWM (在中断 ADC 处理程序中切换、在代码中切换)切换的切换引脚(见代码)生成方波形、在高和低之间切换(在中断 ADC 处理程序中切换、见代码) 约为25kHz。  

如图所示、转换的结果为:

合理的。

现在、当我 从 ADC 饱和中更改"SOC0采样窗口[SYSCLK 计数]"或从 ADC 的 PWM 触发器中更改"时基周期"时、ADC 讲座会非常糟糕、没有任何意义。

我将向您展示更多示例:

-案例2 ,与第1个示例相同,但将  SOC0采样窗口[SYSCLK 计数]从10更改为200。 ADC 的结果与第一种情况中的结果非常相似(如果更改该参数、我不知道为什么无法获得更多或更少的样本)

-案例3: 与第1个示例相同,但将 ADC 时钟预分频器更 改为 ADCCLK= CLKINPUT/2。 ADC 的结果与第一种情况中的结果

-案例4:与第一个示例相同,但将时基周期更改为999 (第一个扩展量的一半)。 在这种情况下、ADC 结果很糟糕、没有道理(方波输入信号保持不变)

ADC 结果会始终在0和1之间变化、没有任何检测

-案例6:与案例5相同、但使用时基周期1449、结果相同:  

-案例6: 与第一个示例相同,但将时基周期更改为3999 (第一个示例的两倍)。 在这种情况下、ADC 结果又很糟糕、没有意义(方波输入信号保持不变)

我想知道的是如何从 ADC 获得更多测量点、以及是否可以通过修改 PWM 触发器或其他方法来实现。 但我想比第一个示例更准确地查看5kHz 信号、我不知道如何操作。
我希望你能帮助我,提前非常感谢你。

佩德罗

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

    您好 Pedro:

    您可以使用 SOC 中断触发功能使 ADC 持续采样。 使用此功能、您可以将 SOC 配置为由其中一个 ADC 中断信号(在转换结束时生成)触发。 要了解其工作原理、最简单的方法是查看 C2000Ware 中的 ADC 示例5 (ADC_Ex5_SoC_Continuous)。 基本思路是在外部触发一次 ADC、然后 ADC 使用中断触发器持续触发自身。  

    此致、
    伊袋

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

    e2e.ti.com/.../adc_5F00_cc_5F00_f2838x.zip

    尊敬的 Ibukun:

    感谢您的回答。 我遵循了您提到的 DE 示例5、但我仍然有问题。 我附上我完成的项目。 如您所见、该项目与示例5非常相似、但我添加了 PWM 配置、以获取我要在 ADC 中读取的方波信号。 一旦完成、我可以在示波器中看到5kHz 产生的方波信号、但我在 ADC 读数中看到的结果与情况4、5和6非常相似、对 ADC 的计数没有意义。 我不知道那里发生了什么、因为如果我施加一个3V 或 GND 的恒定信号、ADC 会运行良好(例如、在3V 信号中进行连续最大计数)、那么问题在于该方波信号。 此外、我试图将由 PWM 生成的方波信号放入 ADC 中、并使用信号发生器生成5kHz 的方波信号、结果也是一样的。  

    这是 ADC 从由 TMS320F28388D 中的 PWM 或外部信号发生器器件生成的5kHz 方波读取的值。  我已经将该项目附加到您的附件中、以便您可以在您的 CCS 中更好地看到它

    我想知道会发生什么情况。 提前感谢

    佩德罗

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

    您好 Pedro:

    该示例使用了全部16个 SOC。  您只需要一个(SOC0)。 您仍然无法获得快速采样率、因为所有16个 SOC 都必须一个接一个地进行转换。 禁用 SOC 1-15并仅保留 SOC0、您应该得到一个相当高的波形转换分辨率。

    我会先使用信号发生器进行测试、然后再尝试使用 PWM。

    只需回答您发表第一篇文章的几个要点:

    -案例2、与第一个示例相同、但将  SOC0采样窗口[SYSCLK 计数]从10更改为200。 ADC 的结果与第一种情况非常相似(我不知道如果我更改此参数为什么不能获得更多或更少的样本)

    ADC 采样窗口是在转换过程开始之前 ADC 保持输入开关关闭以便为采样电容器充电的时长。 它不是采样率。 顺序如下:

    ePWM 将 SOCA 触发信号发送到 ADC > 2周期延迟>指定 SYSCLK 计数的 ADC 采样电容器电荷>采样开关打开/转换开始> ADC 在 ADCCLK 上转换(周期数在 TRM 中指定)>转换完成、触发 ADC 中断

    这是 ADC 转换的过程。 该序列的整个长度必须短于 ePWM 时间周期、否则将丢失触发信号。

    -案例3: 与第一个示例相同,但将 ADC 时钟预分频器更 改为 ADCCLK= CLKINPUT/2。 ADC 的结果与第一种情况非常相似

    对于 F2838x 器件而言、这是非法设置。 最小 ADCCLK 预分频器为4.0。  根据数据表、最大 ADCCLK 频率为50MHz。

    我还建议查看器件参考手册的 ADC 一章、尤其是有关 SOC 工作原理的部分。 并更详细地解释了其中的许多概念。

    此致、
    伊袋