Other Parts Discussed in Thread: TM4C123GH6PM, EK-TM4C123GXL, TM4C1231H6PGE
主题中讨论的其他器件:TM4C123GH6PM、 EK-TM4C123GXL、
您好,
我要求生成导通时间为1ms、关断时间为100ms 的脉冲。是否可以使用 PWM 进行相同的操作?
如果是、请根据上述要求帮助我将 GPIO 配置为 PWM。
谢谢、此致、
Rohith。
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.
Other Parts Discussed in Thread: TM4C123GH6PM, EK-TM4C123GXL, TM4C1231H6PGE
您好,
我要求生成导通时间为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、
要生成持续时间为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
//!
谢谢、此致、
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。
Rohith。
您好、Ralph、
诊断得好-海报的图解更浓。
他(可能)正在寻找"互补 PWM 信号"-很容易找到"配备了 PWM 的 MCU"-他能力较差的器件不会这么多! (他可以通过使用"超快速逆变器"(最小传播延迟)"来"破解"互补 PWM 信号、但不使用"死区"-任何驱动功率级都可能面临(高)风险!)
如果他(实际上)正在寻找"两个相同的 PWM 输出"-只需从 MCU 的计时器输出驱动一个公共逻辑门-这样逻辑门的输出上就会出现"两个(或更多)(近乎)相同的 PWM 信号"! 通过这种"外部栅极方法"(即强制 MCU 的 PWM 信号驱动"两个栅极")、逻辑栅极施加的任何此类延迟都将得到均衡(因此可有效消除)、并实现(接近)精确同步。
对于那些"不使用外部逻辑门"的用户-请注意、该门具有许多优势:
强制 MCU 本身产生此类"重复 PWM 信号"-是(非常)对 MCU 资源的不良使用... (特别是现在这种"替代方法"已经实现。)
再说一次-供应商 Ralph (重复)使用"包括正式 PWM 模块"的 MCU 的方向非常合理-确实应该遵循!
我们等待 这条(非常)蜿蜒的后路的"下一个扭转"。。