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.

[参考译文] TM4C1231H6PGE:如何将特定 GPIO 配置为 PWM

Guru**** 2815875 points

Other Parts Discussed in Thread: TM4C123GH6PM, EK-TM4C123GXL, TM4C1231H6PGE

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/879383/tm4c1231h6pge-how-to-configure-a-particular-gpio-to-pwm

器件型号:TM4C1231H6PGE
主题中讨论的其他器件:TM4C123GH6PMEK-TM4C123GXL

您好,

我要求生成导通时间为1ms、关断时间为100ms 的脉冲。是否可以使用 PWM 进行相同的操作?

如果是、请根据上述要求帮助我将 GPIO 配置为 PWM。

谢谢、此致、

Rohith。

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

    您好、Rohith、

    是的、可以执行此操作、但您确定要总周期为101ms 吗? 100ms 更简单、更一致。

    此外、您在帖子中列出的 MCU 没有 PWM 外设(尽管您也可以使用计时器来实现)。 您可能希望使用 TM4C123GH6PM。

    您可以在[安装路径]\TivaWare_C_Series-2.1.4.178\examples\peripherals\PWM 中查看我们的 PWM 示例

    您可能会发现 invert.c 最简单的方法、因为您只需不使用 PWMOutputInvert API 即可、其余配置都是为您准备的。

    在此期间、您将需要使用 PWM 时钟进行系统时钟的分频。 这是因为周期配置设置为16位、因此对于16MHz、最多只能获得244Hz 的宽度。 但是、如果您将16MHz 系统时钟除以16、使 PWM 时钟为1MHz、那么您可以通过将周期加载为10000来获得100ms 的周期(或者尝试使用9901加101ms、但它不会始终是101ms 的100%时间)。

     PWMClockSet 被用来设定系统时钟与 PWM 时钟的分频比。 您可以选择1、2、4、8、16、 32和64。 即使在80MHz (最大系统时钟速度)下、您也可以仅使用/32分频来支持此周期。 请注意、要包含在 PWM 基础之上的 PWMClockSet 变量应为 PWM_SYSCLK_DIV_x、其中 x 是其中的一个选项。

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

    您好,Ralph,

    感谢大家的答复,感谢大家的答复。

    下面是用于 PWM 生成的函数。 除此之外,任何文件中都需要进行任何更改,如 PIN 地图中所示,或者我是否缺少某些内容。

    加载此特定映像后,将继续重新引导此映像,其中添加了该函数。


    内部
    PWC_PIN_103 (空)



       //
       //将时钟设置为直接从外部晶振/振荡器运行。
       // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
       板上的//晶体。
       //


       SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                      SYSCTL_XTAL_25MHz);


       //
       //将 PWM 时钟设置为系统时钟。
       //
       SysCtlPWMClockSet (SYSCTL_PWMDIV_16);

      



       //
       //必须启用 PWM 外设才能使用。
       //
       SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);

       //
       //对于此示例、PWM1与 PortL 引脚5一起使用。  实际端口和
       //使用的引脚可能与您的器件不同、请参阅的数据表
       //更多信息。
       // GPIO 端口 L 需要启用、以便可以使用这些引脚。
       // TODO:将其更改为您正在使用的 GPIO 端口。
       //
       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);

       //
       //配置 GPIO 引脚复用以选择这些引脚的 PWM1功能。
       //此步骤选择可用于这些引脚的替代功能。
       //如果您的器件支持 GPIO 引脚功能多路复用、这是必需的。
       //请查阅数据表以查看每个引脚分配的函数。
       // TODO:更改此选项以选择您正在使用的端口/引脚。
       //
       GPIOPinConfigure (GPIO_PL5_T2CCP1);

       //
       //为此引脚配置 PWM 功能。
       //请查阅数据表以查看每个引脚分配的函数。
       // TODO:更改此选项以选择您正在使用的端口/引脚。
       //
       GPIOPinTypePWM (GPIO_PORTL_BASE、GPIO_PIN_5);

       //
       //将 PWM1配置为在不同步的情况下进行加/减计数。
       //
       PWMGenConfigure (PWM1_base、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN |
                       PWM_GEN_MODE_NO_SYNC);

       //
       //将 PWM 周期设置为250Hz。  以计算适当的参数
       //使用以下公式:n =(1 / f)* SYSCLK。  其中 N 是
       //函数参数、f 是所需的频率、SYSCLK 是
       //系统时钟频率。
       //在本例中、您得到:(1/250Hz)* 16MHz = 64000个周期。  请注意
       //可以设置的最大周期为2^16。
       // TODO:修改此计算以使用您当前的时钟频率
       //使用。
       //
       
       PWMGenPeriodSet (PWM1_base、PWM_GEN_0、64000);

       //
       //将 PWM0设置为25%的占空比。  您将占空比设置为函数
       /的周期。  由于周期是在上面设置的、因此您可以使用
       // PWMGenPeriodGet ()函数。  在本示例中、PWM 将为高电平
       // 25%的时间或16000个时钟周期(64000 / 4)。
       //
       PWMPulseWidthSet (PWM1_base、PWM_OUT_0、
                        PWMGenPeriodGet (PWM1_base、PWM_GEN_0)/ 1);

       //
       //启用 PWM1位0 (PD0)输出信号。
       //
       PWMOutputState (PWM1_base、PWM_OUT_0_bit、true);

       //
       //启用 PWM 发生器模块。
       //
       PWMGenEnable (PWM1_base、PWM_GEN_0);

       //
       //在生成 PWM 信号时永久循环。
       //
      


    注:请忽略所用的频率和占空比以及所写的注释,以检查是否可以看到脉冲。

    谢谢、

    Rohith。

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

    您好、Rohith、

    正如我在原始帖子中提到的、您选择的器件没有 PWM 外设。 您能否使用 EK-TM4C123GXL LaunchPad 进行测试和评估?

    如果不是、那么您需要研究执行一个基于定时器的 PWM、如中的示例:[INSTALL Path]\TivaWare_C_Series-2.1.4.178\examples\peripheral\timer\PWM.c

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

    您好,Ralph,

    感谢您的快速响应。

    没有可用的 LaunchPad、而 TM4C1231H6PGE 是 PWM 生成的唯一可能选项。

    我们能否参照以下文章中提到的示例继续实现该函数:[安装路径]\TivaWare_C_Series-2.1.4.178\examples\peripheral\timer\PWM.c?

    谢谢、此致、

    Rohith。

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

    您好、Rohith、

    是的、这将是您使用该器件进行 PWM 的唯一选择... 但是、如果 PWM 是您的主要目标之一、我仍然认为您应该选择具有实际 PWM 外设的 TM4C 器件。 我的两分看法。

    请告诉我、您是否在成功实施该示例方面遇到了挑战。

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

    您好、Ralph、

    要生成持续时间为99.5mSec 和关闭持续时间为0.5msec 的100ms 脉冲,值是25MHz 的系统时钟。

    ====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

    您能不能查看该代码、并告诉我它是否正确、或者我是否遗漏了某个内容。

    ====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================


    #include
    #include
    #include "Stellaris/inc/hw_gpio.h"
    #include "Stellaris/inc/hw_ints.h"
    #include "Stellaris/inc/hw_memmap.h"
    #include "Stellaris/inc/hw_timer.h"
    #include "Stellaris/inc/hw_types.h"
    #include "Stellaris/driverlib/gpio.h"
    #include "Stellaris/driverlib/interrupt.h"
    #include "Stellaris/driverlib/pin_map.h"
    #include "Stellaris/driverlib/sysctl.h"
    #include "Stellaris/driverlib/timer.h"
    #include "Stellaris/driverlib/uart.h"
    #include "Stellaris/utils/uartstdio.h"

    //
    //
    //! 添加到组 timer_examples_list
    //!

    使用计时器的 PWM (PWM)


    //!
    //! 此示例展示了如何配置 Timer1B 以在上生成 PWM 信号
    //! 定时器的 CCP 管脚。
    //!
    //! 此示例使用以下外设和 I/O 信号。  您必须执行的操作
    //! 查看这些内容并根据您自己的董事会的需要进行更改:
    //! - Timer1外设
    //! - GPIO 端口 L 外设(用于 T2CCP1引脚)
    //! T2CCP1 - PL5
    //!
    //
    //

    //
    //
    // g_ui32SysClock 包含系统时钟频率
    //
    //
    #if defined (target_IS_TM4C129_RA0)||                                        \
       已定义(TARGET_IS_TM4C129_RA1)||                                        \
       已定义(TARGET_IS_TM4C129_RA2)
       uint32_t g_ui32SysClock;
    #endif


    //
    //
    //将 Timer0B 配置为占空比为99%的16位 PWM。
    //
    //
    int PWM_PIN_107 (空)

       //
       //将时钟设置为直接从外部晶振/振荡器运行。
       // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
       板上的//晶体。
       //


       SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                      SYSCTL_XTAL_25MHz);

     //
       //将 PWM 时钟设置为系统时钟。
       //
      
       //
       //必须启用 Timer0外设才能使用。
       //
       SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);

       //
       //对于此示例、T0CCP1与端口 L 引脚1一起使用。
       //您使用的实际端口和引脚可能有所不同,请参阅
       //数据表以了解更多信息。
       // GPIO 端口 L 需要启用、以便可以使用这些引脚。
       // TODO:将其更改为您正在使用的 GPIO 端口。
       //
       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);

       //
       //为定时器/CCCP 功能配置 GPIO 管脚复用。
       //只有当您的器件支持 GPIO 引脚功能多路复用时才需要此功能。
       //研究数据表以查看每个引脚分配的函数。
       // TODO:更改此选项以选择您正在使用的端口/引脚
       //
       GPIOPinConfigure (GPIO_PL5_T2CCP1);



       //
       //为 CCP 管脚配置 ccp 设置。  该函数也会提供
       将这些引脚的//控制到 SSI 硬件。  请参阅中的数据表
       //查看每个引脚分配的函数。
       // TODO:更改此选项以选择您正在使用的端口/引脚。
       //
       GPIOPinTypeTimer (GPIO_PORTL_BASE、GPIO_PIN_5);


       //
       //将 Timer2B 配置为16位周期定时器。
       //
       TimerConfigure (TIMER2_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PWM);

     
       //
       TimerLoadSet (TIMER2_base、TIMER_B、10000);

       //
       //将 Timer2B 匹配值设置为加载值/2。
       //
       TimerMatchSet (TIMER2_base、TIMER_B、
                     TimerLoadGet (TIMER2_base、TIMER_B)/ 2);

       //
       //启用 Timer2B。
       //
       TimerEnable (TIMER2_base、TIMER_B);




    谢谢、此致、

    Rohith。

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

    您好、Rohith、

    我们不仅会进行盲目的代码审查、您还需要运行代码并解释不起作用的内容。

    关于如何设置持续时间的问题、您需要  根据所需的持续时间设置 TimerLoadSet 和 TimerMatchSet。 您还需要使用宽定时器、否则您将没有足够的位来获得该长周期。 如果需要、我可以查看我们在工作周中有哪些示例。 但您可以尝试在 E2E 上搜索有关该主题的更多信息。 您可以在 E2E 上找到广泛的计时器示例、也应该在计时器 PWM 上发布一些帖子。 因此、如果您对您目前所做的工作有挑战、请查看您可以在周一挖掘和报告的内容、然后我可以查看它、看看还有哪些内容可能会丢失。 您还需要在某个时间点获取 o 示波器、这样您就可以看到您正在获得的输出-这将是重要的信息。

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

    您好、Ralph、

    关于实现的输出、我可以看到示波器上生成的脉冲。谢谢。

    TimerLoadSet (TIMER2_base、TIMER_B、64000);

    TimerMatchSet (TIMER2_base、TIMER_B、
                     TimerLoadGet (TIMER2_base、TIMER_B)/ 5);

    对于上述设置持续时间的组合、我可以看到使用390Hz 频率和占空比(90%)生成的脉冲(关闭持续时间为259us)。

    优化后的值可以满足哪些要求(99.5ms 的持续时间和0.5ms 的关闭持续时间)。

    我可以看到的一些挑战:

    1)如果我为使用 Timer2A 和 Timer2B 的 PWM 配置了两个引脚,我可以独立地获得 脉冲,但如果我想同时使用它们,那么只有 Timer2A 可以提供脉冲,但不能提供2B,为什么呢?

    2)是否可以在两个运行相同的引脚上生成脉冲、其中一个是 WideTimer1B、另一个是 Timer1A、持续时间相同(例如 TM4C1231H6PGE 上的引脚109和引脚120)。

    谢谢、此致、

    Rohith。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ralph、
    根据我们的要求,如上所述,在使用109和120个 MCU 引脚时,打开持续时间为99.5msec,关闭持续时间为0.5msec。  
    由于我们没有使用其他引脚的规定、因此我们满足要求的唯一选择是使用这两个引脚。
    两个引脚都应生成脉冲、该脉冲被连接以驱动项目中的外部组件。
    1) 1)使用引脚120。
    以下是代码实现:
    //下面的 LoadSet 和 Match Set 函数将脉冲频率从25MHz 晶体频率设置为380Hz。
    //(2^16=65536是最大因素、因为120引脚可被用作一个16位定时器)。

    TimerLoadSet (Timer1_base、timer_A、65536);

    //要实现最大20%的占空比,请将匹配值设置为 load value /5

    TimerMatchSet (Timer1_base、timer_A、
                        TimerLoadGet (Timer1_base、timer_A)/ 5);
                   
    这样,我们可以实现0.5ms 的关闭持续时间,但打开持续时间大约为2.1ms。
     我们是否可以通过使用相同的计时器引脚120来满足我们的要求?
    2) 2)另一个用于相同用途的引脚是宽定时器(32位定时器)的引脚109,您能不能建议以下实施是否足够满足我们的要求:
       

    TimerLoadSet (WTIMER1_BASE、TIMER_B、2500000);

    TimerMatchSet (WTIMER 1_BASE、Timer_B、
                    TimerLoadGet (WTIMER 1_BASE、Timer_B)/ 200);
    谢谢、此致、

    Rohith。

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

    您好、Rohith、

    由于25MHz 系统时钟的周期为100ms、您需要使用宽定时器、因此引脚 109将起作用。 您将无法使用16位+ 8位预分频来通过引脚120实现该目的。

    从您的一些评论中、我现在对其中一个方面有一点不清楚、您是否正在尝试驱动具有该要求的多个 PWM 信号? 如果是、有多少? 如果是多个、您是否担心同步?

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

    您好、Ralph、

    诊断得好-海报的图解更浓。

    他(可能)正在寻找"互补 PWM 信号"-很容易找到"配备了 PWM 的 MCU"-他能力较差的器件不会这么多!   (他可以通过使用"超快速逆变器"(最小传播延迟)"来"破解"互补 PWM 信号、但不使用"死区"-任何驱动功率级都可能面临(高)风险!)

    如果他(实际上)正在寻找"两个相同的 PWM 输出"-只需从 MCU 的计时器输出驱动一个公共逻辑门-这样逻辑门的输出上就会出现"两个(或更多)(近乎)相同的 PWM 信号"!   通过这种"外部栅极方法"(即强制 MCU 的 PWM 信号驱动"两个栅极")、逻辑栅极施加的任何此类延迟都将得到均衡(因此可有效消除)、并实现(接近)精确同步。

    对于那些"不使用外部逻辑门"的用户-请注意、该门具有许多优势

    • 可能比 MCU 的输出提供更大的输出驱动(并且具有栅极 I/O "并行")-甚至更高的输出电平
    • 更灵活的输出信号(即、输出可进一步门控(开关)或通过定期发生的定时"图形或序列"
    • 用作 MCU 的保护性(甚至是献祭)"缓冲器"。   ("失去门"要好得多-而不是 MCU!)

    强制 MCU 本身产生此类"重复 PWM 信号"-是(非常)对 MCU 资源的不良使用...   (特别是现在这种"替代方法"已经实现。)

    再说一次-供应商 Ralph (重复)使用"包括正式 PWM 模块"的 MCU 的方向非常合理-确实应该遵循!

    我们等待 这条(非常)蜿蜒的后路的"下一个扭转"。。

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

    您好 Ralph,

    感谢您的努力。 根据我们的要求、我们需要两个 PWM 信号、每个信号来自 pn 109和120、我们不担心它们被同步。

    此致、

    Rohith。

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

    您好、Rohith、

    您将需要使用16 MHz 或更低的系统时钟在引脚120上获得100毫秒周期的 PWM。