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:TM4C1294NCPDT

Guru**** 1980725 points
Other Parts Discussed in Thread: TM4C1294NCPDT, EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/774790/tm4c1294ncpdt-tm4c1294ncpdt

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件: EK-TM4C1294XL

您好!

我尝试了几种方法并检查了示例、但无法使以下代码正常工作。 我的输出端插入了一个风扇、但它无法与 PWM 配合使用、而且风扇 LED 甚至不会亮起。 感谢你的帮助。

{code}

SysCtlClockSet (
SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

SysCtlPWMClockSet (SYSCTL_PWMDIV_64);
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
GPIOPinConfigure (GPIO_PD0_T0CCP0);
GPIOPinTypePWM (GPIO_PORTD_BASE、GPIO_PD0_T0CCP0);
PWMGenConfigure (PWM1_base、PWM_GEN_0、PWM_GEN_MODE_DOWN);
PWMGenPeriodSet (PWM1_base、PWM_GEN_0、2500);

PWMPulseWidthSet (PWM1_base、PWM_OUT_0、
(PWMGenPeriodGet (PWM1_base、PWM_GEN_0)/ 2));
PWMOutputState (PWM1_base、PWM_OUT_0_bit、true);
PWMGenEnable (PWM1_base、PWM_GEN_0);
while (1)


{code}

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

    您好、Veruma、

    我不理解您的描述中的问题的全部范围、但我可以提供一些起始指针。 请尝试详细解释您在代码中看到的内容、例如代码是否正常运行或遇到故障、以及 GPIO 上是否有任何输出。

    第一个注释、您对 TM4C129x MCU 使用了错误的时钟配置。 您拥有的是 TM4C123x。

    这是正确的 API:

    G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_OSC)、25000000);
    

    接下来、您应将其放在 PWM 时钟集 API 之前:

    SysCtlPeripheralEnable (SYSCTL_Periph_PWM0); 

    接下来 、GPIO_PD0_T0CCP0不是 PWM 输出、因此您需要为 PWM 输出确定正确的引脚。 我经常为此使用与 PWM0关联的引脚 F1、但您可以使用其他引脚。

    最后、对于 GPIOPinTypePWM、您需要给出一个诸如 GPIO_PIN_0、 GPIO_PIN_1等的参数、而不是   用于 GPIOPinConfigure 的 GPIO_PD0_T0CCP0或 GPIO_PF1_M0PWM1。

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

    感谢您的回复。 但在文档中、它显示" T0CCP0 -PD0 (3)-16/32位定时器0捕获/比较/PWM 0 "。 这就是我使用 T0CCP0的原因。 我正在尝试使用上述代码通过 PWM 来启动/停止/调整风扇的速度。 但它甚至不会启动风扇。  

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

    您可以执行两种类型的 PWM。 通过计时器模块的 PWM 或通过专用 PWM 模块的 PWM。 您的所有 API 调用都是针对专用 PWM 模块的、因此您需要为此使用相应的 GPIO。 查看器件数据表的 PWM 模块部分、您将看到与 PWM 模块关联的引脚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的澄清。 请参阅以下代码。 我尝试应用您刚才解释的内容、但不确定我是否遗漏了任何内容。

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOD))
    ;
    SysCtlDelay(3);
    GPIOPinConfigure (GPIO_PD0_T0CCP0);
    SysCtlDelay(3);
    GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_0);
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
    TimerConfigure (TIMER0_BASE、
    TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM);
    TimerLoadSet (TIMER0_BASE、TIMER_Both、PERIOD);
    TimerMatchSet (TIMER0_BASE、TIMER_Both、dutyCycle);
    TimerEnable (TIMER0_BASE、TIMER_A);
    TimerEnable (TIMER0_BASE、TIMER_B);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、dutyCycle);
    PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE);
    PWMGenEnable (PWM0_BASE、PWM_GEN_0); 

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

    这是不正确的。 您必须使用计时器模块或 PWM 模块。 不是两者都有。 我强烈建议使用 PWM 模块、您在那里的大部分时间都是这样、除了您没有选择正确的引脚!!

    要了解如何在 TivaWare 中拆分模块、请查看 DriverLib 用户指南、该指南是 TivaWare docs 文件夹中的文档 SW-TM4C-DRL-UG-2.1.4.178.pdf。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    我阅读了您上面提到的文档。 它帮助了很多,但我仍然有一些困惑。 在 tm4c1294ncpdt.pdf 中显示"T0CCP0-PD0 (3)-16/32位定时器0捕获/比较/PWM 0"。 那么、如果 PD0不是 PWM 引脚、为什么它会说 PWM0。 此外、我必须将 GPIO_PD0_T0CCP0用于 PWM 目的、如何才能实现这一点? 请参阅下面的代码。

    最棒的

    GPIOPinTypePWM (GPIO_PORTD_base、GPIO_PIN_0);
    GPIOPinConfigure (GPIO_PD0_M1PWM0);//这里我必须说 GPIOPinConfigure (GPIO_PD0_T0CCP0);
    
    PWMGenConfigure (PWM1_base、PWM_GEN_0、PWM_GEN_MODE_DOWN);
    PWMGenPeriodSet (PWM1_base、PWM_GEN_0、2500); //总脉冲周期
    
    PWMPulseWidthSet (PWM1_base、PWM_OUT_0、(PWMGenPeriodGet (PWM1_base、PWM_GEN_0)/ 2));
    PWMOutputState (PWM1_base、PWM_OUT_0_bit、true);
    PWMGenEnable (PWM1_base、PWM_GEN_0);
    
    while (1){
    ;
    } 

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

    您好、Veruma、

    就数据表而言、"16/32位定时器0捕获/比较/PWM 0"的命名规则是指指定的引脚是16或32位定时器、定时器支持捕获和比较模式以及定时器 PWM 模式。

    PWM 模块引脚被标记为 M0PWM0 或 M0PWM1、这些引脚被 PWM 模块使用并需要 PWM API。

    如果您使用的是 LaunchPad、则可以使用其他引脚、因此可以使用最适合您应用的 PWM 模块。

    但是、如果您使用的是自定义电路板、并且没有更改引脚的灵活性、则可以看到以下代码、这些代码将使您能够使用您可以修改的基本功能。 该代码基于 TivaWare 中的计时器 PWM 示例、但我删除了 UART 等不必要的内容、并为 EK-TM4C1294XL 使用了引脚配置。 您可以根据需要更改该引脚配置。

    //
    //
    // pwm.c -在16位 CCP 上演示基于定时器的 PWM 的示例。
    //
    //版权所有(c) 2010-2017 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    以源代码和二进制形式重新分发和使用,无论是否
    进行//修改,只要
    满足以下条件//:
    //
    重新分发源代码必须保留上述版权
    //声明、此条件列表和以下免责声明。
    //
    //二进制形式的再发行必须复制上述版权
    //声明、此条件列表和//
    
    分发随附的//文档和/或其他材料中的以下免责声明。
    ////
    未经
    
    事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。
    ////
    本软件由版权所有者和贡献者提供
    //“按原样”,不
    
    承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权
    //所有者或贡献者都不对任何直接、间接、偶然、
    //特殊、模范、 或相应的损害(包括但不
    限于采购替代产品或服务;丧失使用、
    //数据或利润; 或业务中断)、无论
    
    出于何种原因使用
    本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。
    //
    //这是 Tiva 固件开发包的修订版2.1.4.178的一部分。
    ////
    *****************
    
    #include 
    #include 
    #include "inc/hw_gpio.h"
    #include "include/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_timer.h"
    #include "inc/hw_types.h"
    #include "driverlib/gpio.h"
    
    #include "driverlib/interrupt.h"#include "driverlib/driver.h"#include"#driverlib/driverlib.idio.try"
    #include "driverlib/driver.h"#driverlib/driverlib.ide"#include "driver.h"
    
    
    
    
    
    //
    //! addtogroup timer_examples_list
    //! 

    使用计时器的 PWM (PWM)

    //! //! 此示例展示了如何配置 Timer0A 以在 //! 定时器的 CCP 管脚。 //// ***************** // // //将 Timer1B 配置为占空比为66%的16位 PWM。 //// ***************** int main (void) { uint32_t g_ui32SysClock; // //将时钟设置为直接从外部晶振/振荡器运行。 // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值 板上的//晶体。 // #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC)、25000000); #else SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); #endif // //必须启用 Timer1外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0); // //对于这个示例、T1CCP1与端口 B 的引脚5一起使用。 //您使用的实际端口和引脚可能有所不同,请参阅 //数据表以了解更多信息。 // GPIO 端口 B 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL); // //为定时器/CCCP 功能配置 GPIO 管脚复用。 //只有当您的器件支持 GPIO 引脚功能多路复用时才需要此功能。 //研究数据表以查看每个引脚分配的函数。 // TODO:更改此选项以选择您正在使用的端口/引脚 // GPIOPinConfigure (GPIO_PL4_T0CCP0); // //为 CCP 管脚配置 ccp 设置。 该函数也会提供 将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表 //查看每个引脚分配的函数。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeTimer (GPIO_PORTL_BASE、GPIO_PIN_4); // //将 Timer1B 配置为16位周期定时器。 // TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM); // //将 Timer1B 加载值设置为50000。 在本示例中、占空比为66% 将生成// PWM 信号。 负载值(即50000)到 //匹配值(在下面设置)信号将为高电平。 与匹配值进行比较 //到0计时器将为低电平。 // TimerLoadSet (TIMER0_BASE、TIMER_A、50000); // //将 Timer1B 匹配值设置为装载值/3。 // TimerMatchSet (TIMER0_BASE、TIMER_A、 TimerLoadGet (TIMER0_BASE、TIMER_A)/ 3); // //启用 Timer1B。 // TimerEnable (TIMER0_BASE、TIMER_A); // //在 Timer1B PWM 运行时永久循环。 // while (1) { } }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您、Ralph。 我要试一下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    拉尔夫
    上面的代码工作正常。 我还有一个问题、如果我想关闭我的控制(风扇/电机等)、该怎么办? 这是否适合使用?
    只需禁用计时器" TimerDisable (TIMER0_BASE、TIMER_A);"

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

    是的、您可以使用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的帮助、Ralph。
x 出现错误。请重试或与管理员联系。