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.

[参考译文] 编译器/TMS320F28069M:IQMath 问题

Guru**** 2540720 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/596505/compiler-tms320f28069m-iqmath-problem

器件型号:TMS320F28069M
Thread 中讨论的其他器件:controlSUITE

工具/软件:TI C/C++编译器

大家好!

 我的#include 有问题 库。 目前、我使用的是 Launchpad F28069M、想法是我需要计算弧度中某些变量的正弦和余弦。 但 IQmath 库并不容易理解。

我的角度值表示为2*pi*w,并且必须在 一段时间内更新 w 数次(w 将介于10和10000之间)。 (这是为了在我的代码中应用 FFT)

我希望有人举例说明如何 应用 IQmath 库的正弦和余弦、以便我可以根据我的代码进行调整。

提前感谢您的帮助!

Maria  

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

    尊敬的 Maria:

    对于基本 IQmath 函数的示例、我只能指向快速入门指南(随附)中的代码示例。 正弦和余弦函数需要以弧度为单位的输入、您必须保持在所选 IQ 格式的数字范围内。  例如、w = 10000时、您将传递的值为62832、因此您的 IQ 格式将至少需要16位范围(2^16 = 65536)。  这将限制您使用 IQ15或更低。

    您的输入数据(w)是否已经采用 IQ 格式?

    此致、

    Richard

    e2e.ti.com/.../6136.IQmath_5F00_Quickstart.pdf

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

    感谢您的支持、有更简单的方法来实现它? 我尝试了 math.h、我所输入的值无关紧要、我有相同的答案、也尝试了一些 IQmath 示例、它们还给出了一些输出值的数字、这些数字真的很大、对我来说毫无意义 (甚至将它们从 IQ 更改为浮点)然后我也尝试了 CLAmath、但没有成功。

    主要思路是仅根据振幅为1的可变 WP 生成正弦和余弦函数。 然后、我希望具有以下值:

    sin (2*pi*w)和 cos (2*pi*w)

    我拥有的变量尚未采用 IQ 格式、但如果您能告诉我一种更简单的方法来实现它、我将不胜感激(不能在 IQmath 中对此进行详细介绍、这有点复杂)

    提前感谢您的帮助

    此致

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

    尊敬的 Maria:

    这样做应该相当简单。  将 IQmath 库添加到项目后、您可以在程序中尝试以下操作:

    //变量
    _iq twopi =_IQ (6.283185307f);
    _iq sval =_IQ (0.0f);
    _iq cval =_IQ (0.0f);
    _IQ ref =_IQ (0.0f);
    _IQ inc =_IQ (0.01f);
    _IQ 角度=_IQ (0.0f);
    长 I;

    MAIN ()

    对于(i=0;i<9999;i++)

    角度=_IQmpy (twopi、ref);
    sval =_IQsin (角度);
    cval =_IQcos (角度);
    Ref += inc;

    ...等等

    如果我在最后一行("ref += inc;")上设置断点、它会很好地穿过角度。  您可以更改"inc"以更改正弦/余弦输出的频率、这显然是全局_IQ 格式(我使用的是 IQ24)。  附件是我在观察窗口中看到的内容。

    不涉及 IQmath 的另一种方法是使用 FastRTS 库、您可以在 controlSUITE 中找到该库。  正弦和余弦函数的周期计数与 IQmath 对应函数大致相同、如果需要、您将能够将所有内容保持在浮点模式。

    我希望这对您有所帮助、但如果您有进一步的问题、请务必发帖。

    此致、

    Richard

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

    尊敬的 Richard

    谢谢你们的回应、我不明白发生了什么、但现在我有33个与#include 相关的错误 库。 该错误看起来像这样

    我无法尝试您发送给我的代码。 在我调用 include 函数的那一刻、就会出现此错误。

    提前感谢您的帮助。

    最好

    Maria  

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

    尊敬的 Maria:

    遗憾的是、我无法真正看到错误导致的情况。   这些警告来自库头文件的 C++版本。

    如果我说对、您的项目是 controlSUITE 中的 ADC SOC 示例、它可能位于您的硬盘驱动器的以下位置:

    C:\ti\controlSUITE\device_support\f2806x\v151\F2806X_Examples_ccsv5\ADC_SoC

    我已经为 该示例附加了一个稍作修改的主源文件。   我所做的唯一更改是在顶部添加 IQ 数学头文件、并从我的上一篇文章中复制代码行。  它在我的机器上正常工作。  

    您能否将自己的源文件更改为如下所示、并告知我是否可以构建该文件?

    (注意:在编译工程时可能会收到几个警告、但这些警告可以忽略)。

    谢谢。

    此致、

    Richard

    e2e.ti.com/.../3515.Example_5F00_2806xAdcSoc.c

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

    尊敬的 Richard

    首先、感谢您抽出宝贵的时间为您提供帮助。 我可以按照您的答案修复库的问题。 现在我有一个问题、我需要使用正弦和余弦信号来实时比较一些浮点值。 我想知道如何将下面表达的值(Q 格式)直接转换为浮点值(不仅用于可视化)


    我希望您也能帮助我解决这个问题。 我可能需要进行一些转换?  

    我对我的结果仍然有一些疑问、正如您在下一幅图像中看到的、对于给定角度的正弦和余弦、这些值根本不正确。 我想知道我是否应该在代码中添加其他内容? 我在这里只是使用您发送给我的代码。 我甚至添加 了#define GLOBAL_Q   24

    提前感谢您的帮助

    此致

    Maria  

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

    尊敬的 Richard:

    当我尝试包括示例中使用的库#include“IQmathCPP.h”时,会产生33个错误的问题。 我还尝试使用 FastRTS、但似乎没有提供对我有用的值。 我导入了以下库:

    #include "math.h"
    #include "C28x_FPU_FastRTS.h"

    即使是0、2*PI 或180,我也有一些接近现实的价值。 但愿你能帮帮我

    此致

    Maria

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

    如果您在 F28069上、则根本不需要 IQmath 库、因为您已经在浮点上。  

    使用#include

    请注意、C28x_FPU_FastRTS.h 不需要包含在内、它只是一个链接时替换。  

    在此处阅读 fastRTS 的用户指南

    C:\ti\controlSUITE\libs\math\FPUfastRTS\v100\doc

    注:

    fastRTS 还依赖于 CMD 文件来获取数学查找表

    UG 指向以下、但这可能不适用于您选择的器件

    存储器

    第0页:
    …μ A
    FPUTABLES:origin = 0x3FEBDC,length = 0x0006A0
    …μ A

    部分

    …μ A
    FPUmathTables:> FPUTABLES,PAGE = 0,TYPE = NOLOAD
    …μ A

    我认为这应该是以下内容...  是否可以确认您使用的是 F28069M??  

    存储器

    第0页:
    …μ A

    FPUTABLES :origin = 0x3FD590,length = 0x0006A0 //引导 ROM 中的 FPU 表*/

    …μ A

    部分

    …μ A
    FPUmathTables:> FPUTABLES,PAGE = 0,TYPE = NOLOAD
    …μ A

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,Manish
    感谢您的回复、我已经尝试使用 math.h 库、并将以下代码与 F28069m 中的 ADC_SoC 示例结合使用

    //######################################################################################################################
    //描述:
    //! addtogroup f2806x_example_list
    //!

    ADC 转换开始(ADC_SoC)


    //!
    //! 此 ADC 示例使用 ePWM1来生成周期性 ADC SOC - ADCINT1。
    //! 两个通道被转换、ADCINA4和 ADCINA2。
    //!
    //! b 监视\b 变量\n
    //! - Voltage1[10]-最后10个 ADCRESULT0值
    //! - Voltage2[10]-最后10个 ADCRESULT1值
    //! -转换计数-当前结果编号0-9
    //! -循环计数 -空闲循环计数器
    //
    //
    //######################################################################################################################
    //$TI 版本:F2806x C/C++头文件和外设示例 V151 $
    //$Release Date:2016年2月2日$
    //版权所有:版权所有(C) 2011-2016德州仪器(TI)公司-
    // http://www.ti.com/ 保留所有权利$
    //######################################################################################################################

    #include "DSP28x_Project.h" //设备头文件和示例包括文件
    #include "math.h"

    //此文件中找到的函数的原型语句。
    _interrupt void ADC_ISR (void);
    void ADC_Config (void);


    //此示例中使用的全局变量:
    uint16环计数;
    UINT16转换计数;
    uint16 Voltage1[10];
    uint16 Voltage2[10];

    双 sinRT = 0;
    double cosrt = 0;
    双角= 0;
    双 WP = 2.65;
    双倍 PI = 3.141592654;

    //变量

    长 I;


    MAIN ()

    // IQ 数学测试
    角度= 2*PI*WP;
    SinRT = sin (角度);
    cosrt = cos (角度);

    //步骤1. 初始化系统控制:
    // PLL、安全装置、启用外设时钟
    //此示例函数位于 F2806x_SYSCTRL.c 文件中。
    InitSysCtrl();


    //步骤2. 初始化 GPIO:
    //此示例函数位于 F2806x_GPIO.c 文件和中
    //说明了如何将 GPIO 设置为其默认状态。
    // InitGpio();//针对此示例跳过

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

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

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

    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。 这对于调试很有用。
    //可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2806x_PieVect.c 中找到
    InitPieVectTable();

    //此示例中使用的中断被重新映射到
    //此文件中的 ISR 函数。
    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.ADCINT1 =&ADC_ISR;
    EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

    //步骤4. 初始化所有器件外设:
    //此函数可在 F2806x_InitPeripherals.c 中找到
    // InitPeripherals ();//此示例不需要
    InitAdc ();//对于此示例,初始化 ADC
    AdcOffsetSelfCal();

    //步骤5. 特定于用户的代码、启用中断:

    //在 PIE 中启用 ADCINT1
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
    IER |= M_INT1;//启用 CPU 中断1
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM

    LoopCount = 0;
    ConversionCount = 0;

    //配置 ADC
    EALLOW;
    AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;//启用非重叠模式
    AdcRegs.ADCCTL1.bit.INTPULSEPOS= 1;// ADCINT1在 AdcResults 锁存后跳闸
    AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
    AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
    AdcRegs.INTSEL1N2.bit.INT1SEL= 1;//设置 EOC1以触发 ADCINT1触发
    AdcRegs.ADCSOC0CTL.bit.CHSEL= 4;//将 SOC0通道选择设置为 ADCINA4
    AdcRegs.ADCSOC1CTL.bit.CHSEL= 2;//将 SOC1通道选择设置为 ADCINA2
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL= 5;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0先转换,然后 SOC1
    AdcRegs.ADCSOC1CTL.bit.TRIGSEL= 5;//设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
    AdcRegs.ADCSOC0CTL.bit.ACQPS= 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
    AdcRegs.ADCSOC1CTL.bit.ACQPS= 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
    EDIS;

    //假设 ePWM1时钟已在 InitSysCtrl()中启用;
    EPwm1Regs.ETSEL.bit.SOCAEN= 1;//启用组上的 SOC
    EPwm1Regs.ETSEL.bit.SOCASEL= 4;//在递增计数时从 CMPA 中选择 SOC
    EPwm1Regs.ETPS.bit.SOCAPRD= 1;//在发生第一个事件时生成脉冲
    EPwm1Regs.CMPA.half.CMPA= 0x0080;//设置比较值
    EPwm1Regs.TBPRD= 0xFFFF;//为 ePWM1设置周期
    EPwm1Regs.TBCTL.bit.CTRMODE= 0;//向上计数并启动

    //等待 ADC 中断
    for (;;)

    LoopCount++;





    _interrupt void ADC_ISR (void)


    Voltage1[ConversionCount]= AdcResult.ADCRESULT0;
    Voltage2[ConversionCount]= AdcResult.ADCRESULT1;

    //如果记录了20次转换,则重新开始
    if (ConversionCount = 9)

    ConversionCount = 0;

    else ConversionCount++;

    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志为下一个 SOC 重新初始化
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断

    返回;



    我的回复不是正确的值,我不知道我是否应该更改其他配置?
    WP = 0;
    角度= 0;
    SinRT =-0.9569404
    余弦=-0.2902847

    或第二次尝试
    WP = 2.65;
    角度= 16.65044;
    SinRT = 1.054673
    CosRT = 0.008753741

    请希望您能帮助我了解错误的位置

    提前感谢

    最好

    Maria