工具/软件:TI-RTOS
您好!
我在 Qudrature Encode API 函数中遇到问题。
我在下面的主题中面临相同的问题、
如线程中所述、我使用的代码相同、代码方向和位置正常。速度是唯一的问题。
我将获得低于输出的值。
++++++++ QEI.c:qePosition ={100}++++++
++++++++ QEI.c:qeDirection ={1}++++++
++++++++ QEI.c:qeiVelocity ={0}++++++
此致、
Nimesh
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.
工具/软件:TI-RTOS
您好!
我在 Qudrature Encode API 函数中遇到问题。
我在下面的主题中面临相同的问题、
如线程中所述、我使用的代码相同、代码方向和位置正常。速度是唯一的问题。
我将获得低于输出的值。
++++++++ QEI.c:qePosition ={100}++++++
++++++++ QEI.c:qeDirection ={1}++++++
++++++++ QEI.c:qeiVelocity ={0}++++++
此致、
Nimesh
这是我的代码、
void QEITaskFxn (UARg arg0、UARg arg1) { uint32_t qeVelocity = 0; uint32_t qePosition = 0; int32_t qeDirection = 0;
//正交编码器(QEI)
SysCtlPeripheralEnable (SYSCTL_Periph_QEI0);
GPIOPinConfigure (GPIO_PL1_PHA0);
GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_1);
SysCtlPeripheralEnable (SYSCTL_Periph_QEI1);
GPIOPinConfigure (GPIO_PL2_PHB0);
GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_2);//
//禁用正交编码器。
//
QEIDisable (QEI0_BASE);
QEIConfigure (QEI0_BASE、(QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUIVATURE | QEI_CONFIG_NO_SWAP)、10000);
QEIVelocityConfigure (QEI0_BASE、
QEIV0;QEIV_1000 (QEIV0);QEIV_BASE、QEIV_1000 (QEIV_1000);QEIV_1000 (QEIV_1000)
//
//启用正交编码器。
//
QEIEnable (QEI0_BASE);
//
//延迟一段时间...
//
Task_sleep (1);
//
读取编码器位置。
//
//qeiVelocity = QEIVelocityGet (QEI0_BASE);
//System_printf ("\r\n++++++++ QEI.c:qeiVelocity ={%d}++++++ \r\n"、qeiVelocity);
while (1)
{
qePosition = QEIPositionGet (QEI0_BASE);
System_printf ("\r\n++++++ QEI.c:qePosition ={%d}++++++ \r\n"、qePosition);
System_flush ();
qeDirection=QEIDirectionGet (QEI0_BASE);
System_printf ("\r\n++++++ QEI.c:qeDirection ={%d}++++++ \r\n"、qeDirection);
System_flush ();
qeVelocity = QEIVelocityGet (QEI0_BASE);
System_printf ("\r\n++++++ QEI.c:qeiVelocity ={%d}++++++ \r\n"、qeiVelocity);
System_flush ();
Task_sleep (1000);
}
此致、
Nimesh
感受您的痛苦-必须注意、"QEI 代码示例-随"SW-DRL-UG.xxxx"提供-已轻松地证明其简短并"完全避免"(更复杂) QEI-Velocity 函数! 为了公平起见-在这种情况下(非常简短)示例的支持-提供了详细信息:带有函数"QEIConfigure()"的"设置最大位置参数"。 尽管如此,即使是在“按曲线评分”时,“D”的奖励也是慷慨的!
您和之前到达的海报都报告了"速度问题"-您(两者)是否(更深入)考虑了以下两个问题:"that maximum position"参数及其"related parameter" w/在"QEIVelocityConfigure()?"中 您的代码列出了两个不同的值-并且完全没有提示-如何选择(其中一个)! 这不可能是好的-可以吗?
如果这些参数为:
这证明了(您)持续分析的"良好起点"-它不是吗? 必须提供"一些"细节、尤其是"重要细节"、以最大限度地提高"帮助者"的有效性。
您可以选择更改这些参数、并在"while loop"中"扩大"延迟时间、然后查看"速度函数"(然后)是否开始执行...
您好 CB1、
感谢您的回复。
我正在应用你的建议,但我有以下疑问。 如有可能、请详细说明。
在 QEIVelocityConfigure (uint32_t ui32Base、uint32_t ui32PreDiv、uint32_t ui32Period)中、最后参数"ui32Period"以毫秒或秒为单位。
2.在 QEIConfigure (uint32_t ui32Base、uint32_t ui32Config、uint32_t ui32MaxPosition )中、参数 "ui32MaxPosion"在速度测量中受影响? 如果是, 它如何影响速度?
此致、
Nimesh
我的朋友-您宣布"怀疑!" 您是否(几乎)在一个荒芜的南海岛上独自(被船毁)来到了一艘时尚的船只、并提供了"食物和水"。 你有疑问吗?
在 QEIVelocityConfigure (uint32_t ui32Base、uint32_t ui32PreDiv、 uint32_t ui32Period)中、最后参数"ui32Period"以毫秒或秒为单位。
也不会! (怀疑第1层) 最后一个参数是"系统时钟节拍"。 因此、您的 MS 和 S "断言"都失败。
在 QEIConfigure (uint32_t ui32Base、uint32_t ui32Config、 uint32_t ui32MaxPosition) 中、Last Paramete "ui32MaxPosion" 在速度测量中受影响? 如果是, 它如何影响速度?
这次您正确地注意到(pesky)最后一个参数。 该参数应指定、"电机旋转一圈期间到达的编码器脉冲数"。 您必须理解(或至少接受)这一点。 (怀疑第2层) 因此、"要计算速度"-您可以注意到、"真实速度"是通过以下公式计算的:
"QEIVelocityGet ()的返回值(即在由"QEIVelocityConfigure()"指定的时间范围内检测到的脉冲数)、后跟几个数学运算、这些运算会"标准化"速度计算。) 如果"不清楚"、请多次阅读。
对于"额外信用"-为什么 "您"(现在)不提供"少数"数学运算来将"QEIVelocityGet ()的返回值转换为(Rps 或 RPM)。 (因此我/他人可能会产生"怀疑"。)
您授予的" 验证答案"可能会使我无法在芝加哥的一个主要街道上进行访问-寻求"捐赠"。 (需要一些资金才能"远离"被遗弃的岛屿...)
您好 CB1、
感谢您的回复。
现在、我获得了正确的速度。 这是我的工作代码。
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
//正交编码器(QEI)
SysCtlPeripheralEnable (SYSCTL_Periph_QEI0);
GPIOPinConfigure (GPIO_PL1_PHA0);
GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_1);
SysCtlPeripheralEnable (SYSCTL_Periph_QEI1);
GPIOPinConfigure (GPIO_PL2_PHB0);
GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_2);
GPIOPinConfigure (GPIO_PL3_IDX0);
GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_3);
/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
void QEITaskFxn (UARg arg0、UARg arg1)
{
uint32_t qeVelocity = 0;
uint32_t qePosition = 0;
int32_t qeDirection = 0;
//禁用正交编码器。
QEIDisable (QEI0_BASE);
QEIConfigure (QEI0_BASE、(QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_RESET_IDX | QEI_CONFIG_POSIONY | QEI_CONFIG_SWAP)、1000);
//配置速度。
QEIVelocityConfigure (QEI0_BASE、QEI_VELDIV_1、30000000);
//注意:对于“ui32Period”,TM4C129NCPDT 支持120MHz 运行,因此我必须采用
//ui32Period = 1/4 (120MHz)= 30000000
//位置设置。
QEIPositionSet (QEI0_BASE、0);
//启用正交编码器速度。
QEIVelocityEnable (QEI0_BASE);
//启用正交编码器。
QEIEnable (QEI0_BASE);
//延迟一段时间...
Task_sleep (1000);
while (1)
{
//读取编码器位置。
qePosition = QEIPositionGet (QEI0_BASE);
System_printf ("\r\n++++++++ QEI.c:qePosition ={%d}++++++ \r\n"、qePosition);
System_flush ();
//读取编码器方向。
qeDirection=QEIDirectionGet (QEI0_BASE);
System_printf ("\r\n++++++++ QEI.c:qeDirection ={%d}++++++ \r\n"、qeDirection);
System_flush ();
//读取编码器速度。
QeiVelocity = QEIVelocityGet (QEI0_BASE);
System_printf ("\r\n++++++++ QEI.c:qeiVelocity ={%d}++++++ \r\n"、qeiVelocity);
System_flush ();
Task_sleep (1000);
}
此致、
Nimesh
您好、Nimesh、
你们在解决问题方面的坚持不懈精神感到自豪和高兴。 (主要是您自己-有一些/有一些指导。) 非常好,就是这样!
然而-我们不应该"深入挖掘"-现在您已经从"速度函数"中获得(部分)响应了吗?
您在前面采用了值10K (10、000) w/in "QEIConfig()"-而今天的帖子显示该值已降至1K。 (10分之一!) 我们是否可以问:"如何确定这一新价值?" 您是否(真正)在电机旋转一周期间实现1K 编码器脉冲?
另外,今天的 QEIVelocityConfig()揭示了30M (30,000,000)-过去是1K (1,000)-这是一个(真正)重大的变化-它不是吗? 在前面的一篇文章中、我们发现该参数的单位是"系统时钟节拍"、因此您使用30/120可得到1/4秒、或250ms 作为"速度测量周期"。 (以及之前的-建议您"考虑"更改"您使用"太小"(1K)参数的效果。)
很明显-添加的"光圈"(速度函数计算的时间)使您能够成功。 由于您的"测量孔径(或窗口)为1/4秒"-您是否必须将该结果乘以4才能实现(最有可能的) RPS? (电机每秒转数) 、然后再乘以60 (即 RPS * 60)、得出 RPM。 (每 分钟电机旋转数) 您还必须注意-"1,000参数(在 QEIConfig()中)也可能影响此类计算。 您可以通过"速度控制"电机旋转来确定这一点、并观察"速度"功能的输出。
请注意、带电机控制的情况下- RPM 占主导地位-和(其他)测量(但不包括 RPS)是"异常"、不太可能被"普遍"认可... (您可能希望向畜群中心移动"更多"...)