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.

[参考译文] CCS/TMS320F28335:使用电机编码器控制电机方向和位置

Guru**** 2777545 points

Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/728055/ccs-tms320f28335-controlling-motor-direction-and-position-using-motor-encoder

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

工具/软件:Code Composer Studio

 我正在尝试 通过 eQEP 控制编码器安装电机的方向和位置。  位置控制工作正常、方向读数在0到1之间波动、反之亦然、但它会一直移动到相同 的方向。 代码如下所示:

#include "DSP28x_Project.h"    //器件头文件和示例 include 文件

/*为本示例定义*/
#define ENCODER_REV  200  //脉冲/旋转*/
/*此文件中找到的函数的原型语句*/
空 InitEQep1 (uint32 PositionMax);

中断空 eqep1_ISR (空);
/*此系统中使用的全局变量*/
uint16 BackTicker;
uint32 PositionMax;
uint32 PositionCounter;
uint32 旋转方向;
浮动32 旋转角度单元;
浮点32 RotateAngleDegree;
void main (void)
/*------------------
 步骤1.
 禁用全局中断和中断标志清除
-------------------------------------------------- *
 Dint;
 InitPieCtrl();
 IER = 0x0000;
 IFR = 0x0000;

    InitSysCtrl();
   InitPieVectTable();
 
   EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
   PieVectTable.EQEP1_INT=&eqep1_ISR;
   EDIS;   //这是禁止写入 EALLOW 受保护寄存器所必需的

 对于 QEP *//
 EALLOW;
 GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0;  //启用 GPIO50 (EQEP1A)上的上拉电阻器*/
 GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0;  //启用 GPIO51 (EQEP1B)上的上拉电阻器*/
 GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;  //启用 GPIO52 (EQEP1S)上的上拉电阻器*/
 GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0;  //启用 GPIO53 (EQEP1I)上的上拉电阻器*/
 GpioCtrlRegs.GPACTRL.bit.QUALPRD2 = 0xFF; /*指定 GPIO48到 GPIO55的鉴定采样周期*
 GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 2;  //使用6个样本进行限定
 GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 2;  //使用6个样本进行限定
 GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 2;  //使用6个样本进行限定
 GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 2;  //使用6个样本进行限定*
 GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; //将 GPIO50配置为 EQEP1A *
 GpioCtrlRegs.GPAMUX2.bit.GPIO21=1; //将 GPIO51配置为 EQEP1B */
 GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 1; //将 GPIO52配置为 EQEP1S *
 GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; //将 GPIO53配置为 EQEP1I *
 EDIS;
 
 BackTicker = 0;
 PositionMax = ENCODER_REV * 20;
 PositionCounter = 0;
 RotateDirection = 0;
 RotateAngleUnit = 0;
 RotateAngleDegree = 0;
 IER |= M_INT5;
 //在 PIE 中启用 TINT0:组5中断1
   PieCtrlRegs.PIEIER5.bit.INTx1 = 1;

    InitEQep1 (PositionMax);

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

 for (;;)
 {
  
 }

中断空 eqep1_ISR (空)

         BackTicker++;
   /*检查位置和方向*/
   PositionCounter = EQep1Regs.QPOSCNT;
   RotateDirection = EQep1Regs.QEPSTS.bit.QDF;
   RotateAngleUnit =(float32) PositionCounter / PositionMax;
   RotateAngleDegree = RotateAngleUnit * 360;
     EQep1Regs.QCLR.bit.INT=1;
   PieCtrlRegs.PIEACX.ALL = PIEACK_group5;
/*------------------
 步骤10.
 10.1本地中断服务例程和函数
-------------------------------------------------- *
空 InitEQep1 (uint32 PositionMax)
    EQep1Regs.QDECCTL.bit.QSRC=00;     // QEP 正交计数模式
    EQep1Regs.QEPCTL.bit.free_soft = 2;
    EQep1Regs.QEPCTL.bit.PCRM=1;      // PCRM=00模式-索引事件发生时 QPOSCNT 复位
    EQep1Regs.QEPCTL.bit.UTE=1;        //单元超时启用
    EQep1Regs.QEPCTL.bit.QCLM=1;       //锁存单元超时
  // EQep1Regs.QPOSMAX = 0xFFF;        //对于具有12位的编码器
    EQep1Regs.QPOSMAX = PositionMax - 1; // 24 x 4 QCLK @ 1转*
    EQep1Regs.QEPCTL.bit.QPEN=1;       // QEP 使能
    EQep1Regs.QCAPCTL.bit.UPPs=5;      // 1/32表示单元位置
    EQep1Regs.QCAPCTL.bit.CCPs=6;      //针对 CAP 时钟、1/64
    EQep1Regs.QCAPCTL.bit.CEN = 1;       // QEP 捕捉启用

    EQep1Regs.QPOSCTL.bit.PCE = 1;//启用位置比较单元
    EQep1Regs.QEINT.BIT.PCM = 1;  //启用位置比较中断
中断处理程序函数中的变量'RotateDirection'会一直在改变、无论电机是顺时针还是逆时针移动。
您能帮我解决这个问题吗?
(F.Y.I: 带 编码器的电机为 pkp264d28a-r2el)
谢谢你

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

    您好!

    我检查了您使用的编码器、它们具有3通道输出。 您能否确保它们是否为2通道正交编码器。 因为您已将 eQEP 配置为正交模式、只需两个输出信号即可确定方向。 但该编码器提供3个信号、检查后即可。

    此外、对于 eQEP 中使用的 GPIO、实际上不需要太多的鉴定。 无需使用限定条件即可尝试一次。  

    谢谢

    Himanshu

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如上所述、确保物理连接正确完成并将 eQEP 配置为正确计数模式、正交计数模式非常重要。

    您的意思是 PositionMax = Encoder_REV * 20和 EQep1Regs.QPOSMAX = PositionMax - 1,QPOSMAX 应等于4 *编码器线路。

    如果您安装 controlSUITE、您可以参考以下示例项目。
    www.ti.com/.../controlsuite

    C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensored_Servo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Himanshu、非常感谢。
    至于我的理解、第三个信号只是计算转数。 它每转触发一次、这在我的应用中无关紧要。 我还尝试避免 GPIO 鉴定、但没有更改。 我有一个来自 SyncWorks 的 Delifino EVM。 同样的情况也是如此、但它并不像我自己的电路板那样频繁(方向 读数的改变不如 我自己做的控制器那样频繁)。 再次感谢您。

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

    物理上、我在连接中没有看到任何问题。 正如我在对 Himanshu 的答复中提到的、我还尝试了一个具有板载编码器的 Delfino EVM、它是相同的。 Encoder_REV * 20只是为了表示旋转次数为20。 还有其他建议吗?

    谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您刚才提到 pkp264d28a-R2E 好像是一种步进电机、我在手册中找不到有关编码器的更多详细信息。 您能否确保编码器信号为正交脉冲和 eQEP 模块的索引脉冲、并且由于编码器的电源为5V、因此编码器和 C2000控制器之间存在电压电平转换器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yanming、

    感谢您的帮助、

    是的,它是正交脉冲。   您可以在以下链接中找到编码器的规格和操作手册。

    catalog.orientalmotor.com/.../pkp264d28a-r2el

     在编码器和控制器之间还添加了电压电平稳压器。

    再次感谢您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以参考以下示例项目中的 eQEP 配置。如果您安装了 controlSUITE、我已经对这两个进行了测试、这对于我手上带有编码器的电机来说是可以的。 主要区别在于它启用索引输入。
    C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensored
    C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensored_Servo
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经听不到您两周了,因此我假设您能够解决您的问题。 如果情况并非如此,请拒绝此解决方案并回复此主题。 如果此主题被锁定、请制作一个描述问题当前状态的新主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Yanming:

    非常感谢您的建议。 我已经尝试过您提到的所有示例。 没有区别。 甚至我也尝试 过 Syncworks 的 Delfino TMS32028335评估板。  板载编码器。  尽管方向相同、但方向仍然波动。  

    再次感谢您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以更改 GPIO 的输入限定设置、似乎您设置的采样周期太高、您应该确保采样周期远小于编码器输出信号的最小周期。