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.

[参考译文] CCS/TM4C123GH6PM:全 PWM 输出

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/754198/ccs-tm4c123gh6pm-full-pwm-output

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

您好!

我将 PWM 用作:

SysCtlPWMClockSet (SYSCTL_PWMDIV_8);
ui32PWMClock = SysCtlClockGet ()/ 8;
ui32Load =(ui32PWMClock / PWM_FREQUENCY)- 1;

SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
SysCtlPeripheralM1 (syPBMClock / PWM0


)- 1;SysCtlPWM0GPIPB0_GPIO0_GPIPB_Configure (SYSCB_PWM0_GPIO0_GPIO0_GPIO0_GPIO0_GPIO0_GPIO0_GPIO0_GPIO0_GPIO0_
GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_6);
GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_7);

PWMGenConfigure (PWM0_BASE、 PWM_GEN_0、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、ui32Load);

PWMGenEnable (PWM0_BASE、PWM_GEN_0);
PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT | PWM_OUT_1_BIT、TRUE);

//发送零 PWM
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、0);
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、 0); 

我可以使用示波器观察两个引脚上的波形。

问题在于:

PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、ui32Load); 

我不会获得完整的 PWM 输出(连续1)、但我得到0。 PWM_FREQUENCY 为18000。 如果我生成

PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、ui32Load-1); 

我得到接近99.9%的 PWM 波形

如何解决此问题?

编辑:

要生成 ui32Load、我有以下语句。 我确保在 Tiva-c 时钟被设定为80MHz 后运行 SysCtlClockGet。

//#define PWM_FREQUENCY 18000
#define PWM_FREQUENCY 500

volatile uint32_t ui32Load;
volatile uint32_t ui32PWMClock;

--

SysCtlPWMClockSet (SYSCTL_PWMDIV_8);
ui32PWMClock = SysCtlClockGet ()/ 8;
u32Load =(uMC32PWMClock);ui32PWMClock =(uPWM)

此致、

C.

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

    您好!

    [引用 user="can altineller"] ui32Load =(ui32PWMClock/PWM_FREQUENCY)-1;

     谢谢、您能使用语法荧光笔工具编辑您的代码。   请显示 ui32Load 尝试 生成18kHz 和 PWMCLK 速度等的值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    全部完成。 它在 ui32Load -1之前一直工作、在 ui32Load 时失败。 此致。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="can altineller"]直到 ui32Load -1、

    显然、它不起作用、或者您不会寻求帮助、对吧?

    任何不知道 PWMCLK 速度的人都不知道您选择的周期。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    PWM_FREQUENCY 500
    ui32Load 19999
    --
    ui32PWMClock = SysCtlClockGet ()/ 8;
    ui32Load =(ui32PWMClock/PWM_FREQUENCY)- 1;

    ui32PWMClock = 10000000;
    ui32Load =(10000000 / 500)- 1 = 19999

    问题是、我确实使 PWM 工作、但不使%100波形工作。

    在 ui32Load = 19999时、我得到一个99.99%的 PWM 波形。
    在 ui32Load = 20000时、我得到0。

    此致。
    C.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题出在使用"PWM_GEN_MODE_UP_DOWN"。 在此模式下、计数器向上计数到装载值、然后再次递减计数。 只要计数器的值等于装载值、它就会激活 PWM 输出。 每个周期都会发生两次这种情况、一次在向上、一次在向下。 异常位于加载值。 它只向上计数到装载值、但绝不向下计数到它(因为当计数器的值等于装载值时方向会改变)。 如果不需要中心同步、可以使用 PWM_GEN_DOWN。 否则、如果您需要100%占空比、则需要进行例外处理、并且当比较值等于加载值时、将引脚更改为 GPIO 输出高电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已更改为 PWM_GEN_MODE_DOWN、它确实生成了100% PWM 波形。 但是、此时输入0会产生1个高电平。
    因此、换句话说:

    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、0);

    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、ui32Period);

    生成相同的输出、始终为1。

    此致、
    C.A.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    注意您发布了10MHz PWMCLK 18kHz 频率。

    也许10MHz PWMCLK 要缓慢地生成18kHz 频率(100ns 节拍时间18k=1.8ms 周期)? 对于 TM4C1294、我们使用60MHz PWMCLK 来生成8kHz 至80kHz 的范围、具有上数/下数计数、如果有多个发生器、则为同步模式。

    例如、12.5kHz 需要4800个60MHz (16.6ns)/ 12.5kHz = 4800* 16.6ns = 80us 周期的周期