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.

[参考译文] TM4C1294NCPDT:PWM 信号保持高电平

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/779573/tm4c1294ncpdt-pwm-signal-stays-high

器件型号:TM4C1294NCPDT

您好!

我尝试使用 PWM 模块生成 PWM 信号。 基本上、配置 PWM 所涉及的步骤很简单、但我最终得到一个信号、该信号一直保持高电平。 请在下面找到我的初始化步骤:

      ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |

      SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |

      SYSCTL_CFG_VCO_480)、120000000);

uint32_t period = ui32SysClock /250;/*250 Hz*/

SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);

HWREG (GPIO_PORTF_BASE + GPIO_LO_LOCK)= 0x4C4F434B;

GPIOPinConfigure (GPIO_PF0_M0PWM0);
ROM_PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_1);
GPIOPinTypePWM (PWM0_BASE、GPIO_PIN_0);
PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、PERIOD);
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0_BIT、(周期* 10)/ 100);/*10%*/


PWMIntEnable (PWM0_BASE、PWM_INT_GEN_0);
PWMGenIntRegister (PWM0_BASE、PWM_GEN_0、pwmIsrCh0);
PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_INT_CNT_LOAD);
IntEnable (PWM0_BASE);
PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT、TRUE);
PWMGenEnable (PWM0_BASE、PWM_GEN_0);

静态 void pwmIsrCh0 (void)
{
uint32_t counter_value =(10 *周期)/100;

PWMGenIntClear (PWM0_BASE、PWM_GEN_0、PWM_INT_CNT_LOAD);

PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0_BIT、COUNTER_VALUE);
} 

ISR 被成功调用。

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

    函数 GPIOPinTypePWM 的第一个参数是 GPIO 端口的基址、而不是 PWM 的基址。 上面代码的第10行应如下所示:

    GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0);
    

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

    是的、你是对的。
    从代码复制时、这只是一个拼写错误。

    实际配置就像您所展示的那样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    生成周期的 PWM 加载寄存器仅为16位。 您加载的值太大(120,000,000 / 250 = 480,000或0x75300)。 只有最后16位被载入到寄存器、0x5300或21、248。 用于48、000脉宽的比较值小于16位、但由于它大于加载值、计数器永远不会生成匹配条件、因此 PWM 输出保持高电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我修复了另外两个副本错误。 这是工作代码。

    #include 
    #include 
    #include "inc/hw_types.h"
    #include "include/hw_memmap.h"
    #include "inc/hw_gpio.h"
    #include "inc/hw_ints.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pwm.h"
    #include "drivermap/driverlib/trl.h"
    
    
    
    //
    ////主"C"语言入口点。
    ////
    *****************
    静态 void pwmIsrCh0 (void);
    
    uint32_t period;
    
    int
    main (void)
    {
    uint32_t ui32SysClock;
    
    //
    //从 PLL 以120MHz 运行。
    //
    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
    
    周期= ui32SysClock / 2500;/*2.5 KHz */
    
    SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    GPIOPinConfigure (GPIO_PF0_M0PWM0);
    PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_1);
    GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0);
    PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、PERIOD);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、(周期* 10)/ 100);/*10%*/
    PWMIntEnable (PWM0_BASE、PWM_INT_GEN_0);
    PWMGenIntRegister (PWM0_BASE、PWM_GEN_0、pwmIsrCh0);
    PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_INT_CNT_LOAD);
    IntEnable (INT_PWM0_0);
    PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT、TRUE);
    PWMGenEnable (PWM0_BASE、PWM_GEN_0);
    
    while (true)
    {
    }
    }
    
    静态 void pwmIsrCh0 (void)
    {
    uint32_t counter_value =(10 *周期)/100;
    PWMGenIntClear (PWM0_BASE、PWM_GEN_0、PWM_INT_CNT_LOAD);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0_BIT、COUNTER_VALUE);
    }
    

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

    Bob、您好!

    感谢您花时间为我创建此示例。  

    事实上,我发现了这个错误。 我没有写入"PWM_OUT_0"、而是写入"PWM_OUT_0_bit"。

    现在它按预期工作。  

    一切都很棒!