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.

[参考译文] TMDSHVMTRPFCKIT:使用 eCAP 进行速度测量。

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/790293/tmdshvmtrpfckit-speed-measurement-using-ecap

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

尊敬的 TI 您好、

我想使用 TMDSHVMTRPFCKIT 中已经实现的 CAP-1/Hall-1测量电机速度、

我正在使用激光传感器、我将 H-1引脚连接到正输入"2"、将 GND 连接到引脚"10"、

问题是、即使我改变电机速度、Speed2.SpeedRpm 仍然保持不变127!

我是否必须连接任何其他连接或跳线?

提前感谢、

此致、

S.Tarik、

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

    您使用的是哪个示例? 什么数据类型是 Speed2.SpeedRpm? 127是我们在 IQ24类型变量的饱和值处看到的常见值。 您能否检查此变量是否为该类型?

    肖恩

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

    Sean、

    我正在调试  HVMotorCtrl+PfcKit_v2.1文件夹中的标量控制项目、

    您可以在 controlSUITE 中找到该项目:C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVACI_Scalar、

    Speed2.SpeedRpm 是一个 Int32输出 r.pm 速度、在这个项目中、缺省情况下、Iq 是一个 IQ24、

    实际上、我的电机的转速 RPM 小于1000rpm、我无法确定为什么不计算转速、

    在 TI 速度结构中、我们有 PU 速度和 rpm 速度、对于任何速度、两个输出保持不变。

    #ifndef __speed_PR_H__
    #define __speed_PR_H__
    
    typedef 结构{
    uint32 NewTimeStamp;//变量:对应于捕获事件(Q0)的新“时间戳”-与全局队列独立
    uint32 OldTimeStamp;//变量:对应于捕获事件(Q0)的旧“时间戳”-与全局 Q 独立
    uint32时间戳;//输入:对应于捕获事件(Q0)的当前“时间戳”-与全局 Q 独立
    uint32 Speedscaler;//参数:scaler 将1/N 周期转换为 global_Q 速度(Q0)-独立于全局 Q
    Int32 EventPeriod;//输入/变量:事件周期(Q0)-独立于全局队列
    Int16 InputSelect; //输入:时间戳(InputSelect=0)和 EventPeriod (InputSelect=1)之间的输入选择
    _IQ 速度;//输出:单位内的速度
    uint32 BaseRpm;//参数:缩放器将 global_Q 速度转换为 rpm (Q0)速度-与全局 Q 独立
    Int32 SpeedRpm;//输出:以 r.p.m.为单位的速度 (Q0)-独立于全局 Q
    } SPED_MEAS_CAP;//创建的数据类型
    
    
    /*-----------------
    speed_MEAS_CAP 对象的默认初始化程序。
    -------------------------------------------------- * 



    #if (BUILDLEVEL = LEVEL1) //------------------------------------ //连接 VOLT_Prof.模块的输入并调用 VOLT 配置文件宏 //--------------------------------- vhz1.Freq = SpeedRef; VHZ_PROF_MACRO (vhz1); //------------------------ //连接 SVGEN_MF 模块的输入并调用空间矢量发生器。 宏 ///----------------------------------------------------------------------------------------------------------- svgen_MF1.gain = vhz1.VoltOut; svgen_MF1.Freq = vhz1.Freq; SVGENMF_MACRO (svgen_MF1); //------------------------------------ //连接 PWM_DRV 模块的输入并调用 PWM 信号生成宏 //------------------------ pwm1.Mfunc1 = svgen_MF1.Ta; pwm1.MfuncC2 = svgen_MF1.TB; pwm1.MfuncC3 = svgen_MF1.TC; PWM_MACRO (1、2、3、pwm1)//计算新的 PWM 比较值 //------ //连接 PWMDAC 模块的输入 //--------------------------------- pwmdac1.Mfunc1 = svgen_MF1.Ta; pwmdac1.MfuncC2 = svgen_MF1.TB; PWMDAC_MACRO (6、pwmdac1)// PWMDAC 6A、6B pwmdac1.Mfunc1 = svgen_mf1.tc; pwmdac1.MfuncC2 = svgen_MF1.tB-svgen_MF1.TC; PWMDAC_MACRO (7、pwmdac1)// PWMDAC 7A、7B //--- //调用 CAP 宏(如果用于速度感应的链轮或杂散齿轮) //连接 SPED_PR 模块的输入并调用速度计算宏 //--------------- CAP_MACRO (1、CAP1) IF (cap1.CapReturn = 0)//检查捕获返回 { speed2.EventPeriod =(Int32)(cap1.EventPeriod);//读出新的事件周期 speed_PR_MACRO (speed2) //调用速度宏 } //--- //连接数据记录模块的输入 //--------------- DlogCh1 =(Int16)_IQtoIQ15 (svgen_MF1.Ta); DlogCh2 =(Int16)_IQtoIQ15 (svgen_MF1.TB); DlogCh3 =(Int16)_IQtoIQ15 (svgen_MF1.TC); DlogCh4 =(Int16)_IQtoIQ15 (svgen_MF1.tB-svgen_MF1.TC); #endif //(BUILDLEVEL = LEVEL1)

    我使用的是 eCAP EventPeriod "InputSelect = 1"、我认为该  模块不起作用/未配置某项功能!

    /*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    文件名: F2803XCAP.H
    目标:F2803x 系列
    ==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== */
    
    #ifndef __F280x_CAP_H__
    #define __F280x_CAP_H__
    
    #include "f2803xbmsk.h"
    #include "f2803xdrvlib.h"
    
    /*---
    ECAP1的 ECAP 控制寄存器1和2的初始化状态
    --------------------------------------------------------------- */
    #define ECCTL1_INIT_STATE (CAP1POL_RISTING _EDGE +\
    CAPLDEN_ENABLE +\
    CTRST1_Difference _TS +\
    EVTFLTPS_X_1 +\
    emulation_free)
    
    #define ECCTL2_init_State (continuous_mode +\
    TSCNTSTP_FREE +\
    SYNCI_DISABLE +\
    SYNCO_DISABLE +\
    捕获模式)
    
    /*------------------
    定义捕捉驱动程序对象的结构-------------------------------------------------------
    //
    typedef struct{Int32 EventPeriod;//输出:检测到的两个边沿之间的计时器值差异(Q0)
    uint16 CapReturn;
    } 捕捉;
    
    /*-----------------
    F280x 捕获对象的默认初始化程序
    ------------------------------------------------------- */
    #define F280XCAP1 {1、0\
    }
    
    /*------------------
    目标独立的默认初始化程序捕获对象-------------------------------------------------------
    */
    #define CAPTURE_DEFAULTS F280XCAP1
    
    /*-------------------------------------------------------
    CAP_INIT 和 CAP 宏定义-------------------------------------------------------
    *
    
    #define CAP_INIT_MACRO (n)\
    /* Init ECAP Control Register 1 and 2 for ECAP1*/\
    (* eCAP[n]).ECCTL1.ALL = ECCTL1_INIT_STATE;\
    (* eCAP[n]).ECCTL2.ALL = ECCTL2_INIT_STATE;\
    
    
    //确保 GPIO 配置在...-DevInit_F2803x.c 文件中正确完成,如下所示\\
    EALLOW; /*启用 EALLOW */\
    /*将 ECAP1引脚设置为主要功能*/\
    GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;// GPIO24为 ECAP1 */\
    EDIS; /*禁用 EALLOW*/
    
    
    
    #define CAP_MACRO (n、v)\
    if ((* eCAP[n]).ECFlG.bit.CEVT1!= 0)/*检查 ECAP1引脚第一个事件的一个入口状态*/\
    {\
    V.EventPeriod =(* eCAP[n]).CAP1;/*标记检测到的两个边沿之间的定时器计数器差异*/\
    V.CapReturn=0; /*然后,返回零*/\
    }\
    否则\
    {\
    V.CapReturn=1; /*否则,返回一个*/\
    }
    
    
    #endif //__F280x_CAP_H__
    

    此致、

    S.Tarik、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SpeedRpm 在 SPED_PR_MACRO 中计算。 如果您查看代码、您可以看到分母可能为零的除法函数。 您需要弄清您的分母为何如此低。 我们不知道您使用的反馈的信号完整性以及如何在 CPU 引脚上接收到反馈。 您可能必须验证这些内容。 如果可能、请使用函数发生器并进行验证。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们发现 eCAP 计数器不会递增、

    问题是信号输入电压范围来自我们用于测量速度的传感器、当我们使用 GBF 输出方波形时、一切看起来都很好、

    我们还将 SpeedScaled 更改为 适合我们应用的值。

    Speed2.SpeedScale=60*(system_frequency *1000000/(1*x*speed2.BaseRpm)); 

    此致、

    S.Tarik、