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.

[参考译文] TMS320F28027:XINT 定时器值不符合预期

Guru**** 2522770 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1325608/tms320f28027-xint-timer-values-not-as-expected

器件型号:TMS320F28027

您好!


我正在尝试使用 GPIO6/XINT1来捕获/测量 PWM 信号。  (ECAP 引脚不可用)

我看到基于 TRM 和引脚输入的测量值与预期值之间存在不匹配情况

在测试中、我将从 EPWM3生成占空比为50%的10kHz PWM 信号、并将其连接到 GPIO6。   

脉冲高电平时间=脉冲低电平时间= 50us

脉冲周期= 100us

从 TRM、xintctr 时钟源为 SYSCLKOUT

系统时钟= 60MHz

因此、我的预期是50us 高电平时间或低电平时间将是60MHz 时钟的3000次计数。  相反、我看到高电平时间测量值为50、低电平时间测量值为~227。

在初始化时、我首先将极性仅设置为上升沿、以便知道捕获的是哪个边沿。  在第一次捕获时、我将极性切换到两个边沿。  下面是用于 INIT 和 ISR 的代码:

初始化:

EALLOW;

GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;// 0=GPIO、1=EPWM1A、2=Resv、3=Resv
GpioCtrlRegs.GPADIR.bit.GPIO6 = 0;// 1=输出、0=输入

GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 6;// GPIO6作为中断源
XIntruptRegs.XINT1CR.BIT.POLARITY = 0x1;//在上升沿触发以开始

xint1_startup_flag =真;
XIntruptRegs.XINT1CR.bit.enable = 0x1;

EDIS;

ISR:

if (xint1_startup_FLAG){
xint1_startup_FLAG = false;
XIntruptRegs.XINT1CR.BIT.POLARITY = 0x3;
xint1_nextedge_is_falling=true;

否则{
if (xint1_nextedge_is_falling){
xint1_nextedge_is_falling=false;
xint1_pulse_high_time = XIntruptRegs。 XINT1CTR; //读数为50,预期为3000

否则{
xint1_nextedge_is_falling=true;
xint1_pulse_low_time = XIntruptRegs。 XINT1CTR;  //读数~220、预期为3000

我通过逻辑分析仪确认 PWM 波形正确:10kHz 时占空比为50%。  测试硬件是28027的 LaunchPadXL。

您有什么建议、为什么我得到的是这些测量值而不是预期值?  或者我对数据表的解释是否错误?

谢谢!

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

    标记、

      如果您只尝试测量预期计数6000的下降(或上升)沿、该行为是否有任何不同?

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

    我已经将输入 PWM 频率减少到了5kHz、仍然是50%的占空比、并且我已经从 XINTCTR 准备好的值没有太大的变化。

    谢谢。

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

    因此、无论您的 PWM 频率如何、XINTCTR 值变化都不大? 假设您已经验证 SYSCLKOUT 是60MHz。 您能给我发送您的密码吗?  如果您愿意、您可以私下与我分享。 您可以通过首先与我发起一个友谊请求来实现此目的。 您可以通过在将光标悬停在我的名字上时选择"请求好友"选项来执行此操作。

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

    EPWM3时序按预期工作以生成 PWM、这表明 SYSCLKOUT 在60MHz 运行。  (除了确认 DeviceInit 中的设置外)

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

    了解。 您是否也在寄存器中看到了错误的值? 即、不是通过变量读取该值、而是在寄存器窗口中查看 XINTCTR 的值。

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

    当我到达 XINT ISR 时、XINTCTR 不会冻结。  但是、 当 ePWM 运行时、我看到寄存器窗口中 XINTCTR 的值显示大于50或270的值、可能高达3000。   那么、这可能是不能正确读取寄存器的问题吗?

    我正在使用


    uint16_t XINT1_PULSE_HIGH_TIME;

    xint1_pulse_high_time = XIntruptRegs。 XINT1CTR;

    XIntruptRegs 来自 TI 库。。。我将深入研究一下、看看它是否被正确映射。

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

    它已正确映射。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
     所以可能是不能正确读取注册表的问题吗?

    我还觉得寄存器未被正确读取。  

    尝试的想法极少:

    1. 在一个循环中连续读取 XINT1CTR、如果计数器的值=3000、则取一个 ESTOP0。 当然、如果读取该寄存器的方式有问题、这种方法不起作用。  
    2. 尝试将 GPIO12 (或更高版本)作为您的 XINT1引脚(即非 PWM 引脚)。 不知道您是否在将 GPIO6配置为 XINT1后不小心将其重新配置为 PWM 引脚。  
    3. 请尝试 XINT2或 XINT3。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    标记、

               还有一个想法要尝试:完全不要让 PWM 参与进来。 只需切换 GPIO 引脚(作为 GPIO)并测量脉冲宽度。 只需行代码即可实现此目的、

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

    您好、Hareesh。

    重新阅读 XINTCTR 的说明后、这也许是关于如何使用 XINTCTR 的错误假设的问题。  在 TRM 第1.6.5.2节中、计数器在中断边沿复位为0。  这就是我在 ISR 中读取接近于零的值的原因。  ISR 被触发、但是 XINTCTR 刚刚被清除。

    这导致了一个后继问题... XINTCTR 的用例是什么?  1.6.5.2节还说明了"这些计数器可被用来准确地标记发生中断的时间"。  如果 XINTCTR 在中断时为零、如何工作?  似乎应该有一个捕获寄存器、这样就可以工作了。

    感谢你的帮助。

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

    "爸,我想和你复合。" 感谢您指出。 自从我从事该外设工作以来已经很久了。

    XINTCTR 的用例是什么?  [/报价]

    如果读取计数、它会告知您检测到边沿之前的时间。  

    似乎应该有一个捕获寄存器才能使其正常工作。

    对于您尝试执行的操作、您需要使用捕获单元。

    [/quote]