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.

[参考译文] EK-TM4C123GXL:使用死区时 PWM 启动毛刺脉冲

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/567363/ek-tm4c123gxl-pwm-start-up-glitch-when-using-deadband

器件型号:EK-TM4C123GXL

我遇到了一个问题、即在适当的 PWM 启动之前出现持续时间变化的 PWM 脉冲。 PWM 位于引脚 PD0和 PD1上。 我使用评估板按钮来启动和停止 PWM。 第一次引导时、我大致得到绿色脉冲的持续时间。 如果我停止、然后再次启动 PWM、则开始时的 PWM 具有不同的形状、可能是黄色或绿色迹线。 我想这是因为 PWM 计数器在开始时不为零、但不确定。

请参见图像

PWM 的开始应该是黄色迹线、但绿色迹线显示在之前。  代码为:



//使用死区生成免费 PWM //包括 #include "inc/tm4c123gh6m.h" #include #include #include #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" //#include "inc/hw_ints.h" #include "driverlib/sysctl.h" #include "driverlib/adc.h" #include "driverlib/gpio/debug.h" #include "driverlib/driverline.h"#include "driverlib/driverline.h"#include "driverlib/utilh/#include "driverlib/intrintrat.h"#include "#driverlib/driverlib/driverlib#include "#driverline.h/driver.h"#include "driverlib/driverlib#include "#driverlib.utils/intrintrin.h" /ti/TivaWare_C_Series-2.1.0.12573/utils/ustdlib.h //频率填充 unsigned int ui32PWMFreq = 126000;//默认启动频率 空 InitPWM (void) { uint32_t ui32LoadIn; uint32_t ui32PWMDeadband; //设置 M1PWM0 PD0上具有2个 PWM 的桥式驱动器, M1PWM1 PD1 ROM_SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);//从 PWM1 ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD)更改;//对于 M1PWM0 M1PWM1和 UART2 //在模块1上配置 PWM0 (引脚 PDTL_Periph_GPIOD);//将 M1PWM1PWM0 引脚 PD_PM0_PM_PMBUS_PM1引脚设置为 GPIO1引脚 PD0_BASE;GP0_PM0_PM0_GPIO1引脚 PD0_PM0_PM0_PM0_PM0_PM0_PM0_PM0_GPIO1引脚 GPIO_PIN_1);//将 PD1设置为 PWM ROM_GPIOPinConfigure (GPIO_PD0_M1PWM0);//模块1 PWM0 ROM_GPIOPinConfigure (GPIO_PD1_M1PWM1);//模块1 PWM1 //设置时钟和频率 ui32GEN =(ROM_PGEN_PWM0); //在 PWM100_MODE_MODE_PWM0中已启用 PWM64_PWM1/PWM1/2_PWM1/2_PWM1/2_PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/PWM1/2/ //设置 PWM 周期和占空比 ROM_PWMGenPeriodSet (PWM1_base、PWM_GEN_0、ui32LoadIn);// PWM 中的加载值应为16位并且已在 funciton ROM_PWMPulseWidthSet (PWM1_base、PWM_OUT_0、ui32HW1010/2)中有-1;// 针对 PWM+400000+配置/输出 PWM (0x400000+配置)/输出 PWM ( 0x400000+ PWM) //设置死区 ROM_PWMDeadBandEnable (PWM1_base、PWM_GEN_0、ui32PWMDeadband >> 1、ui32PWMDeadband >> 1);//Configure Deadband on PWM1 PMW0 }//End of InitPWM1/// Main 的开始--- int main (void) { //40MHz 时钟、使用 ROM 命令节省空间! ROM_SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_MAIN|SYSCTAL_XTAL_16MHz); ROM_SysCtlPWMClockSet (SYSCTL_PWMDIV_1);//设置 PWM、设置为40MHz? ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);//为 LED 启用外设时钟 //等待 GPIOF 模块准备 就绪 while (!SysCtl_Periph_GPIOF) { } //配置 LED ROM_GPIOPCtlGPIOOutput (GPIO_PORTF PeripheralReady (SYSCTL_PERIPH_GPIOF)));1}//将 GPIO_PIN_1引脚设置为 1、2、2、1、1、1、2、1、1、2、1、1、1、1、1、1、2、1、1、1、1、1、1、1、2、1、1、1、1、1、1、1、2、1、1、1、2 、1、1、1、1、1、1、1、1、1、1、1、1、1、1 HWREG (GPIO_PORTF_BASE + GPIO_LOCK)= GPIO_LOCK_KEY; HWREG (GPIO_PORTF_BASE + GPIO_CR)|= 0x01; HWREG (GPIO_PORTF_BASE + GPIO_LOCK)= 0; ROM_GPIODirModeSet (GPIO_PORT_BASE、GPIO_PORT_ROM_FOIN)= 0;GPIO_PDIR_PIN_PIN_DIR_PIN_DIORT_PON_PIN_0 GPIO_PIN_4|GPIO_PIN_0、GPIO_FORCE_2mA、GPIO_PIN_TYPE_STD_WPU); //在这里启用 PWM 模块1 PWM0、PWM1 InitPWM (); while (1) { //打开 PWM if (ROM_GPIOPINREAD (GPIO_PORTFTL_base、GPIO_DEV_0000 );while (1){//打开 PWM if ((ROM_GPIO_0x0000_TO/PM=4)))?/PM=0x0000_4秒) //在 ROM_PWMOutputState (PWM1_base、PWM_OUT_0_BIT | PWM_OUT_1_BIT、TRUE)上打开 PWM10;//PWM0设置为输出 //HWREG (0x40029054)=0x0000; ROM_PWMGenEnable (PWM1_BASE、PWM_GEN_0);//运行 PWM=0x0000_TO/PWM=0=0 (PWM=PHIN )/PWMs (PWM=0xPWM=0_PHIN)/PWMs (PWM=0xPWMs)/PWM=0_TO/PWMs (PWMs)/PWMs (0xPWM=PWMs (0xPWM=PWMs)/PWMs (PWM=PWM=0_TO/PWMs) ROM_PWMOutputState (PWM1_base、PWM_OUT_0_bit | PWM_OUT_1_BIT、false);//PWM0设置为输出 ROM_PWMGenDisable ( PWM1_base、PWM_GEN_0);//关闭 PWM //将 PD0设置为低电平、因为看起来关闭可能是高电平... //Setoutputs low }//end of switch 2 turn off PWM }//end of main while loop }//****** 结束主代码********

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

    [引用 USER="mk45507]ROM_PWMDeadBandEnable (PWM1_base、PWM_GEN_0、ui32PWMDeadband >>1、ui32PWMDeadband >1);[/引用]

    死区持续时间的"双进入"是否正确?     (有疑问、例如死区会随着 PWM 发生器中的内容在低位发生变化、并在高位强制执行低位的反相和死区保护复本。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不确定我是否理解双重输入。 从外设库文档(www.ti.com/.../spmu298d.pdf) 中、该函数需要上升和下降死区时间。 问题是他们需要16位、我使用32位来实现死区时间上升和下降时间值吗? 我之前尝试过固定值、但仍然会出现相同的干扰、但可以再次检查。
    从第411页开始:
    void PWMDeadBandEnable (uint32_t ui32Base、uint32_t ui32Gen、uint16_t ui16Rise、uint16_t ui16Fall)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的朋友——“多边环境协定”——我死错了! (再次)
    确实-这两个参数都是必需的-正如您所注意到的。

    尽管如此-我不认为死区参数都扩展到了32位。 (立即检查-将返回限制/限制。)

    和-为了"保存"(某些) Face -我的4C123数据手册将死区参数限制为12位、最大值-在每个(上升/下降)情况下!

    也许您可以尝试并报告-从未/从未有过公司/我注意到您的"发现"。   如果您按建议尝试-但仍然失败-我将尝试实施并展示示波器电容器!

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

    这里-在死区下启动(成功) PWM 的几个示波器电容器:  请注意、不同 PWM 发生器之间以及单个发生器的"上升/下降时间"上都加载了不同的死区参数。

    每个屏幕电容器都通过"单触发事件"触发。    (此处通过 Ch:1从"冷"上升到超过2.60V。)

    没有像您报告的那样"非法 PWM 脉冲"显示...   示波器是 Tek "MSO 3014"(混合信号、16通道数字)您的兄弟...

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

    CB1、

    问题是、当 PWM 被禁用时、计数寄存器不会复位、因此后续停止随后在没有计数器清零的情况下启动会导致我在 OP 中显示的结果。 微控制器数据表的第1279页中说明了计数器寄存器未被清零的情况。 如果其他人遇到此情况以清除计数器寄存器、您可以按照数据表所示执行此操作、并使用系统控制模块中的 SRPWM 寄存器。 我使用了 PWMSYNC 寄存器、因为它看起来像是 SRPWM 清除了所有 PWM 设置、我只想清除计数。 特定于我的情况、由于计数器是只读的、因此我使用了:

    HWREG (0x40029004)=0x1;//使用 PWMSYNC 寄存器为 PWM1复位 gen0计数器 

    我在不关闭微控制器电源的情况下使用许多 PWM 启动和停止进行了测试、我不会看到"非法的"PWM、因此它应该可以根据需要工作。 感谢您抽出宝贵时间参加 CB1。

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

    感谢您-非常详细-您提供的解决方案看起来"合理"。
    这很有趣-尽管我们的(多个)示波器电容器揭示了-在我们的测试过程中、没有这样的"非法"PWM 脉冲会产生"陆地"脉冲。

    Silent 是死区造成的"原因和(可能的)影响"。   您巧妙地建议的解决方案使我们无法识别(任何)与"死区!"的链接   (我敢打赌死区不是唯一的问题!)

    我将在接下来的几天内抽出时间开展进一步的实验-看看我们是否可以复制您的发现。 我们当前的项目是一款基于 MCU 的多相交错式电源控制器、该控制器确实定期在3个120°间隔通道上启动和停止 PWM。  (我们的应用程序中的任何一个恶意脉冲-显示为"无事件"。)

    员工/我对这种(单一)非法脉冲的重要性很好奇-我们很想知道(为什么)这证明了"这种担忧?" (很可能-了解为什么这会产生影响...)