Other Parts Discussed in Thread: HALCOGEN
主题中讨论的其他器件:HALCOGEN
大家好、我让 eQEP 模块在正交计数模式下与正交编码器一起运行。 我已经设置了一个位置比较中断、该中断将随每个单元位置事件触发、并且我可以每次成功读取位置计数器。
问题是我需要测量设备事件之间的时间,而我一直在尝试使用捕获周期寄存器(QCPRD)而没有成功。 我看到的值在连续读取之间发生了巨大变化,而编码器的波形 非常稳定。 我没有看到任何捕获溢出错误标志(COEF)、但我确实偶尔会看到一个捕获方向错误标志(CDEF)、但有关这意味着什么的信息很少。 我还尝试了 HALCoGen 示例(非 ISR 版本)、得到了相同的结果!
我已经尝试了我能看到的所有内容,您能提供帮助吗?
代码如下。
int main (空)
{
/*用户代码开始(3)*/
/*在 Cortex R4中启用 IRQ 中断*/
_enable_interrupt_();
gioInit();
etpwmInit();
adcInit();
hetInit();
QEPInit();
HAL_DisplayInit();
HAL_unipolarWaveInit();
/*启用位置计数器*/
eqepEnableCounter (eqepREG1);
/*启用位置比较*/
eqepEnablePosnCompare (eqepREG1);
/*启用单位定时器。 *
eqepEnableUnitTimer (eqepREG1);
/*启用捕获定时器和捕获周期锁存。 *
eqepEnableCapture (eqepREG1);
while (1)
{
//应用程序代码
}
}
/*位置比较中断。 每次 eQEP 位置计数器改变时触发*/
void eqepNotification (eqepbase_t * eQEP、uint16标志)
{
COPY++;
/**加载位置比较值*/
eqepREG1->QPOSCMP = COPY+1U;
pulsePeriod = eqepREG1->QCPRD;
/**读取位置计数器*/
编码值= eqepReadPosnCount (eqepREG1);
eqepREG1->QCLR =(uint16) 0xFFFFFFU;
}
以下是 eQEP.c
#include "eQEP.h"
#include "sys_vim.h"
/*函数
*
/*用户代码开始(0)*/
/*用户代码结束*/
/**@fn void QEPInit (void)
* @brief 会初始化 eQEP 驱动程序
*
* 此函数用于初始化 eQEP 模块。
*
/* sourceId:eQEP_sourceId_001 */
/* DesignId:eQEP_DesignId_001 */
/*要求:HL_QEP_SR1 */
空 QEPInit (空)
{
/*用户代码开始(1)*/
/*用户代码结束*/
/**-清除位置计数器寄存器 */
eqepREG1->QPOSCNT = 0x00000000U;
/**-初始化位置计数器值寄存器 */
eqepREG1->QPOSIINIT = 0x00000000U;
/**-设置最大位置计数器值 */
eqepREG1->QPOSMAX = 0x000003E7U;
/**-设置初始位置比较值 */
eqepREG1->QPOSCMP = 0x00000001U;
/**-清除时基 */
eqepREG1->QUTMR = 0x00000000U;
/**-配置单位周期寄存器 */
eqepREG1->QUPRD = (UINT32) 0x00000000U;
/**-清除看门狗定时器寄存器 */
eqepREG1->QWDTMR = (uint16) 0x00000000U;
/**-配置看门狗周期 */
eqepREG1->QWDPRD = (uint16) 0x0000U;
/*用户代码开始(2)*/
/*用户代码结束*/
/**-设置解码器控制寄存器
* -选择位置计数器模式
* -启用/禁用同步输出
* -选择同步输出引脚
* -选择外部时钟速率(分辨率)
* -启用/禁用交换正交时钟输入
* -启用/禁用使用频闪灯对索引脉冲进行门控。
* -启用/禁用对 QEPA 输入无效
* -启用/禁用对 QEPB 输入无效
* -启用/禁用对 QEPI 输入无效
* -启用/禁用对 QEPS 输入求反
*
eqepREG1->QDECCTL =(uint16)((uint16)((uint16) eQEP_Quadrature_count << 14U)
|(uint16)((uint16) 0U << 13U)
|(uint16)((uint16) eQEP_index_PIN << 12U)
|(uint16)((uint16) eQEP_resolution_2x << 11U)
|(uint16)((uint16) 0U << 10U)
|(uint16)((uint16) 0U << 9U)
|(uint16)((uint16) 0U << 8U)
|(uint16)((uint16) 0U << 7U)
|(uint16)((uint16) 0U << 6U)
|(uint16)((uint16) 0U << 5U)
|(uint16) 0x0000U);
/**-设置 eQEP 控制寄存器
* -选择位置计数器复位模式
* -启用和选择位置计数器的神户事件初始化
* -启用和选择位置计数器的索引事件初始化
* -启用/禁用位置计数器的软件初始化。
* -选择位置计数器的选通事件锁存。
* -选择位置计数器的索引事件锁存。
* -选择 eQEP 捕捉锁存模式
*
eqepREG1->QEPCTL =(uint16)((uint16) eQEP_MAX_POSITION << 12U)
|(uint16)((uint16) 0U <<11U)
|(uint16)(((uint16) eQEP_directon_DEPENDENT << 10U)
|(uint16)((uint16) 0U << 9U)
|(uint16)(((uint16) eQEP_Rising _EDGE << 8U)
|(uint16)((uint16) 1U <<7U)
|(uint16)(((uint16) eQEP_Rising _EDGE << 6U)
|(uint16)(((uint16) eQEP_LATCH_RISE_EDGE << 4U)
|(uint16)(((uint16) eQEP_ON_POSITION COUNTER_READ << 2U)
|(uint16) 0x0000U);
/**-设置 eQEP 位置控制寄存器
* -启用/禁用位置比较阴影。
* -选择位置比较阴影加载模式。
* -选择同步输出的极性。
* -选择位置比较同步输出脉冲宽度。
*
eqepREG1->QPOSCTL =(uint16)((uint16) 0U << 15U)
|(uint16)(((uint16) eQEP_QPOSCNT_EQPSCMP << 14U)
|(uint16)(((uint16) eQEP_ACTIVE_HIGH << 13U)
|(uint16)((uint16) 0x000U)
|(uint16) 0x0000U);
/**-设置 eQEP 捕捉控制寄存器
* -选择捕获定时器时钟预分频器。
* -选择单位位置事件预分频器。
*
eqepREG1->QCAPCTL =(uint16)((uint16) eQEP_PS_32 << 4U)//
|(uint16)((uint16) eQEP_PS_2)//单位事件
|(uint16) 0x0000U);
/*用户代码开始(3)*/
/*用户代码结束*/
/**-清除中断标志寄存器 */
eqepREG1->QCLR =(uint16) 0xFFFFFFU;
/**-设置 eQEP 中断使能寄存器
* 启用/可拨动 UTO 中断
* 启用/可拨号 IEL 中断
* 启用/可拨号 SEL 中断
* 启用/可调 PCM 中断
* 启用/可 Diable PCR 中断
* 启用/可 Diable PCO 中断
* 启用/可拨号 PCU 中断
* 启用/可拨号 WTO 中断
* 启用/可数字 QDC 中断
* 启用/可拨号 QPE 中断
* 启用/可拨号 PCE 中断
*
eqepREG1->QEINT =(uint16)((uint16) 0U << 11U)
|(uint16)((uint16) 0U << 10U)
|(uint16)((uint16) 0U << 9U)
|(uint16)((uint16) 0U << 8U)
|(uint16)((uint16) 0U << 7U)
|(uint16)((uint16) 0U << 6U)
|(uint16)((uint16) 0U << 5U)
|(uint16)((uint16) 0U <<4U)
|(uint16)((uint16) 0U << 3U)
|(uint16)((uint16) 0U << 2U)
|(uint16)((uint16) 0U << 1U);
/**-清除捕获定时器寄存器 */
eqepREG1->QCTMR =(uint16) 0x0000U;
/**-清除捕获周期寄存器*/
eqepREG1->QCPRD =(uint16) 0x0000U;
/**-清除周期锁存寄存器*/
eqepREG1->QCPRDLAT =(uint16) 0x0000U;
/*用户代码开始(4)*/
/*用户代码结束*/
/**-清除位置计数器寄存器 */
eqepREG2->QPOSCNT = 0x00000000U;
/**-初始化位置计数器值寄存器 */
eqepREG2->QPOSIINIT = 0x00000000U;
/**-设置最大位置计数器值 */
eqepREG2->QPOSMAX = 0x00000000U;
/**-设置初始位置比较值 */
eqepREG2->QPOSCMP = 0x00000000U;
/**-清除时基 */
eqepREG2->QUTMR = 0x00000000U;
/**-配置单位周期寄存器 */
eqepREG2->QUPRD = (UINT32) 0x00000000U;
/**-清除看门狗定时器寄存器 */
eqepREG2->QWDTMR = (uint16) 0x00000000U;
/**-配置看门狗周期 */
eqepREG2->QWDPRD = (uint16) 0x0000U;
/*用户代码开始(5)*/
/*用户代码结束*/
/**-设置解码器控制寄存器
* -选择位置计数器模式
* -启用/禁用同步输出
* -选择同步输出引脚
* -选择外部时钟速率(分辨率)
* -启用/禁用交换正交时钟输入
* -启用/禁用使用频闪灯对索引脉冲进行门控。
* -启用/禁用对 QEPA 输入无效
* -启用/禁用对 QEPB 输入无效
* -启用/禁用对 QEPI 输入无效
* -启用/禁用对 QEPS 输入求反
*
eqepREG2->QDECCTL =(uint16)((uint16)((uint16) eQEP_DIRECT_COUNT << 14U)
|(uint16)((uint16) 0U << 13U)
|(uint16)((uint16) eQEP_index_PIN << 12U)
|(uint16)((uint16) eQEP_resolution_1x << 11U)
|(uint16)((uint16) 0U << 10U)
|(uint16)((uint16) 0U << 9U)
|(uint16)((uint16) 0U << 8U)
|(uint16)((uint16) 0U << 7U)
|(uint16)((uint16) 0U << 6U)
|(uint16)((uint16) 0U << 5U)
|(uint16) 0x0000U);
/**-设置 eQEP 控制寄存器
* -选择位置计数器复位模式
* -启用和选择位置计数器的选通事件初始化
* -启用和选择位置计数器的索引事件初始化
* -启用/禁用位置计数器的软件初始化。
* -选择位置计数器的选通事件锁存。
* -选择位置计数器的索引事件锁存。
* -选择 eQEP 捕捉锁存模式
*
eqepREG2->QEPCTL =(uint16)((uint16) eQEP_MAX_POSITION << 12U)
|(uint16)((uint16) 0U << 11U)
|(uint16)(((uint16) eQEP_directon_DEPENDENT << 10U)
|(uint16)((uint16) 0U << 9U)
|(uint16)(((uint16) eQEP_Rising _EDGE << 8U)
|(uint16)((uint16) 0U << 7U)
|(uint16)(((uint16) eQEP_Rising _EDGE << 6U)
|(uint16)(((uint16) eQEP_LATCH_RISE_EDGE << 4U)
|(uint16)(((uint16) eQEP_ON_POSITION COUNTER_READ << 2U)
|(uint16) 0x0000U);
/**-设置 eQEP 位置控制寄存器
* -启用/禁用位置比较阴影。
* -选择位置比较阴影加载模式。
* -选择同步输出的极性。
* -选择位置比较同步输出脉冲宽度。
*
eqepREG2->QPOSCTL =(uint16)((uint16) 0U << 15U)
|(uint16)(((uint16) eQEP_QPOSCNT_EQPSCMP << 14U)
|(uint16)(((uint16) eQEP_ACTIVE_HIGH << 13U)
|(uint16)((uint16) 0x000U)
|(uint16) 0x0000U);
/**-设置 eQEP 捕捉控制寄存器
* -选择捕获定时器时钟预分频器。
* -选择单位位置事件预分频器。
*
eqepREG2->QCAPCTL =(uint16)((uint16) eQEP_PS_8 << 4U)
|(uint16)((uint16) eQEP_PS_512)
|(uint16) 0x0000U);
/*用户代码开始(6)*/
/*用户代码结束*/
/**-清除中断标志寄存器 */
eqepREG2->QCLR =(uint16) 0xFFFFFFU;
/**-设置 eQEP 中断使能寄存器
* 启用/可拨动 UTO 中断
* 启用/可拨号 IEL 中断
* 启用/可拨号 SEL 中断
* 启用/可调 PCM 中断
* 启用/可 Diable PCR 中断
* 启用/可 Diable PCO 中断
* 启用/可拨号 PCU 中断
* 启用/可拨号 WTO 中断
* 启用/可数字 QDC 中断
* 启用/可拨号 QPE 中断
* 启用/可拨号 PCE 中断
*
eqepREG2->QEINT =(uint16)((uint16) 0U << 11U)
|(uint16)((uint16) 0U << 10U)
|(uint16)((uint16) 0U << 9U)
|(uint16)((uint16) 0U << 8U)
|(uint16)((uint16) 0U << 7U)
|(uint16)((uint16) 0U << 6U)
|(uint16)((uint16) 0U << 5U)
|(uint16)((uint16) 0U <<4U)
|(uint16)((uint16) 0U << 3U)
|(uint16)((uint16) 0U << 2U)
|(uint16)((uint16) 0U << 1U);
/**-清除捕获定时器寄存器 */
eqepREG2->QCTMR =(uint16) 0x0000U;
/**-清除捕获周期寄存器*/
eqepREG2->QCPRD =(uint16) 0x0000U;
/**-清除周期锁存寄存器*/
eqepREG2->QCPRDLAT =(uint16) 0x0000U;
/*用户代码开始(7)*/
/*用户代码结束*/
}