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.

[参考译文] TM4C129ENCPDT:端口 H 的 Tigger 例程

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1161134/tm4c129encpdt-tigger-routine-for-port-h

器件型号:TM4C129ENCPDT

您好!

我们是连接到端口 H 的编码器。编码器实际上是一个3位旋钮、2位用于识别编码器是按时钟还是按时钟旋转、第3位用作按钮、在的过程和微调之间切换 电源输出电流。 旋钮零件号为427-121251AL121。

我们将在两个中断之后运行;

  1. GPIO_PIN_0上的中断1:用于检测旋钮的输出电流设置中断顺时针旋转或反时钟。 该中断工作正常、没有弹跳效应
    1. 因为信号上有一个1kRx0.1uC 滤波器。

  2. GPIO_PIN_2上的中断2: 粗略/精细调节中断、用于定义要使用粗略分辨率或精细分辨率进行调整的输出电流。 该中断触发两次。 由于信号上有一个1kRx0.1uC 滤波器、因此不会出现抖动效应。

中断1工作正常。 它被设置为在脉冲的两个边沿上触发。 如定义 为 RSW_D0引脚的 GPIO_PIN_0引脚的以下代码所示;

void EncoderPulses_interrupt_enable(void)
{

    IntMasterDisable();
    GPIOPinTypeGPIOInput(ENC_PORT, RSW_D0);
    GPIOPinTypeGPIOInput(ENC_PORT, RSW_D1);
    GPIOPadConfigSet(ENC_PORT, RSW_D0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
    GPIOPadConfigSet(ENC_PORT, RSW_D1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);  // Enable weak pullup resistor 
    GPIOIntDisable(ENC_PORT, RSW_D0);        // Disable interrupt 
    GPIOIntClear(ENC_PORT, RSW_D0);      // Clear pending interrupts
    GPIOIntRegister(ENC_PORT, Encoder_IntHandler);
    GPIOIntTypeSet(ENC_PORT, RSW_D0, GPIO_BOTH_EDGES);          
    GPIOIntEnable(ENC_PORT, RSW_D0);     // Enable interrupt
    IntMasterEnable();

}

中断2每次被激活时触发两次。 该中断配置为仅在下降沿触发。 以下是在引脚 GPIO_PIN_2上配置中断的代码、该引脚定义为 RSW_D2引脚。

void EncoderMode_interrupt_enable(void)
{

    IntMasterDisable();
    GPIOPinTypeGPIOInput(ENC_PORT, RSW_D2);
    GPIOPadConfigSet(ENC_PORT, RSW_D2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);  // Enable weak pullup resistor
    GPIOIntDisable(ENC_PORT, RSW_D2);        // Disable interrupt
    GPIOIntClear(ENC_PORT, RSW_D2);      // Clear pending interrupts 
    GPIOIntRegister(ENC_PORT, Encoder_IntHandler);
    GPIOIntTypeSet(ENC_PORT, RSW_D2, GPIO_FALLING_EDGE);             // Configure  falling edge trigger
    GPIOIntEnable(ENC_PORT, RSW_D2);     // Enable interrupt
    IntMasterEnable();

}

以下是在两个引脚(例如  GPIO_PIN_2 和 /或 GPIO_PIN_0)上触发中断时调用的函数

void Encoder_IntHandler(void) 
{
    SysCtlDelay(1*17000);//Clear the Interrupt after the Delay to avoid multiple Interrupt entries.
    if(GPIOIntStatus(ENC_PORT, false) & RSW_D0) //Check if the Interrupt is for RSW_D0 (GPIO_PIN_0) or RSW_D2 (GPIO_PIN_2)
    {
        uint8_t i,j;
        GPIOIntClear(ENC_PORT, RSW_D0);
        i = GPIOPinRead(ENC_PORT,RSW_D0);
        j = GPIOPinRead(ENC_PORT,RSW_D1);
        if (j==2){j = 1;} // When GPIO_PIN_1 is HIGH it GPIOPinRead() will report 0x2H. Replace it to 0x1H

        //Detect if the Encoder is moved CC or ACC 
        if(i == j){EncoderServiceReqType = EncoderCCW;} //Encoder moved Anti-Clockwise
        else{EncoderServiceReqType = EncoderCW;} //Encoder moved Clockwise


    }
    else
    {
        GPIOIntClear(ENC_PORT, RSW_D2);
        EncoderServiceReqType = EncoderMBtn;
    }

    EncoderServiceReqFlag = 1;

}

定义是:

#define ENC_PORT                GPIO_PORTH_BASE

#define RSW_D0                  GPIO_PIN_0 // Interrupt 1 Pin.
#define RSW_D1                  GPIO_PIN_1
#define RSW_D2                  GPIO_PIN_2 //Interrupt 2 Pin. Encoder Push Button to switch between Fine and Coarse adjustment

感谢大家的帮助。

此致、

Sahil

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

    请注意、 需要在两个边沿触发 GPIO_PIN_0、因为它必须检测编码器是顺时针还是逆时针移动。

    当在上升 沿或下降沿调用中断1时、中断服务例程读取 GPIO_PIN_1、根据高电平或低电平值、它检测到移动是 CC 或 ACC。

     GPIO_PIN_2上的中断2 应该位于下降沿或上升沿。

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

    这是一个旋转编码器和用作前面板控制的瞬时按钮开关?

    无需使用中断来记录更改、只需定期轮询三个引脚即可。

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

    您好!

    [引用 userid="163081" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1161134/tm4c129encpdt-tigger-routine-for-port-h/4365874 #4365874"]  GPIO_PIN_2上的中断2 应该位于下降沿或上升沿。

    我有点困惑。 在原始帖子中、您说中断2仅在下降沿生成。 这里您说的是双边沿。 哪一个是正确的? 根据您的代码片段、您将配置 PH2的中断2上的下降沿。  

    输入信号的速度、尤其是 在 RSW_D2上的速度有多快? 在 ISR 中为第一个下降沿服务中断2时、下一个下降沿是否也会出现? 这意味着在您为中断2退出 ISR 后、它将立即为下一个 ISR 重新输入 ISR。 另一个需要注意的问题是 RSW_D2和 RSW_D0是否可以大致同时出现? 如果它们大致同时出现、那么当您进入 ISR 时、您首先检查是否检测到 RSW_D0、并且只清除中断1的标志、而不是同时清除两者。 中断2丢失。  

    我建议您不要在 ISR 中使用 if-else、而是使用两个"if"条件。 一个'if'用于中断1、另一个'if'用于中断2。 这样、您就不会错过任何一个。  

    您是否可以进行 一个 RSW_D0永远不会激活的实验? 换言之、只有 RSW_D2会激活。  也许最简单的方法是简单地禁用中断1以用于实验目的。 这样、您可以在没有 RSW_D0的情况下进行确认、 RSW_D2仍将触发两次或仅一次。

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

    您好、Charles、

    GPIO_PIN_2 配置为仅在下降沿触发、如您在片段中所见。 但是、问题在于 GPIO_PIN_2 在下降沿和上升沿触发。

    没有生成多个中断、因为我有 RC 滤波器来避免任何抖动效应。

    GPIO_PIN_0和 GPIO_PIN_2 不 会同时激活、事实上它们可能永远不会同时激活。 由于它是用于设置电源输出电流 的编码器旋钮、因此用户将旋转仅激活 GPIO_PIN_0的旋钮。 当  用户将旋钮推入内部时、GPIO_PIN_2将被激活。 我们绝不会在旋转时同时按下旋钮。 这意味着这两个中断不能同时激活。

    正如您所建议的、让我尝试用两个 if 语句替换 if-else 语句 、看看它是否可以解决问题。

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

    您好!

    因此我尝试用两个 if 语句替换 if-else 语句、但它没有帮助。 但是、当我将中断2更改为在 LOW_LEVEL 上激活时(之前已将其配置为在下降沿激活)、解决了问题。

    我可以回忆一下我们在处理两个中断时遇到的类似问题 、这两个中断都是在之前配置为在下降沿激活的、并且两个中断都与引脚2和引脚3上的端口 D 相关。 当我们将一个中断更改为下降、将另一个中断更改为上升沿时、解决了问题。

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

    您好!

     很高兴您解决了这个问题。 我仍然不清楚下降沿为什么会触发两个中断、因为它不应该触发。 GPIO 必须已经看到两个下降沿、或者这两个边沿在 ISR 退出前变得非常快、或者输入上仍然有毛刺脉冲。 您可以尝试添加软件去抖以消除输入上出现毛刺的任何可能性。  总之、如果您 对电平中断满意、并且可以为您解决问题、这也很好。  

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

    我已经为两个中断确定了引脚的范围、并且我确信、由于我们在两个引脚上都使用 RC 滤波器、因此没有干扰/抖动等。

    在我看来、它与不提供单个引脚中断功能的端口有关。 有一些值得注意的东西!

    感谢您的帮助和交叉检查。  

    你度过了美好的一天。