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.

[参考译文] EK-TM4C123GXL:EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/577265/ek-tm4c123gxl-ek-tm4c123gxl

器件型号:EK-TM4C123GXL

大家好。

我 开始使用 Tiva TM4C123G 中的 PWM 模块、我希望周期与系统时钟相同、然后我希望将占空比更改为50%、30%、 70%等。我已连接至 DSO 的 PF1引脚以检查宽度变化、同样的引脚也会在板载红色 LED 上重新选择以进行亮度变化。我尝试执行50%的操作、其工作正常、但当我尝试执行其他占空比时、它无法正常工作。 请检查以下代码。

#include
#include
#include "inc/hw_gpio.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"
#include "driverlib/gpio.h"
#include "driverlib/pwm.h"
#include "driverlib/adc.h"

int main (空)
{  

unsigned long ulPeriod;


SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);


SysCtlPWMClockSet (SYSCTL_PWMDIV_1);


SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);


SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);  

ulPeriod = SysCtlClockGet ();  


GPIOPinConfigure (GPIO_PF1_M1PWM5);

GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1);


PWMGenConfigure (PWM1_base、PWM_GEN_2、PWM_GEN_MODE_DOWN);

PWMGenPeriodSet (PWM1_base、PWM_GEN_2、ulPeriod);

PWMPulseWidthSet (PWM1_base、PWM_OUT_5、ulPeriod/2);//当我将 uIPeriod 除以任何其他值时、它不会给出预期的结果。

PWMOutputState (PWM1_base、PWM_OUT_5_BIT、true);


while (1)


谢谢你

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

    问题是 PWM 的周期是一个16位计数器、您加载了一个大于16位表示的数字。 函数 SysCtlClockGet ()将以 Hz 为单位返回16,000,000系统频率。 该周期的最大值为65、535。 我使用较小的周期值修改了您的代码。 我还添加了对 PWMGenEnable()的调用。 如果需要一个更长的周期、使用函数 SysCtlPWMClockSet()来设定 PWM 预分频器。

    #include 
    #include 
    #include "inc/hw_gpio.h"
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/mspet_syscludtl
    SysCtl/pwmp.h"
    
    
    
    (scmt_sysctl);#include "sysctl SysCtl_iptl (sys_iptl)
    
    
    
    1 (spertl)
    
    
    ;s_syscaliptl (spertl s1_sytl s_sytl)
    
    GPIOPinConfigure (GPIO_PF1_M1PWM5);
    GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1);
    PWMGenConfigure (PWM1_BASE、PWM_GEN_2、 PWM_GEN_MODE_DOWN);
    PWMGenPeriodSet (PWM1_base、PWM_GEN_2、ulPeriod);
    PWMPulseWidthSet (PWM1_base、 PWM_OUT_5、ulPeriod/3U);//现在使用不同的分频器
    PWMOutputState (PWM1_base、PWM_OUT_5_bit、true);
    PWMGenEnable (PWM1_base、PWM_GEN_2);
    while (1)
    {
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我想您不会启用 PWM_GEN_2块。 请通过使用 PWMGenEnable()启用并查看它是否起作用。

    当你使用 ulPeriod = SysCtlClockGet ()时、它返回处理器时钟速率、对于16MHz、该时钟速率将为16000000。 您正在尝试使用此值0xF42400来设置 PWM 周期。 当您的值较大时、周期重新加载寄存器仅为16位。 仅采用0x2400。 您在示波器上观察到的是这种情况吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    感谢 Bob 和 Charles Tsai 帮助我解决问题。我刚刚编辑了代码、它在所有分频器上都能正常工作。

    此致

    Sajad