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.
您好!
我尝试了几种方法并检查了示例、但无法使以下代码正常工作。 我的输出端插入了一个风扇、但它无法与 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 来启动/停止/调整风扇的速度。 但它甚至不会启动风扇。
感谢您的澄清。 请参阅以下代码。 我尝试应用您刚才解释的内容、但不确定我是否遗漏了任何内容。
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);
您好、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) { } }