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.

[参考译文] TMS320F2.8379万D:添加两个正弦波

Guru**** 2582405 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/653678/tms320f28379d-adding-two-sine-waves

部件号:TMS320F2.8379万D
主题中讨论的其他部件:C2000WARE

大家好,

是否有人尝试使用F2.8379万D添加两个正弦波? 控制套件中是否有任何示例?

我想这可能是模拟传感器读数的第一个动作,用来分析其正弦波的FFT。

任何帮助都将很有帮助。 非常感谢。

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

    很抱歉,您的帖子延迟回复。 这应该是一个简单的事情,但我不记得任何代码示例,其中两个正弦波被加在一起。 C2000Ware的SGEN库中有一个双通道(定点)正弦波发生器,这可能会有所帮助。 很抱歉,目前没有更多产品可供选择。

    此致,

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

    您好,Richard:

    我找到了一个显示两个不同频率的正弦波的示例,但恐怕它不能支持F28.3779万D板。 这是它的屏幕截图。

    非常感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对不起,两个正弦波的频率相同,但相位不同。 这与我想要的有点不同,但它可能会有所帮助。 但是,我想它不适用于我正在使用的主板。 是这样吗?
    非常感谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ellen:

    是的,不幸的是,这就是我们目前拥有的一切。 SGEN库的浮点版本在我们的待办事项中,但我不能告诉您它何时准备就绪。

    如果你准备好设置和计算你需要的角度,你总是可以调用sin ()。 您正在使用的设备具有TMU,它支持硬件中的正弦,因此周期开销非常小。 确保在CCS项目设置中启用了TMU (CCS内部版本- C2000编译器-处理器选项)。

    再次,很抱歉没有更多。

    此致,

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

    您好,Richard:

    感谢您的支持,我已使用TMU示例从控制套件中生成正弦波,它运行良好。 下一个点是生成两个正弦波。 我的问题是:使用TMU是否可能做到这一点?

    再次感谢你们!

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

    您好,Ellen:

    是的;要执行此操作,您需要为另一个阶段配置和维护第二个软件角度计数器,以相同的方式调用sin()。  您的代码必须计算所需的任何相位偏移或调制。  遗憾的是,我无法向您指出一个例子。  我希望它能奏效。

    此致,

    Richard

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

    您好,Richard:

    正如您所说,我正在尝试在TMU上实施两个正弦波,但我遇到了问题。 我想这是关于RAM大小或链接的问题。 正如你在下面的代码中看到的,我刚刚为第二个正弦波创建了一个在其名称末尾带有“A”的变量,我将频率更改为250 MHz。 我截取了这些问题的屏幕截图。

    您能帮我吗?  

     

    再次感谢Richard,您是一位出色的导师。

    ----------------------------------

    #include <mathing.h>

    #include <stdio.h>

    #include "F28x_Project.h"

    #define  vector_size   1024

    #define  vector_Sizea  1024

    #Define  MAX_ARG      1.0

    #Define  Min_ARG      -1.0

    #define  profile_FREQ  200  //以MHz为单位指定

    #define  profile_FREQa  250  //以MHz为单位指定

    #define  profile_per   1000  //以微秒为单位指定

    #define  two_pi      6.28.3185万307179586476925286766559</xmt-block>30.7179万</s>58.6476万 92.5286万76.6559万

    #define  tolerance    1.0e-6

    #define  start_timer (x){                   \

                   X = CpuTimer1Regs.TIM.all;    \

                   CpuTimer1Regs.tcr.bit.ts = 0;  \

                 }

    #define  start_TIMERA (y){                   \

                   Y = CpuTimer2Regs.TIM.all;    \

                   CpuTimer2Regs.tcr.bit.ts = 0;  \

                   }

    #define  stop_timer (x) {                   \

                   CpuTimer1Regs.tcr.bit.ts = 1;  \

                   X = CpuTimer1Regs.TIM.all;    \

                   CpuTimer1Regs.tcr.bit.trb = 1; \

                  }

    #define  stop_TIMERA (y) {                   \

                   CpuTimer2Regs.tcr.bit.ts = 1;  \

                   Y = CpuTimer2Regs.TIM.all;    \

                   CpuTimer2Regs.tcr.bit.trb = 1; \

                  }

    uINT16_t pass=0;

    UINT16_t失败=0;

    浮点输入矢量[vector_size];

    浮点输入Vectora[vector_Sizea];

    浮点rtsOutput[vector_size];

    浮点rtsOutputa[vector_Sizea];

    浮点tmuOutput[vector_size];

    浮点tmuOutputa[vector_Sizea];

    浮点错误矢量[vector_size];

    浮点errorVectora[vector_Sizea];

    浮点tickRTS,ticktMU,timeRTS, timeTMU;

    float ticksRTSa,ticksTMUa,timeRTSa, timeTMUa;

    浮点maxError;

    浮点maxErrora;

    void genInputVector (float *输入矢量,Int16_t大小);

    void genInputVectora (float *inputVectora,Int16_t size);

    float genErrorVector (float *rtsOutput,float *tmuOutput,

              浮点*errorVector,Int16_t大小);

    float genErrorVectora(float *rtsOutputa, float *tmuOutputa,

              float *errorVectora,Int16_t大小);

    浮点RTS_RunTest(浮点*inputVector,浮点*rtsOutput,

             Int16_t大小);

    float rts_runTesta (float *inputVectora, float *rtsOutputa,

             Int16_t大小);

    FLOAT TMU_RunTest(float *inputVector,float *tmuOutput,

            Int16_t大小);

    float tmu_runTesta (float *inputVectora, float *tmuOutputa,

             Int16_t大小);

    Void主(void)

      InitSysCtrl();

      色调;

      InitPieCtrl();

      IER = 0x0000;

      IFR = 0x0000;

      InitPieVectorTable();

      InitCpuTimers();

      ConfigCpuTimer(&CpuTimer1, profile_FREQ, profile_PER);

      ConfigCpuTimer(&CpuTimer2, profile_FREQ, profile_per;

      EINT; //启用全局中断INTM

      ERTM; //启用全局实时中断DBGM

      genInputVector (输入矢量,矢量大小);

      genInputVectora(inputVectora, vector_Sizea);

      tickRTS = RTS_RunTest (输入矢量,rtsOutput,矢量大小);

      ticksRTSa = rts_runTesta (inputVectora,rtsOutputa,vector_Sizea);

      ticksTMU = TMU_RunTest (输入矢量,tmuOutput,vector_size);

      ticksTMUa = TMU_runTesta (inputVectora,tmuOutputa,vector_Sizea);

      maxError = genErrorVector (rtsOutput,tmuOutput,errorVector,vector_size);

      maxErrora = genErrorVectora(rtsOutputa, tmuOutputa, errorVectora, vector_Sizea);

      timeRTS = tickRTS *(1.0 /配置文件_FREQ);

      timeRTSa = tickRTSa *(1.0 /配置文件FREQa);

      timeTMU = tickTMU *(1.0 /配置文件_FREQ);

      TimeTMUa = tickTMUa *(1.0 / PROGE_FREQa);

      printf ("执行结果\n");

      printf ("RTS时间:%10.6f us\n",timeRTS);

      printf ("TMU时间:%10.6f us\n",timeTMU);

      printf ("RTS时间:%10.6f us\n",timeRTSa);

      printf ("TMU时间:%10.6f us\n",timeTMUa);

    }

    void genInputVector (float *输入矢量,Int16_t大小)

      Int16_t i;

      浮动步长=(MAX_ARG - MIN_ARG)/大小;

      InputVector[0]= min_ARG;

      对于(i = 1;i <大小;I++)

      {

        inputVector [i]= inputVector [I-1]+ step;

      }

    }

    void genInputVectora (float *inputVectora,Int16_t大小)

      Int16_t i;

      浮动步长=(MAX_ARG - MIN_ARG)/大小;

      inputVectora[0]= min_arg;

      对于(i = 1;i <大小;I++)

      {

        inputVectora[i]= inputVectora[I-1]+ step;

      }

    }

    float genErrorVector (float *rtsOutput,float *tmuOutput,

              浮点*errorVector,Int16_t大小)

      Int16_t i;

      浮点maxError =-maxError; 1.0

      对于(i = 0;i <大小;I++)

      {

        errorVector[i]= fabs(rtsOutput[i]- tmuOutput[i]);

        IF (errorVector [i]> maxError)

        {

          maxError = errorVector[i];

        }

        IF (errorVector [i]<容差)

        {

          pass++;

        }

        否则

        {

          失败++;

        }

      }

      Return (maxError);

    }

    float genErrorVectora(float *rtsOutputa, float *tmuOutputa,

              float *errorVectora,Int16_t大小)

      Int16_t j;

      浮点maxErrora =-Errora; 1.0

      对于(j = 0;j <大小;j++)

      {

        errorVectora[j]= fabs(rtsOutputa[j]- tmuOutputa[j]);

        IF (errorVectora[j]> maxErrora)

        {

          maxErrora = errorVectora[j];

        }

        IF (errorVectora[j]<容差)

        {

          pass++;

        }

        否则

        {

          失败++;

        }

      }

      Return (maxErrora);

    }

    浮点RTS_RunTest(浮点*inputVector,浮点*rtsOutput,

             Int16_t大小)

      Int16_t i;

      FLOAT START_TIME = 0.0 ;

      float stop_time = 0.0 ;

      START_TIMER (START_TIME);

      对于(i = 0;i <大小;I++)

      {

        rtsOutput[i]= sin (inputVector [i]* two_pi);

      }

      STOP_TIMER (STOP_TIME);

      返回(start_time - stop_time);

    }

    float rts_runTesta (float *inputVectora, float *rtsOutputa,

             Int16_t大小)

      Int16_t i;

      FLOAT START_TIME = 0.0 ;

      float stop_time = 0.0 ;

      START_TIMERA (START_TIME);

      对于(i = 0;i <大小;I++)

      {

        rtsOutputa[i]= sin (inputVectora[i]* two_pi);

      }

      STOP_TIMERA (STOP_TIME);

      返回(start_time - stop_time);

    }

    FLOAT TMU_RunTest(float *inputVector,float *tmuOutput,

             Int16_t大小)

      Int16_t i;

      FLOAT START_TIME = 0.0 ;

      float stop_time = 0.0 ;

      START_TIMER (START_TIME);

      对于(i = 0;i <大小;I++)

      {

        tmuOutput[i]=_sinpuf32 (inputVector [i]);

      }

      STOP_TIMER (STOP_TIME);

      返回(start_time - stop_time);

    }

    float tmu_runTesta(float *inputVector1,float *tmuOutputta,

             Int16_t大小)

      Int16_t j;

      FLOAT START_TIME = 0.0 ;

      float stop_time = 0.0 ;

      START_TIMERA (START_TIME);

      对于(j = 0;j <大小;j++)

      {

        tmuOutputa[j]=_sinpuf32(inputVectora[j]);

      }

      STOP_TIMERA (STOP_TIME);

      返回(start_time - stop_time);

    }

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

    我将矢量大小更改为512,它解决了我的问题。

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

    Ellen,

    很高兴知道您找到并解决了问题。  感谢您告知我们。  

    现在,您将知道当您将8个浮点矢量的长度设为1024时,它们消耗16 K字(每个浮点变量消耗两个16位字),但GS2 - GS4 RAM块只包含12 K字。  矢量长度减半可将您的总需求减少到8 K字,因此现在矢量可以舒适地适应。  如果您以后需要更多分辨率,另一个解决方案是返回到1024长度向量,并通过添加GS5 (可能还有GS6)为.ebss分配更多内存。

    此致,

    Richard

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

    Richard

    这是否是按照您的建议为.BSS分配更多内存的正确方法? 另外,使用CpuTimer0是否有任何问题?  

    成就:我实施了第三个变量,这是两个正弦波的结果。

    问题:我不得不将内存减少到256,因为现在我有24个矢量浮动。

    是否有任何建议可以使用更少的内存?

    再次感谢!

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

    Ellen,

    是的,如果您尚未将GS5和GS6分配给其他任何设备,您所做的工作将有效。 或者,您可以在链接程序文件的内存部分创建单个命名部分(如“RAMGS2_GS6”),并按名称引用该部分,这实际上是相同的。

    ebss部分用于所有全局变量存储,因此,除了向量外,它还用于maxError,PASS,FAIL,...等内容,并且始终比向量大小的总和大一些。  如果需要,可以使用data_section pragma将引导程序分配到特定的命名内存段(有关详细信息,请参阅C编译器用户指南)。  此设备上有足够的内存,因此您可以一直添加4K GS块,直到GS15,并返回到1024长度向量。

    CPU计时器应该没有任何问题-您看到了问题吗?

    此致,

    Richard

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

    我尝试添加15个GS块,但在我看来,它们不适合长度达256的24个浮点向量。 正如您所提到的,我阅读了data_section,但它没有多少关于如何实施的信息。

    你能给我一个线索来说明它和/或如何命名内存中的部分吗?

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

    您好,Ellen:

    您应该能够将所有24个向量分配到这些GS内存块中。 我认为最干净的方法是将它们合并到一个命名的内存段中,并使用它来容纳矢量。 链接程序命令文件可能如下所示:

    内存

    ...

    第1页:
    RAMGS2_GS4:原点= 0x00E000,长度= 0x0.3万
    RAMGS5_GS15:原点= 0x1.1万,长度= 0x00B000
    ...
    }

    章节

    ...
    .ebss:> RAMGS2_GS4,页= 1
    SineVecsSection:> RAMGS5_GS15,page =1.
    ...
    }

    此选项保留三个GS部分作为.ebbs,另有11个部分作为引导程序。   然后,在代码中,使用以下#pragma将每个引导程序连接到相同的命名部分:

    #define vector_length 256

    #pragma data_section(vectra 1,"SineVecsSection")
    float vectra 1[vector_length];

    #pragma data_section (矢量2,"SineVecsSection)
    float vectra 2[vector_length];

    ………………………………………………… 必须为每个矢量使用单独的pragma。   

    我希望这能有所帮助。

    此致,

    Richard

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

    您好,Richard:

    我一直在尝试了解CCS图如何在时间和频率域上工作。 作为这个项目的一部分,我绘制了两个正弦波之和的结果,分别为60Hz和300Hz,但我不明白水平和垂直轴的含义。 请你给我一个手吗?  

    希望很快能收到您的回复。  

     

     

    再次感谢Richard。

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

    您好,Ellen:

    是的,您当然可以像您那样分配.ebss部分。  您仍有大量未使用的GS内存可用。

    您收到的错误是什么(我无法在屏幕截图中看到所有文本)?  CPU计时器0是否出现问题?

    此致,

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ellen:
    抱歉,我对论坛界面感到困惑,并回复了错误的帖子! 让我看看您的CCS问题并回复给您。 谢谢。
    此致,
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Richard:

    没关系。 我想知道轴x和y使用什么单位。 对于时间域,我将x设置为以秒为单位显示,但在频率域中我没有线索。 我刚刚在频率域中设置为以kHz显示,这就是我所拥有的全部。 有任何线索? 再次感谢您的关注。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ellen:
    这些图形对我来说是正确的。 在图形属性窗口中,采样率设置为1Hz。 因此,无论正弦波的实际频率如何,CCS都将在时间窗口中看到它们,就像它们是以该速率采样一样。 在"Single Time -2"(单个时间-2)窗口中,一个波形的周期约为500秒,另一个波形的周期约为210秒。 这些峰值对应于FFT幅度图中分别在2e-3Hz和4.8e-3Hz时看到的峰值。 问题是否只是未输入采样率?
    此致,
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,Richard,

    我尝试将采样率设置为60 Hz,但没有发现太大差异。 是否有办法设置这些 图形以 更好地理解它们?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ellen:
    抱歉,我想我没有关注。 采样信号的速率是多少?
    此致,
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Richard

    我将引导程序设置为如下所示:

    我尝试的采样速率是60 Hz,在你提醒我该速率被设置为1 Hz后。 您对如何显示这些信号有什么建议吗?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ellen:
    我认为关键是采样率。 您能描述一下我们在时间图中看到的信号是什么吗? 我知道它们是两个正弦波的总和,分别为60Hz和300Hz,但是它们是否在内存中的数据文件中采样? 我们需要的信息是每个60Hz正弦波周期有多少个样品。 一旦我们将数字乘以60,就会得出以Hz为单位的采样率。
    例如,在60Hz时对60Hz正弦波进行采样毫无意义-每个周期将有一个采样,因此我们只能看到一个直流电平。 我认为这就是CCS图没有意义的原因。
    此致,
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Richard

    你说得对,在 60赫兹的60赫兹正弦波中,这不是合理的采样。

    我们所看到的是一个具有1024个值的矢量,这是由具有不同频率的两个矢量所传输的。 请参阅下面的屏幕截图,看看是否有意义。 我们使用不同的频率来为CPU计时器,TMU和RTS例程提供数据。

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

    您好,Ellen:

    感谢您发送代码。  跟随时有点困难,但排队...

    tmuOutputr[k]= tmuOutput[k]+tmuOutputta[k];

    ...seems对两个正弦向量求和,每个正弦向量长度为1024个数据点。  我猜顶部的genInputVectorX()函数是引导程序初始化的位置吗?  那么,您如何加载这些?  我正在寻找频率与数据点数量的关系。  谢谢。

    此致,

    Richard

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

    Richard

    我很抱歉提供了这些信息,我是CCS的新用户,我使用的是德州仪器(TI)早期开发的代码。 我也在学习。  

    我认为,当矢量准备就绪时,TMU和RTS执行,正如你可以看到的那样,下面使用tmuOutputr的函数是tickTMUr,然后timeTMUr使用tickTMUr,其频率是在代码开头设置的。

    希望这会有所帮助。 谢谢!

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ellen:
    “tickTMUr”是通过向量和运行所用的时钟周期的测量时间。 它由tmu_runTestr()在最后一行返回:
    返回(START_TIME - STOP_TIME);
    变量"timeTMUr"是以秒为单位执行该操作的物理时间。 代码中的某个位置还有另一条信息,用于确定哪些数据进入"tmuOutput"和"tmuOutputa"数组。 这正是我们需要的。
    您能否查看一下代码,看看是否有明显的内容? 我猜是在"genInputVector()"和"genInputVectora()"函数中。 非常感谢。
    此致,
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Richard

    你是对的。 tmuOutputr中的内容是genInputVector()。

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

    您能否发送"RTS_runTesta"和"RTS_runTestr"函数? 很抱歉发布了很多帖子-我想我现在正在关注它。

    此致,

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

    您好,Richard:

    当然。 再次感谢!

    下面是所有代码:

    P.s.:你想要的是粗体.

    //
    //包含的文件
    //
    #include <mathing.h>
    #include <stdio.h>
    #include "F28x_Project.h"

    //
    //定义
    //


    #define vector_size 1024
    #Define MAX_ARG 1.0
    #define MIN_ARG - 1.0
    #define profile_FREQ 0.0.0006万 //以MHz为单位指定
    #define profile_FREQa 0.0003 //以MHz为单位指定
    #define profile_FREQr 0.0.0006万 //以MHz为单位指定
    #define profile_per 100万 //以微秒为单位指定
    #define two_pi 6.28.3185万307179586476925286766559</xmt-block>30.7179万</s>58.6476万 92.5286万76.6559万
    #define tolerance 1.0e-6

    #define start_timer (x){\
    X = CpuTimer1Regs.TIM.all;\
    CpuTimer1Regs.tcr.bit.ts = 0;\
    }

    #define start_TIMERA (y){\
    Y = CpuTimer0Regs.TIM.all;\
    CpuTimer0Regs.tcr.bit.ts = 0;\
    }

    #define start_TIMER(r){\
    R = CpuTimer2Regs.TIM.all;\
    CpuTimer2Regs.tcr.bit.ts = 0;\
    }

    #define STOP_TIMER (x){\
    CpuTimer1Regs.tcr.bit.ts = 1;\
    X = CpuTimer1Regs.TIM.all;\
    CpuTimer1Regs.tcr.bit.trb = 1;\
    }

    #define STOP_TIMERA (y){\
    CpuTimer0Regs.tcr.bit.ts = 1;\
    Y = CpuTimer0Regs.TIM.all;\
    CpuTimer0Regs.tcr.bit.trb = 1;\
    }

    #define stop_TIMER(r){\
    CpuTimer2Regs.tcr.bit.ts = 1;\
    R = CpuTimer2Regs.TIM.all;\
    CpuTimer2Regs.tcr.bit.trb = 1;\
    }
    //
    //全局
    //
    uINT16_t pass=0;
    UINT16_t失败=0;

    浮点输入矢量[vector_size];
    浮点输入Vectora[vector_size];
    浮点输入Vectorb[vector_size];
    浮点输入Vectorr[vector_size];
    浮点rtsOutput[vector_size];
    浮点rtsOutputa[vector_size];
    浮点rtsOutputb[vector_size];
    浮点rtsOutputr[vector_size];
    浮点tmuOutput[vector_size];
    浮点tmuOutputa[vector_size];
    浮点tmuOutputr[vector_size];
    浮点错误矢量[vector_size];
    浮点errorVectora[vector_size];
    浮点errorVectorr[vector_size];
    浮点tickRTS,ticktMU,timeRTS,timeTMU;
    float ticksRTSa,ticksTMUa,timeRTSa,timeTMUa;
    float ticksRTSr, ticktmur, timeRTSr, timeTMUr;
    浮点maxError;
    浮点maxErrora;
    浮点maxErrorr;

    //
    //函数原型
    //
    void genInputVector (float *输入矢量,Int16_t大小);
    void genInputVectorr (float *inputVectorr,Int16_t size);
    void genInputVectora (float *inputVectora,Int16_t size);
    float genErrorVector (float *rtsOutput,float *tmuOutput,
    浮点*errorVector,Int16_t大小);
    float genErrorVectora(float *rtsOutputa, float *tmuOutputa,
    float *errorVectora,Int16_t大小);
    float genErrorVectorr (float *rtsOutputr,float *tmuOutputr,
    float *errorVectorr,Int16_t大小);
    浮点RTS_RunTest(浮点*inputVector,浮点*rtsOutput,
    Int16_t大小);
    float rts_runTesta (float *inputVectora, float *rtsOutputa,
    Int16_t大小);
    float rts_runTestr(float *inputVectorr,float *rts Outputr,
    Int16_t大小);
    FLOAT TMU_RunTest(float *inputVector,float *tmuOutput,
    Int16_t大小);
    float tmu_runTesta (float *inputVectora, float *tmuOutputa,
    Int16_t大小);
    float tmu_runTestr(float *inputVectorr,float *tmuOutputrt,
    Int16_t大小);
    //
    //主菜单
    //
    Void主(void)

    //
    //步骤1. 初始化系统控制:
    // PLL,看门狗,启用外设时钟
    //此示例函数可在F2837xD_sysctrl.c文件中找到。
    //
    InitSysCtrl();

    //
    //步骤2. 清除所有中断并初始化PIE矢量表:
    //禁用CPU中断
    //
    色调;

    //
    //将PIE控件寄存器初始化为其默认状态。
    //默认状态是禁用所有PIE中断和标志
    //被清除。
    //此函数位于F2837xD_PIECTRL.c文件中。
    //
    InitPieCtrl();

    //
    //禁用CPU中断并清除所有CPU中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;

    //
    //使用指向外壳中断的指针初始化PIE矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使中断也是如此
    //在本例中不使用。 这对于调试非常有用。
    // shell ISR例程位于F2837xD_DefaultIsr.C.中
    //此函数位于F2837xD_PieVect.C.中
    //
    InitPieVectorTable();

    //
    //步骤3. 配置用于分析TMU和RTS例程的计时器
    //
    InitCpuTimers();
    ConfigCpuTimer(&CpuTimer1, profile_FREQ, profile_PER);
    ConfigCpuTimer(&CpuTimer0, profile_FREQ, profile_per;
    ConfigCpuTimer(&CpuTimer2, profile_FREQr, profile_per;
    //
    //步骤4. 启用全局中断和更高优先级的实时调试事件:
    //
    EINT;//启用全局中断INTM
    ERTM;//启用全局实时中断DBGM

    //
    //步骤5. 运行测试,生成输入向量,调用RTS/TMU
    //例程,获取错误矢量,最后打印执行时间。
    //
    genInputVector (输入矢量,矢量大小);
    genInputVectora (inputVectora,vector_size);
    genInputVectorr(inputVectorr, vector_size);
    tickRTS = RTS_RunTest (输入矢量,rtsOutput,矢量大小);
    ticksRTSa = rts_runTesta (inputVectora,rtsOutputa,vector_size);
    ticksRTSr = rts_runTestr (inputVectorr,rtsOutputr,vector_size);
    ticksTMU = TMU_RunTest (输入矢量,tmuOutput,vector_size);
    ticksTMUa = TMU_runTesta (inputVectora,tmuOutputa,vector_size);
    ticksTMUr = TMu_runTestr(inputVectorr, tmuOutputr, vector_size);
    maxError = genErrorVector (rtsOutput,tmuOutput,errorVector,vector_size);
    maxErrora = genErrorVectora(rtsOutputa, tmuOutputa, errorVectora, vector_size);
    maxErrorr = genErrorVectorr (rtsOutputr,tmuOutputr,errorVectorr,vector_size);
    timeRTS = tickRTS *(1.0 /配置文件_FREQ);
    timeRTSa = tickRTSa *(1.0 /配置文件FREQa);
    timeRTSr = tickRTSr *(1.0 /配置文件频率);
    timeTMU = tickTMU *(1.0 /配置文件_FREQ);
    TimeTMUa = tickTMUa *(1.0 / PROGE_FREQa);
    timeTMUr = tickTMUr *(1.0 /配置文件频率);
    //
    //要使用printf语句,请为.cio,.sysmem部分分配空间,
    //增加属性中.text,stack和heap部分的分配
    //和链接程序命令文件。
    //
    printf ("执行结果\n");
    printf ("RTS时间:%10.6f us\n",timeRTS);
    printf ("TMU时间:%10.6f us\n",timeTMU);
    printf ("RTS时间:%10.6f us\n",timeRTSa);
    printf ("TMU时间:%10.6f us\n",timeTMUa);
    printf ("RTS时间:%10.6f us\n",timeRTSr);
    printf ("TMU时间:%10.6f us\n",timeTMUr);
    }

    //
    // genInputVector -生成输入矢量数组
    //

    void genInputVector (float *输入矢量,Int16_t大小)

    Int16_t i;
    浮动步长=(MAX_ARG - MIN_ARG)/大小;

    InputVector[0]= min_ARG;
    对于(i = 1;i <大小;I++)

    inputVector [i]= inputVector [I-1]+ step;
    }
    }
    void genInputVectora (float *inputVectora,Int16_t大小)

    Int16_t i;
    浮动步长=(MAX_ARG - MIN_ARG)/大小;

    inputVectora[0]= min_arg;
    对于(i = 1;i <大小;I++)

    inputVectora[i]= inputVectora[I-1]+ step;
    }
    }


    void genInputVectorr (float *inputVectorr,Int16_t大小)

    Int16_t i;
    浮动步长=(MAX_ARG - MIN_ARG)/大小;

    inputVectorr[0]= min_arg;
    对于(i = 1;i <大小;I++)

    inputVectorr[i]= inputVectorr[I-1]+ step;
    }
    }

    //
    // genErrorVector -生成错误矢量数组
    //

    float genErrorVector (float *rtsOutput,float *tmuOutput,
    浮点*errorVector,Int16_t大小)

    Int16_t i;
    浮点maxError =-maxError; 1.0

    对于(i = 0;i <大小;I++)

    errorVector[i]= fabs(rtsOutput[i]- tmuOutput[i]);
    IF (errorVector [i]> maxError)

    maxError = errorVector[i];
    }
    IF (errorVector [i]<容差)

    pass++;
    }
    否则

    失败++;
    }
    }

    Return (maxError);
    }

    float genErrorVectora(float *rtsOutputa, float *tmuOutputa,
    float *errorVectora,Int16_t大小)

    Int16_t j;
    浮点maxErrora =-Errora; 1.0

    对于(j = 0;j <大小;j++)

    errorVectora[j]= fabs(rtsOutputa[j]- tmuOutputa[j]);
    IF (errorVectora[j]> maxErrora)

    maxErrora = errorVectora[j];
    }
    IF (errorVectora[j]<容差)

    pass++;
    }
    否则

    失败++;
    }
    }

    Return (maxErrora);
    }

    float genErrorVectorr (float *rtsOutputr,float *tmuOutputr,
    float *errorVectorr,Int16_t大小)

    Int16_t i;
    浮点maxErrorr =- 1.0 ;

    对于(i = 0;i <大小;I++)

    errorVector[i]= fabs(rtsOutputr[i]- tmuOutputr[i]);
    IF (errorVectorr[i]> maxErrorr)

    maxErrorr = errorVectorr[i];
    }
    IF (errorVectorr[i]<容差)

    pass++;
    }
    否则

    失败++;
    }
    }

    return (maxErrorr);
    }
    //
    // RTS_RunTest -执行SIN生成测试(C28)
    //

    浮点RTS_RunTest(浮点*inputVector,浮点*rtsOutput,
    Int16_t大小)

    Int16_t i;
    FLOAT START_TIME = 0.0 ;
    float stop_time = 0.0 ;

    START_TIMER (START_TIME);
    对于(i = 0;i <大小;I++)

    rtsOutput[i]= sin (inputVector [i]* two_pi);
    }
    STOP_TIMER (STOP_TIME);

    返回(start_time - stop_time);
    }

    float rts_runTesta (float *inputVectora, float *rtsOutputa,
    Int16_t大小)

    Int16_t i;
    FLOAT START_TIME = 0.0 ;
    float stop_time = 0.0 ;

    START_TIMERA (START_TIME);
    对于(i = 0;i <大小;I++)

    rtsOutputa[i]= sin (inputVectora[i]* two_pi);
    }
    STOP_TIMERA (STOP_TIME);

    返回(start_time - stop_time);
    }

    float rts_runTestr(float *inputVectorr,float *rts Outputr,
    Int16_t大小)

    Int16_t i;
    FLOAT START_TIME = 0.0 ;
    float stop_time = 0.0 ;

    START_TIMERr (START_TIME);
    对于(i = 0;i <大小;I++)

    rtsOutputr[i]= sin (inputVectorr[i]* two_pi);
    }
    STOP_TIMERr (STOP_TIME);

    返回(start_time - stop_time);
    }
    //
    // TMU_RunTest -执行SIN生成测试(TMU)
    //

    FLOAT TMU_RunTest(float *inputVector,float *tmuOutput,
    Int16_t大小)

    Int16_t i;
    FLOAT START_TIME = 0.0 ;
    float stop_time = 0.0 ;

    START_TIMER (START_TIME);
    对于(i = 0;i <大小;I++)

    tmuOutput[i]=_sinpuf32 (inputVector [i]);
    }

    STOP_TIMER (STOP_TIME);

    返回(start_time - stop_time);
    }

    float tmu_runTesta (float *inputVectora, float *tmuOutputa,
    Int16_t大小)

    Int16_t j;
    FLOAT START_TIME = 0.0 ;
    float stop_time = 0.0 ;

    START_TIMERA (START_TIME);
    对于(j = 0;j <大小;j++)

    tmuOutputa[j]=__sinpuf32(inputVectora[j]+inputVectora[j]);
    }

    STOP_TIMERA (STOP_TIME);

    返回(start_time - stop_time);
    }

    float tmu_runTestr(float *inputVectorr,float *tmuOutputrt,
    Int16_t大小)

    Int16_t k;
    FLOAT START_TIME = 0.0 ;
    float stop_time = 0.0 ;

    START_TIMERr (START_TIME);
    对于(k = 0;k <大小;k++)

    tmuOutputr[k]= tmuOutput[k]+tmuOutputta[k];
    }

    STOP_TIMERr (STOP_TIME);

    返回(start_time - stop_time);
    }
    //
    //文件结束
    //

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

    您好,Ellen:

    很抱歉耽误您的时间和多个帖子。

    程序生成两个大小为1024的数组,其中包含正弦曲线数据。 一个数组正好包含两个数据句点(tmuOutput),而另一个数组包含四个句点(tmuOutputa)。 这些数组在函数"TMU_runTestr()"中求和。 您在之前发布的时间图表中看到的是这两个波形(tmuOutputr)的总和,您可以看到它们的频率之间的关系是2:1,如预期。 因此,它们不能代表60Hz和300Hz的波形。

    该程序不会对任何事物进行物理采样,因此数据与时间或频率没有明确的关系,但如果我们假设较低的频率代表60Hz,我们在1024阵列中有两个时间段的数据, 或每秒1/60的512个采样,因此我们的采样周期大约是32.55 Us,而我们的采样率是30.72 kHz。 这是CCS图窗口中所需的数字。 您能否尝试一下,让我知道FFT幅度图是否更有意义? 我们应该看到60Hz和120Hz的峰值。 谢谢。

    此致,

    Richard