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 模式中的 Tiva TM4C 定时器预分频器调整

Guru**** 2611705 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1160054/tm4c1294ncpdt-tiva-tm4c-timer-prescalor-adjustment-in-pwm-mode

器件型号:TM4C1294NCPDT

您好!

我们希望使用 Tiva TM4C1294NCPDT uC 为我们的项目生成范围(1-1KHz)内的频率输出、固定为50%。

我已经在16位 PWM 模式中配置了通用定时器。 在使用预分频器时、我在调整计时器周期方面遇到问题。 我已将预分频器设置为4、从而允许最大加载值为327679 (0x4FFFF)。  对于50%占空比、最大匹配值为163839、因此我将预分频器匹配值设置为2。 只有当加载值高于262143 (0x3FFFF)(即预分频器3的最大值)时、PWM 输出才正确。 当装载值小于262144时、周期和半周期都为 false。

这是否意味着在使用预分频器4时、我只能写入范围为[327679、262144]且不小于262144的加载值?  我是否正确设置了预分频器? 或者是否有任何关于为加载和匹配值设置预分频器的系统详细信息?

#include <stdbool.h>
#include <stdint.h>
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "inc/hw_gpio.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_timer.h"
#include "inc/hw_types.h"

int main(void) {

    SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120E6);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER3);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER3)) {}
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA)) {}

    GPIOPinConfigure(GPIO_PA6_T3CCP0);
    GPIOPinTypeTimer(GPIO_PORTA_BASE, GPIO_PIN_6);

    TimerClockSourceSet(TIMER3_BASE, TIMER_CLOCK_PIOSC);

    TimerPrescaleSet(TIMER3_BASE, TIMER_A, 4);
    TimerPrescaleMatchSet(TIMER3_BASE, TIMER_A, 2);

    TimerConfigure(TIMER3_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM);

    uint32_t    per= 327679;// 4FFFF
    TimerLoadSet(TIMER3_BASE, TIMER_A, per);// Load Value
    TimerMatchSet(TIMER3_BASE, TIMER_A, per / 2);// Match value

    TimerEnable(TIMER3_BASE, TIMER_A);

    while (1) {
    }
}

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

    您好!

     如果您使用的是预分频器、那么您可以引用如下示例所示的内容来创建50%占空比。  

    TimerPrescaleSet (Timer1_base、timer_B、123);

    TimerLoadSet (Timer1_base、timer_B、45678);

    周期= TimerLoadGet (Timer1_base、timer_B)+ TimerPrescaleGet (Timer1_base、timer_B)* 65536;
    占空比=周期/2;

    TimerPrescaleMatchSet (Timer1_base、timer_B、Duty / 65536);

    TimerMatchSet (Timer1_base、timer_B、占空比% 65536);

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

    您好、Charles、

    谢谢你。 您共享的示例工作正常。

    此致、
    哈桑