Other Parts Discussed in Thread: 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);
//
// 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);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_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);