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.

[参考译文] TMS320F28P659DK-Q1:与 SOCA 锁存的 eQEP

Guru**** 2872520 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1583843/tms320f28p659dk-q1-eqep-latching-with-soca

器件型号: TMS320F28P659DK-Q1
主题: SysConfig 中讨论的其他器件

尊敬的 Texas 社区:

我当前正在运行 PWM 并成功生成 SOCA SOCB 触发的事件 ADC 转换

下一步是锁存 eQEP (增强型正交编码器脉冲)位置 SOCA SOCB 信号、从而使电机位置与 ADC 采集同步。

我已使用 SysConfig 工具尝试以下配置:

  1. 更改了 频闪 时钟源 “选通信号或与 ADCSOCA 进行“ (或 ADCSOCB)。

  2. 已尝试使用读取锁定位置EQEP_getStrobePositionLatch(myEQEP0_BASE)

问题在于此值 始终为零

请您深入了解配置中可能缺少的内容吗?

SysConfig 工具生成的相关代码为:

void myEQEP0_init(){
	//
	// Disable, clear all flags and interrupts
	//
	EQEP_disableInterrupt(myEQEP0_BASE,
		(EQEP_INT_GLOBAL     		|   
		EQEP_INT_POS_CNT_ERROR		|      
		EQEP_INT_PHASE_ERROR    	| 
		EQEP_INT_DIR_CHANGE    		| 
		EQEP_INT_WATCHDOG          	|   
		EQEP_INT_UNDERFLOW         	|
		EQEP_INT_OVERFLOW        	|
		EQEP_INT_POS_COMP_READY    	|	
		EQEP_INT_POS_COMP_MATCH   	|
		EQEP_INT_STROBE_EVNT_LATCH	| 
		EQEP_INT_INDEX_EVNT_LATCH 	|
		EQEP_INT_UNIT_TIME_OUT   	|
		EQEP_INT_QMA_ERROR));
	EQEP_clearInterruptStatus(myEQEP0_BASE,
		(EQEP_INT_GLOBAL     		|   
		EQEP_INT_POS_CNT_ERROR		|      
		EQEP_INT_PHASE_ERROR    	| 
		EQEP_INT_DIR_CHANGE    		| 
		EQEP_INT_WATCHDOG          	|   
		EQEP_INT_UNDERFLOW         	|
		EQEP_INT_OVERFLOW        	|
		EQEP_INT_POS_COMP_READY    	|	
		EQEP_INT_POS_COMP_MATCH   	|
		EQEP_INT_STROBE_EVNT_LATCH	| 
		EQEP_INT_INDEX_EVNT_LATCH 	|
		EQEP_INT_UNIT_TIME_OUT   	|
		EQEP_INT_QMA_ERROR));
	EQEP_SourceSelect source_myEQEP0 =
	{
		EQEP_SOURCE_DEVICE_PIN, 		// eQEPA source
		EQEP_SOURCE_DEVICE_PIN,		// eQEPB source
		EQEP_SOURCE_DEVICE_PIN,  	// eQEP Index source 
	};
	//
	// Selects the source for eQEPA/B/I signals
	//
	EQEP_selectSource(myEQEP0_BASE, source_myEQEP0);
	//
	// Set the strobe input source of the eQEP module.
	//
	EQEP_setStrobeSource(myEQEP0_BASE,EQEP_STROBE_OR_ADCSOCA);
	//
	// Sets the polarity of the eQEP module's input signals.
	//
	EQEP_setInputPolarity(myEQEP0_BASE,false,false,false,false);
	//
	// Configures eQEP module's quadrature decoder unit.
	//
	EQEP_setDecoderConfig(myEQEP0_BASE, (EQEP_CONFIG_QUADRATURE | EQEP_CONFIG_2X_RESOLUTION | EQEP_CONFIG_NO_SWAP | EQEP_CONFIG_IGATE_DISABLE));
	//
	// Set the emulation mode of the eQEP module.
	//
	EQEP_setEmulationMode(myEQEP0_BASE,EQEP_EMULATIONMODE_STOPIMMEDIATELY);
	//
	// Configures eQEP module position counter unit.
	//
	EQEP_setPositionCounterConfig(myEQEP0_BASE,EQEP_POSITION_RESET_IDX,1999U);
	//
	// Sets the current encoder position.
	//
	EQEP_setPosition(myEQEP0_BASE,0U);
	//
	// Disables the eQEP module unit timer.
	//
	EQEP_disableUnitTimer(myEQEP0_BASE);
	//
	// Disables the eQEP module watchdog timer.
	//
	EQEP_disableWatchdog(myEQEP0_BASE);
	//
	// Configures the quadrature modes in which the position count can be latched.
	//
	EQEP_setLatchMode(myEQEP0_BASE,(EQEP_LATCH_UNIT_TIME_OUT|EQEP_LATCH_RISING_STROBE|EQEP_LATCH_RISING_INDEX));
	//
	// Set the quadrature mode adapter (QMA) module mode.
	//
	EQEP_setQMAModuleMode(myEQEP0_BASE,EQEP_QMA_MODE_BYPASS);
	//
	// Disable Direction Change During Index
	//
	EQEP_disableDirectionChangeDuringIndex(myEQEP0_BASE);
	//
	// Enables individual eQEP module interrupt sources.
	//
	EQEP_enableInterrupt(myEQEP0_BASE,(EQEP_INT_INDEX_EVNT_LATCH));
	//
	// Configures the mode in which the position counter is initialized.
	//
	EQEP_setPositionInitMode(myEQEP0_BASE,(EQEP_INIT_FALLING_INDEX));
	//
	// Sets the software initialization of the encoder position counter.
	//
	EQEP_setSWPositionInit(myEQEP0_BASE,false);
	//
	// Sets the init value for the encoder position counter.
	//
	EQEP_setInitialPosition(myEQEP0_BASE,0U);
	//
	// Enables the eQEP module.
	//
	EQEP_enableModule(myEQEP0_BASE);
}

提前感谢您、

Luciano。





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

    尊敬的 Luciano:

    是否可以尝试将 QEPSRCSEL.QEPSSEL 设置为非零值?

     TMS320F28388D:QPOSSLAT 的配置 

    重新测试、查看位置是否已锁定。

    此致、

    Ryan Ma

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

    您好、Ryan、

    感谢您的及时答复。

    很抱歉提问、但我如何才能明确看到“QEPSRCSEL.QEPSSEL"值“值?

    此致、

    Luciano。

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

    尊敬的 Luciano:

    您可以从 CCS 中的寄存器视图进行查看。

    eQEP1Regs -> QEPSRCSEL -> QEPSSEL

    如果您有任何其他问题、请告诉我。

    此致、

    Ryan Ma

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

    您好、Ryan、

    在电路板初始化后、使用以下命令将“1"写入“写入 QEPSRCSEL.QEPSSEL 寄存器:

    EALLOW;
    HWREGH(myEQEP0_BASE + EQEP_O_QEPSRCSEL) |= 0x0001;
    EDIS;

    完成此操作后、正常位置读数停止工作、锁存位置保持为 0


    原始配置:
    ...


    您的建议已实施:
    ...


    还可以吗?
    此致、
    Luciano

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

    上一条消息中的屏幕截图失败。

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

    尊敬的 Luciano:

    能否确保为生成 SOCA/B 的相应 PWM 启用 ADCSOCOUTSELECT?

    应启用相应 ePWM 的 SOCA/B。

    另外、我注意到您的 QEPSRCSEL = 0x1。 但是、这会将 QEPASEL 配置为 CMPSS1.CTRIPH。

    相反、它应该只是 QEPSRCSEL[QEPSSEL]= 0x1;  

    因此、QEPSRCSEL 应该是 0x1000 而不是 0x1。

    https://www.ti.com/lit/ug/spruiz1b/spruiz1b.pdf?ts = 1762802161191&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FTMS320F28P659DK-Q1#page=297

    此致、

    Ryan Ma