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.

[参考译文] LAUNCHTXL-F2.8377万S:Simulink中的eQEP速度计算

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/617754/launchxl-f28377s-eqep-speed-calculation-in-simulink

部件号:LAUNCHXL-F2.8377万S

大家好! ;)

我想使用Simulink中的eQEP块根据编码器信号计算机器的轴速。
我通读了eQEP模块的手册,其中说明高速时应使用位置计数器选项卡(∆X/T),低速时应使用速度计算选项卡(X/∆T)。
我为整个模型设定了2.5e-3秒(= 400 Hz速度计算率)的采样时间。 我在每个采样周期创建一个单位时间事件以重置位置计数器,并使用QPOSLAT寄存器中的锁定值来确定高速计算的速度。 我首先想计算位置计数器QPOSCNT的差值(使用单位延迟块并从当前QPOSCNT中减去此值),但输出是无意义的,通常为零。 但是,装置时间事件和QPOSLAT寄存器的解决方法是有效的(模型中计算的速度与我使用示波器查看编码器脉冲计算的实际轴速相匹配)。
但是,当我想要使用“eQEP边缘捕获装置”实施低速测量时,会出现问题: 手册中规定,当发生单元位置事件时,捕获计时器的值被写入QCPRD寄存器中(我预先调整了单元位置事件的频率,使其每4个QCLK周期发生一次)。 但当我在外部模式下使用Simulink范围查看QCPRD的值时,只有零。 您知道原因吗? 这些寄存器是否也会在设备时间事件上重置? 但是,手册中没有提到这一点(或者我没有发现这一点)。

此致,
Armin

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

    您好,Armin:

    您是否可以向我发送更多详细信息,并提供代码的快照,而该快照没有为您提供所需的结果?

    此外,在尝试进行低速测量时,还会遇到一些与您的顾虑相关的问题:

    1.您如何预缩系统时钟?

    2. QCLK的频率是多少?

    3.在QCPRD寄存器中读取计时器值之前,您是否在QEPSTS[UPEVNT]寄存器中观察到任何事件?

    同时确保以下情况:

    单元位置事件之间的6.5535万 计数不超过。
    加工单元位置事件之间没有方向变化。

    此致,

    Nirav

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

    你好,Nirav,


    1) 使用128预分频SYSCLKOUT。
    2) QCLK为4*500*速度(编码器孔数为500)。 对于UPEVNT的一代,我用4预分。
    3) 我真的不能回答这个问题。 是否有办法在Simulink中检查QEPSTS[UPEVNT]?

    UPEVNT之间的计数不超过6.5535万,因为轴速必须非常低。 我计算代码中的最小速度以防止溢出,结果是低于3 RPM。 我确保(使用可调直流电压源)直流机器的轴速大于3 RPM。 此外,轴不会改变旋转方向。
    我将在下面附上一些模型,代码和范围输出的屏幕截图。


    此致,
    Armin

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

    如果您查看为捕获计时器和位置选择的选项,则选择了“设备超时事件”。 下拉菜单下还有哪些其他可用选项?

    根据规范,可将捕获计时器(QCTMR)和捕获周期寄存器(QCPRD)配置为锁定以下事件。
    •QPOSCNT寄存器的CPU读取
    •装置超时事件

    我怀疑,由于您的代码将其配置为锁定设备超时事件,因此在QCTMR达到6.5535万之前不会发生此类事件。 因此,您不会从计时器中读取任何内容。

    您能否对所有选项卡(常规,位置计数器,速度计算,比较输出,看门狗单元, 信号数据类型,中断)和发送?

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

    你好,Nirav,

    如您所述,"捕获计时器和位置"的唯一其他可用选项是"CPU Read of QPOSCNT register"(QPOSCNT寄存器的CPU读取)。
    您的意思是计时器需要溢出才能锁定到QCPRD寄存器?
    我在下面附上了所有块选项卡的屏幕截图。 但是,我没有更改上一篇文章中未包含的选项卡中的任何内容。 只有默认值。 或者,您是否希望我展开所有选项,以便您可以查看其他可用选项?

    此致,
    Armin

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

    您好,Armin:

    感谢您发送快照,选项卡下选择的所有选项看起来都正常。 是否可以尝试  将"Capture Timer and Position (捕获计时器和位置)"值设置为 "CPU read of QPOSCNT register"(QPOSCNT寄存器的CPU读取)?  

    此致,

    Nirav

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

    你好,Nirav,

    我今天尝试了您建议的解决方案,它奏效了! 但是,这并不是所选的"Capture Timer and Position (捕获计时器和位置)"选项的问题:今天,当我选择"On a Unit Time Event"(在单元时间事件上)时,它也起作用。
    我认为这是一个轴速问题:到目前为止,在我的实验中,速度太高了。 因为当我今天将电压源设置为非常低的值(仅生成几个RPM速度)时,我的Simulink示波器突然显示了QCPRD的一些合理值! 当我将速度提高到300或400 RPM时,QCPRD值达到了某个最小值(例如500),尽管我不断提高速度,但并没有降低。 此最小值(如500或2000)似乎取决于预分值变量。
    您是否知道导致此行为的原因?

    此致,
    Armin

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

    好的,很高兴知道现在您在QCPRD中看到了一些值。 为了回答您的问题,我需要更多详细信息。

    您是否可以指定在不同的RPM速度配置下所获得的QCPRD的值,并在其开始饱和时显示趋势? 另外,您是否使用“On a Unit Time-Out Event”(设备超时事件)或“CPU Read of QPOSCNT register”(QPOSCNT寄存器的CPU读取)作为“Capture Timer and Position”(捕获计时器和位置)的选项?

    当QCPRD值开始饱和时,是否可以发送嵌入式代码的快照?

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

    你好,Nirav,


    我用不同的预校准器进行了一些实验,并在可用条目"ON POSITION counter Read"和"ON UNIT TIME-OUT EVA"之间更改了选项"Capture timer and position "。 每个采样周期生成一次单位时间事件,即每2.5 毫秒生成一次。
    在开始第一个使用编号1a的实验之前,我直接截取了模型和eQEP块参数的前三个选项卡的屏幕截图(其他块参数选项卡在实验期间保持不变)。 此外,我还截取了每个实验的Simulink示波器输出的屏幕截图(显示QPOSCNT和QCPRD值)。
    下面显示的屏幕截图和结果表都包含在随附的ZIP文件中。
    结果:

    编号		QCTMR预分频		器UPEVNT预分频		器捕获计时器和位置		饱和QCPRD值
    ----------------------------------
    装置													超时事件1616				
    1b			16						2				位置计数器读取			1009
    2a			16						4				装置超时事件				2969
    2b			16						4				位置计数器读取			1965
    3a			32						2				装置超时事件				635
    3b			32						2				位置计数器读取			467
    4a			32 						4				单元超时事件				1457
    4b			32						4				位置计数器读取			1812 



    不幸的是,我没有计算出所有这些值的转速(以RPM为单位)。 但我发现了另一件事: 当我开始在MCU上运行程序时,轴已经以较高的速度旋转,QCPRD值将持续为零,直到我将轴速降低到MCU能够捕获的较低值(即QCPRD不会饱和的低速)。 因此,我认为,几天前,《复兴共和与民主军》根本没有工作。 因为每次我测试模型时,轴都已经以更高的速度旋转。
    我实在无法解释这种行为,这是很特别的。


    此致,
    Armin

    e2e.ti.com/.../Saturation_5F00_Experiments.zip

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

    感谢您共享数据。 Simulink配置中缺少的一件事是对QEPST.UPEVNT信号的监控,我不确定该信号是否嵌入在代码中。 只有在发生UPEVNT时,才应该从QCPRD读取值,因为这是当QCTMR值锁定到QCPRD寄存器,QCTMR重置为0并重新开始时。 有关详细信息,请参阅技术参考手册。 您还可以在Mathwork论坛上发布此信息,以获取有关Simulink的帮助吗?

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

    你好,Nirav,

    我在MathWorks论坛上发布了此问题:
    www.mathworks.com/.../35.3589万-simulink-eqep-block-for-speed-calculation-with-c2000-mcu</s>2000
    我希望有人能告诉我们如何在Simulink中监控QEPST.UPEVNT信号。
    但是,非常感谢您迄今为止提供的详细帮助! ;)

    此致,
    Armin

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

    您好,Armin:

    现在,通过eQEP块,我们不支持在Simulink中监控QEPST.UPEVNT信号。

    但是,作为一种解决方法,可以使用“内存副本”块,并提供此信号的参考,以便能够读取其状态。

    有关如何使用“内存副本”的信息,请参阅随我们的支持软件包附带的示例型号“c2.8035万pmsmfion_CLA”。 (c2.8035万pmsmfed_CLA ->霍尔传感器C)

    然后,您可以设计模型,使其在 QEPST.UPEVNT信号周围读取"QUPRD",并查看它是否有帮助。

    此致,

    Venkatesh C

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

    非常感谢! 我很快就会尝试。

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

    大家好! ;)

    我想立即尝试此“内存复制”块。 您知道QEPSTS:UPEVNT的源代码符号是什么吗? 内存地址也可以。 我在技术参考手册中eQEP模块的内存图上找到了QEPSTS,但没有找到QEPSTS:UPEVNT的确切地址。
    互联网上是否有如何读取这些内存映射的教程? 还是一个包含C2000 MCU所有源代码符号的表? 当我将来有问题时,这可能会有帮助。 :D

    此致,
    Armin

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

    您好,Armin:

    请使用“&EQep1Regs.QEPSTS.All”读取QEPSTS寄存器的内容。

     由于UPEVNT是位字段,因此无法将其作为内存单元进行读取。

    读取QEPSTS的内容后,只需提取位(UPEVNT)即可。

    这可以使用移位和掩码操作来获得 UPEVNT的值。

    此致,

    Venkatesh C

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

    您好,Venkatesh,

    我成功地设置了“内存复制块”并提取了UPEVNT位。 这是16位字段中的第7位。
    我的Simulink示波器显示UPEVNT位一直为'1'。 这是因为单位位置事件每2.5 毫秒发生一次(这是我的基本采样时间),还是我必须手动将此位清除为'0'?
    技术参考手册说我应该写一个'1'来清除这个位,这是相当令人困惑的,因为当我清除它的时候,我希望这个位是'0',对吗?
    我应该如何为该位写'1'? 通过“内存复制块”,我只能访问整个位字段。 因此,我应该在该位字段中写入一个'0000 0000 1000 0000',或者在掩码和移动之前,写入我先前从寄存器中读出的相同二进制数?

    此致,
    Armin

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

    UPEVNT是w1c位,即写入1以清除。 这样,您仍然可以使用内存复制块写入此寄存器以清除该位。

    我认为可以将'0000 0000 1000 0000'写入此位字段,因为大多数位是只读的,而其他位需要1来清除它们。写入'0'将不起作用。

    此致,

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

    大家好! ;)

    我使用以下模型进行了一些进一步的测量,该模型输出1000 RPM以下速度的低速计算和超过此边界的速度的高速计算:


    1) 我观察到了UPEVNT位,同时通过SCI连接将转子速度从静止状态提高到更高速度(几个1000 RPM)。 为此,我只需断开传输块的速度信号。
    您可以看到UPEVNT位在'0'和'1'之间更改其值,尽管我没有手动清除它! 所以我认为它会自动重置。 在较高的速度下,它只会保持在'1'(可能是因为速度太高,以至于UPEVNT一直被触发)。


    2) 我通过SCI连接观察到转子速度和UPEVNT位。
    您可以看到,UPEVNT位也会发生变化,但不会像以前那样频繁地发生变化。 这是否与SCI连接的有限通信速度有关(因为它必须额外传输速度信号)?
    您还可以看到,当UPEVNT位设置为'1'时,低速信号仅发生几次变化(设置为大于1000 RPM的步骤是因为高速信号在该处激活)。 这意味着每次将UPEVNT位设置为'1'时,QCPRD值都不会更改。
    为什么会发生这种情况?


    是否可以像在Simulink中使用中断一样使用此UPEVNT位? 一旦将该位设置为'1',我就要触发一个子系统,该子系统使用QCPRD计算速度,然后清除该位。

    此致,
    Armin

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

    您好,  

    请您考虑使用触发式子系统,看看这是否有什么不同。

    此致,

    Venkatesh C