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.

[参考译文] LAUNCHXL-F280049C:DCL 基准发生器

Guru**** 2595770 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1280133/launchxl-f280049c-dcl-reference-generator

器件型号:LAUNCHXL-F280049C

您好!

我一直在尝试按照用户指南文档中的说明使用 DCL 基准发生器来生成正弦波。

我正在从配置为10us 的 timer0的 ISR 中读取结果。 不过、我会一直得到一个常数值1、无论我尝试生成的波形如何、该值都没有变化。

我认为我正确地遵循了指南中的实施步骤、但我无法弄清为什么我始终得到结果1。

如果能就这一问题提供一些帮助,我将不胜感激。

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

    您能否粘贴您要用于生成参考信号的代码片段?

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

    尊敬的 Sira:

    我在下面附上了我的代码:

    //#############################################################################
    //
    // FILE:   empty_driverlib_main.c
    //
    //! \addtogroup driver_example_list
    //! <h1>Empty Project Example</h1> 
    //!
    //! This example is an empty project setup for Driverlib development.
    //!
    //
    //#############################################################################
    //
    //
    // $Copyright:
    // Copyright (C) 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"
    #include "board.h"
    #include "c2000ware_libraries.h"
    #include <DCL_refgen.h>
    
    // variable declarations
    DCL_REFGEN rgen = DCL_REFGEN_DEFAULTS;
    DCL_CSS rgen_css = DCL_CSS_DEFAULTS;
    
    int i;
    float32_t x;
    
    interrupt void ISRTimer0(void);
    void initTimer(void);
    
    //
    // Main
    //
    void main(void)
    {
    
        //
        // Initialize device clock and peripherals
        //
        Device_init();
    
        //
        // Disable pin locks and enable internal pull-ups.
        //
        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();
    
        //
        // PinMux and Peripheral Initialization
        //
        Board_init();
    
        //
        // C2000Ware Library initialization
        //
        C2000Ware_libraries_init();
    
        //
        // Enable Global Interrupt (INTM) and real time interrupt (DBGM)
        //
        EINT;
        ERTM;
        rgen.css = &rgen_css;
        DCL_SET_CONTROLLER_PERIOD(&rgen, 0.0001);
        DCL_resetRefgen(&rgen);
        DCL_setRefgenMode(&rgen, REFGEN_SINE);
        DCL_setRefgenFreq(&rgen, 50.0f, 0.0f);
        DCL_setRefgenAmpl(&rgen, 0.25f, 0.0f);
        //DCL_setRefgenRamp(&rgen, 0.15f, 0.01f);
    
        initTimer();
        while(1)
        {
    
        }
    }
    
    //
    // End of File
    //
    
    void initTimer(void)
    {
        Interrupt_register(INT_TIMER0, &ISRTimer0);
        SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER0);
        asm(" RPT #5 || NOP");
    
        CPUTimer_setPeriod (CPUTIMER0_BASE, 100000);
        CPUTimer_setPreScaler (CPUTIMER0_BASE, 0);
    
        CPUTimer_stopTimer(CPUTIMER0_BASE);
        CPUTimer_reloadTimerCounter(CPUTIMER0_BASE);
        CPUTimer_setEmulationMode(CPUTIMER0_BASE, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);
        CPUTimer_clearOverflowFlag(CPUTIMER0_BASE);
    
        /**< enable interrupt of the timer */
        CPUTimer_enableInterrupt(CPUTIMER0_BASE);
    
        /**< enable cpu interrupt number 13 for the timer 1 interrupt */
        Interrupt_enable(INT_TIMER0);
    
        /**< start timer */
        CPUTimer_startTimer(CPUTIMER0_BASE);
    }
    
    interrupt void ISRTimer0(void)
    {
        DCL_runRefgen(&rgen);
        i++;
        x = DCL_getRefgenPhaseA(&rgen);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    }
    

    我也在链接器文件中执行了此操作: dclfuncs:> RAMGS1、  page = 0

    谢谢。

    阿洛巴。

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

    请给我一天左右的时间来查看这篇文章并与您联系。 不幸的是、DCL 中目前没有这方面的示例、我还将尝试制定一个计划来创建一个示例。

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

    您好 Sira:

    我想轻轻提醒您、我热切地等待您的反馈。

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

    Atoba,

    我注意到您有

    DCL_SET_CONTROL_PERIOD (&rgen、0.0001);

    它对应于0.1ms、即100us、而您的 ISR 是10us。

    我认为您需要

    DCL_SET_CONTROL_PERIOD (&rgen、0.00001);

    如果这样不起作用,请尝试在  DCL_refgen.h 的 DCL_runRefgen()中放入一个断点,并检查 p->mode、p->theta、p->ya 的值。

    谢谢。

    Sira

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

    您好 Sira:

    我已经按照建议调整了 DCL_SET_CONTROL_PERIOD ()的参数,但到目前为止没有注意到任何变化。 我已经从 DCL_refgen.h 以5个不同的间隔在 DCL_runRefgen ()中捕获了"p"值的快照,并将其附加。

    可能我缺少某些内容或无法正确理解这些内容。

    谢谢!

    阿洛巴。

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

    因此、模式看起来是正确的(2 = REFGEN_Sine)、θ 值似乎正在按预期更新。 但每种情况下 ya 为1、这是错误的。

    您的项目中是否启用了 TMU? 您能否在这里放置断点、在反汇编视图中查看生成的代码并查看是否生成了 SINPUF32?

    #ifdef _TMS320C28XX_TMU__
          p->ya =__sinpuf32 (p->theta)
        #else
          p->ya = sinf (const_2pi_32 * p->theta);
        #endif

    谢谢。

    Sira

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

    您好 Sira:

    TMU0启用、这里是反汇编输出。

    此致、
    阿洛巴

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

    Atoba,

    请按照00e26a 至00e274的说明进行操作、并查看 ACC、R0H 等的相应数值来了解具体内容。 这可能会提示为什么 θ 不为零、但 ya 为1。

    谢谢。

    Sira  

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

    我已按照说明进行操作、并检查 ACC 或 R0H 参数是否有任何变化、但我没有找到任何变化。

    此外、我必须承认、虽然指令是汇编语言的、但我完全不理解语言以及我在反汇编器中看到的大部分内容。

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

    Atoba,

    我的意思是、在您逐步执行代码00e26a 至00e274时进行检查。 请发送 CCS 中的寄存器视图窗口的屏幕截图、其中包含这些(acc、r0h)以及 p->theta、p->ya。