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.

[参考译文] C2000WARE:使用 enc.h 进行 Instaspin eQEP 电气角度计算

Guru**** 2974170 points

Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1166214/c2000ware-instaspin-eqep-electrical-angle-calculation-using-enc-h

器件型号:C2000WARE

您好!

我正在尝试教授 Instaspin 传感 FOC。 我将使用一个具有2048个脉冲/转的编码器连接到 F280049的 eQEP 模块2。

当电机以600RPM (=10RPS)旋转时、我每隔100ms 获得一个指数脉冲、这看起来很好、A 和 B 输入上的脉冲看起来也很好。  

编码器 GPIO 配置为:

    // GPIO14 Encoder2 Input A
    GPIO_setMasterCore(14, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_14_EQEP2_A);
    GPIO_setDirectionMode(14, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(14, GPIO_PIN_TYPE_STD);

    // GPIO15 Encoder2 Input B
    GPIO_setMasterCore(15, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_15_EQEP2_B);
    GPIO_setDirectionMode(15, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(15, GPIO_PIN_TYPE_STD);

    // GPIO29 EncoderB Index
    GPIO_setMasterCore(29, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_29_EQEP2_INDEX);
    GPIO_setDirectionMode(29, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(29, GPIO_PIN_TYPE_STD);

eQEP 时钟也被启用
--------------------------------------
eQEP 模块配置为
  //
  // Configure the decoder for quadrature count mode
  //
  EQEP_setDecoderConfig(obj->qepHandle[qep], (EQEP_CONFIG_2X_RESOLUTION |
                                     EQEP_CONFIG_QUADRATURE |
                                     EQEP_CONFIG_SWAP));

  EQEP_setEmulationMode(obj->qepHandle[qep], EQEP_EMULATIONMODE_RUNFREE);

  //
  // Configure the position counter to reset on an index event
  //
  EQEP_setPositionCounterConfig(obj->qepHandle[qep], EQEP_POSITION_RESET_IDX,
                                0xFFFFFFFF);//0x00001FFF
                                
  //Index interrupt 
  Interrupt_register(INT_EQEP2,eqep_ind_latch);
  EQEP_enableInterrupt(EQEP2_BASE, EQEP_INT_INDEX_EVNT_LATCH);
  EQEP_clearInterruptStatus(EQEP2_BASE, EQEP_INT_INDEX_EVNT_LATCH);
  Interrupt_enable(INT_EQEP2);
ISR 用于切换 LED、由于600RPM、LED 每隔100ms 发生一次。
现在、我想使用随教程提供的 enc.h 和 enc.c 文件。 因此、我将编码器配置为:
  encHandle = ENC_init(&enc,sizeof(enc));
  ENC_setup(encHandle,1,USER_MOTOR_NUM_POLE_PAIRS,USER_MOTOR_ENCODER_LINES,0,USER_IQ_FULL_SCALE_FREQ_Hz,(USER_ISR_FREQ_Hz),USER_MOTOR_MAX_SPEED);//(USER_ISR_FREQ_Hz/USER_NUM_ISR_TICKS_PER_SPEED_TICK)
  EQEP_setPosition(EQEP2_BASE,0);
ENC_setup (encHandle、1、USER_MOTOR_NUM_POLE_PAIRS、USER_MOTOR_ENCODER_LINS、0、USER_IQ_FULL_SCALE_FREQ_Hz、(USER_ISR_FREQ_Hz)、USER_MOTOR_MAX_SPEED);
(USER_MOTOR_NUM_POLE_PAIRS = 3、USER_MOTOR_ENCODER_LINes=2048、USER_IQ_FULL_SCALE_FREQ_Hz=1000、USER_ISR_FREQ_Hz=24e3、20e3)
--
根据用户指南、剩下要做的就是在主 ISR 中调用 ENC_run、如下所示:
 ENC_run(encHandle,
                EQEP_getPosition(EQEP2_BASE),
                HAL_getQepIndex(halHandle),
                HAL_getQepDirection(halHandle),
                1);
        ENC_calcElecAngle(encHandle,EQEP_getPosition(halHandle->qepHandle[1]));
       motor_speed_enc = ENC_getSpeedRPM(encHandle);
我尝试过、但 MOTOR_SPED_ENC 返回-1、是否有人知道我做了什么错误?
是速度计算的比例因子  
enc.h 中的 ENC_SPEED_SCALE_FACTOR 是否适用于具有2048条线的编码器?
提前感谢您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以在 MotorControl SDK 中找到如下所示的示例实验、并参考 hal.c 和 hal.h 中的 eQEP 配置、编码器接口用于在 encode.c 和 encode.h 中计算角度和速度 您可能只需要更改 GPIO 和 eQEP 分配、以及 user_mtr1.h 中的编码器行 在 F28004x 上使用编码器和 eQEP 时、您可能不需要做任何其他更改。

    https://www.ti.com/tool/C2000WARE-MOTORCONTROL-SDK

    Universal Project and Lab User's Guide (通用项目和实验室用户指南): https://www.ti.com/lit/spruj26

    文件夹中的示例实验项目:C:\ti\c2000\C2000Ware_MotorControl_SDK_ \solutions\universal_motorcontrol_lab\f28002x