主题中讨论的其他器件:TM4C123GH6PM
大家好、
客户想要确认、在一组8条 PWM 信号线路 PWM00至 PWM07中、信号线路 PWM00-PWM03是否可以以不同于 PWM 信号线路 PWM04-PWM07的频率运行。 如果是、您能否共享示例程序。
感谢您的一贯支持!
此致、
Danilo
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.
大家好、
客户想要确认、在一组8条 PWM 信号线路 PWM00至 PWM07中、信号线路 PWM00-PWM03是否可以以不同于 PWM 信号线路 PWM04-PWM07的频率运行。 如果是、您能否共享示例程序。
感谢您的一贯支持!
此致、
Danilo
您好!
可能有一个"远离"TI"团队"(例如外国人/外部人员)会帮助您缩短"等待时间?"
由于此类回答(通常)可疑-此回答将使用 MCU 手册记录我(小型)公司的调查结果。
第1232页显示了"图20-1.PWM 模块图"-似乎与您的问题完全吻合。 我们在这里进行演示、以方便/清晰。 (红色高亮显示是我们自己的)
"PWM 时钟"(如图所示)"通常路由"到所有四个 PWM 发生器、因此客户端对"独立频率控制"的需求似乎被掩盖了。
上述内容- MCU 手册说明、" TM4C123GH6PM 控制器包含两个 PWM 模块、每个模块包含四个发生器模块。" 因此、通过在每个 PWM 模块中采用2个 PWM 发生器模块、"满足客户的目标!"成为可能(然后) 请注意、需要(部分)指示- MCU 手册提供了丰富的详细信息-在客户审查期间、显然遗漏了/注意不多...
关于"示例程序"-同样、''手册'建议26.2.2.42 SysCtlPWMClockSet()(第513页)作为"设置 PWM 模块频率"的适当函数。 请注意、'123系列与'129系列不同-并且在系统控制 API 块中出现"SysCtlPWMClockSet()"-而不是(预期的) PWM 块! 系统时钟可被"以2的功率进行积分分频"-范围至一个64分频的最大值。 (同样、第513页完全通知/建议...)
Danilo & CB1、您好!
客户只需使用 PWM0就可以找到所需的内容。
PWM 时钟来自一个公共源(它基本上是具有一个针对 PWM 的可选分频级的系统时钟)并且这个时钟来自两个模块、所以不能进行任何改变。 PWM 有两个时钟源选项:
调整该设置是 SysCtlPWMClockSet 处理的 内容。
就频率而言、这可以由 PWMGenPeriodSet API 进行设置。
// //将 PWM 周期设置为250Hz。 以计算适当的参数 //使用以下公式:n =(1 / f)* SYSCLK。 其中 N 是 //函数参数、f 是所需的频率、SYSCLK 是 //系统时钟频率。 // MAP_PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、(SysCtlClockGet ()/250));
然后、PWM 的宽度由 PWMPulseWidthSet 设定。
// //将 PWM0设置为25%的占空比。 您将占空比设置为函数 /的周期。 由于周期是在上面设置的、因此您可以使用 // PWMGenPeriodGet ()函数。 在本示例中、PWM 将为高电平 // 25%的时间或(PWM 周期/4)。 // MAP_PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、 MAP_PWMGenPeriodGet (PWM0_BASE、PWM_GEN_0)/ 4);
这些频率的诀窍并不是不能将它们分散在多个发生器模块上。 单个发生器模块不能具有不同的频率、因为频率是在发生器级别配置的。
因此 PWM0和 PWM1具有相同的频率、PWM2/PWM3等
但是、每个 PWM 可以具有不同的占空比设置、因此您可以将 PWM0设置为250Hz 和25%占空比、并将 PWM1设置为500Hz 和50%占空比。
因此、假设它们可以为 PWM0-PWM3和 PWM4-PWM7使用不同的频率。
下面是一个快速源代码示例、其中介绍了多个频率的配置、客户可以对其进行扩展。 这是一个即将推出的项目的修改示例、该项目将是我们即将推出的 TivaWare 版本(我没有更新注释):
#include #include #include "inc/hw_memmap.h" #include "driverlib/debug.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/pwm.h" #include "driverlib/rom.h" #include "driverlib/rom_map.h"#include "driverlib/us.truart/udio.h"#include "#include "UART" // //! \addtogroup examples_list //!PWM 反相输出演示(PWM_INVER置)
//! //! 此示例展示了如何使用反相输出功能设置 PWM。 //! 此功能允许您反转 PWM 输出的极性。 此 //! 示例设置为每 //反转25%的占空比以获得75%的占空比! 2秒。 //! //! 此示例使用以下外设和 I/O 信号。 //! - GPIO 端口 B 外设(用于 PWM0引脚) //! - PWM0 - PB6 //! //! UART0、连接到虚拟串行端口、运行速度为115、200、8-N-1、 //! 用于显示来自此应用程序的消息。 //// ***************** // // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *dpcFilename、uint32_t ui32Line) { #endif //********* // //配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。 //// ***************** void ConfigureUART (void) { // //启用 UART 使用的 GPIO 外设。 // MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //启用 UART0。 // MAP_SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //为 UART 模式配置 GPIO 引脚。 // MAP_GPIOPinConfigure (GPIO_PA0_U0RX); MAP_GPIOPinConfigure (GPIO_PA1_U0TX); MAP_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } //********* // //为以250Hz 运行的25%占空比信号配置 PWM。 //// ***************** int main (void) { // //将时钟设置为直接从外部晶振/振荡器运行。 // MAP_SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); // //将 PWM 时钟设置为系统时钟。 // MAP_SysCtlPWMClockSet (SYSCTL_PWMDIV_1); // //初始化 UART。 // ConfigureUART(); // //必须启用 PWM 外设才能使用。 // MAP_SysCtlPeripheralEnable (SYSCTL_Periph_PWM0); // //启用用于 PWM 输出的 GPIO 端口。 // MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); // //为此引脚配置 PWM 功能。 // MAP_GPIOPinConfigure (GPIO_PB6_M0PWM0); MAP_GPIOPinConfigure (GPIO_PB4_M0PWM2); MAP_GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_6); // //将 PWM0配置为在不同步的情况下递增/递减计数。 // MAP_PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC); MAP_PWMGenConfigure (PWM0_BASE、PWM_GEN_1、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC); // //将 PWM 周期设置为250Hz。 以计算适当的参数 //使用以下公式:n =(1 / f)* SYSCLK。 其中 N 是 //函数参数、f 是所需的频率、SYSCLK 是 //系统时钟频率。 // MAP_PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、(SysCtlClockGet ()/250)); MAP_PWMGenPeriodSet (PWM0_BASE、PWM_GEN_1、(SysCtlClockGet ()/ 500)); // //将 PWM0设置为25%的占空比。 您将占空比设置为函数 /的周期。 由于周期是在上面设置的、因此您可以使用 // PWMGenPeriodGet ()函数。 在本示例中、PWM 将为高电平 // 25%的时间或(PWM 周期/4)。 // MAP_PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、 MAP_PWMGenPeriodGet (PWM0_BASE、PWM_GEN_0)/ 4); MAP_PWMPulseWidthSet (PWM0_BASE、PWM_OUT_2、 MAP_PWMGenPeriodGet (PWM0_BASE、PWM_GEN_1)/ 2); // //启用 PWM 输出位0 (PB6)输出信号。 // MAP_PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT | PWM_OUT_2_BIT、TRUE); // //启用 PWM 发生器模块。 // MAP_PWMGenEnable (PWM0_BASE、PWM_GEN_0); MAP_PWMGenEnable (PWM0_BASE、PWM_GEN_1); // //在生成 PWM 信号时永久循环。 // while (1) { // //打印出 PWM 的电平正常。 // UARTprintf ("PWM 输出:正常\n"); // //此函数提供了生成恒定长度的方法 //延迟。 函数延迟(以周期为单位)= 3 *参数。 延迟 //任意选择2秒。 // MAP_SysCtlDelay ((MAP_SysCtlClockGet ()* 2)/ 3); // //反转 PWM0信号。 // MAP_PWMOutputInvert (PWM0_BASE、PWM_OUT_0_BIT | PWM_OUT_2_BIT、TRUE); // //打印出 PWM 电平反转。 // UARTprintf ("PWM 输出:反相\n"); // //此函数提供了生成恒定长度的方法 //延迟。 函数延迟(以周期为单位)= 3 *参数。 延迟 //任意选择2秒。 // MAP_SysCtlDelay ((MAP_SysCtlClockGet ()* 2)/ 3); // //将 PWM0信号切换回正常运行状态。 // MAP_PWMOutputInvert (PWM0_BASE、PWM_OUT_0_BIT | PWM_OUT_2_BIT、false); } }
您好、Ralph、
您是正确的-虽然我的小组成功演示了 PWM 时钟的"公共分配"-到所有 PWM 发生器-每个 PWM 发生器(控制2个 PWM 通道)可能会进一步分频(从而改变) PWM 频率。
我所在的小组介绍的"双模块"PWM 解决方案确实成功-但是如果在"单个 PWM 模块"中满足目标-第2个 PWM 模块可能被保留。
员工注意到、他们的"双模块解决方案"可以"更好地分离"(从而减少)任何潜在的"信号出血或串扰"、从而提高信号纯度、 这可能证明是"高功率"应用中的优势。
[编辑] 2020年3月6日: 回顾并进一步思考某些应用可能会从我们 的"双 PWM 模块"利用率中明显(且独特)受益! 其中一个(范围)应用涉及"满足"高频和低频带 PWM 支持。" 这最好通过"双 PWM 模式"来实现-它启用了一个、"每个 PWM 模块之间的可编程频率扩展"-由载入到的不同参数值启用、对于每个 PWM 模块、再次启用了"SysCtlPWMClockSet()"! 这种"增加了对细节的关注"可大幅提高 PWM 分辨率、尤其是在"高频和低频带"距离较远的情况下...
再说一次-我们(更早)和您的解决方案都可以...