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.

[参考译文] TM4C123GH6PM:缺少 PWM 脉冲

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/677356/tm4c123gh6pm-missing-pwm-pulse

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123

大家好、我在 TM4C123上使用 PWM 信号... 我丢失了脉冲、我不知道代码中有什么错误、  请给我一个提示。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    首先、请详细说明如何生成 PWM 信号? 您是在 PWM 模式下使用 PWM 模块还是 GPTM 模块、还是通过软件生成 PWM。 您能显示您的代码吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "代码中的错误"

    第3页、中间的第7行、右侧的第28个字符。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、我的代码:
    我有2个 PWM、1个用于正向驱动、1个用于反向驱动、控制器在 SW 中实现、我检查所有功能错误的可能性、
    我将函数 MST_WritePWMMotor 调用为循环的新值。 但是、当行驶时、该值永远不为零、我对其进行了检查。 我有端口 F4来启用/禁用外设 Motorcontroller。
    但请参阅下面的内容、谢谢。
    //
    //初始化电机的 PWM
    //
    void MST_InitPWM0 (void)

    //启用 sysclock
    SysCtlPWMClockSet (SYSCTL_PWMDIV_16);

    //启用 PWM0/1外设
    SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
    SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);// PWM 输出
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);//启用电机

    //... 并等待 PWM0模块就绪。
    uiSysTickCompareTimeout = MST_TIM_READ_SysTick ();while (!SysCtlPeripheralReady (SYSCTL_Periph_PWM0)){if (MST_TIM_READ_SysTickCompareTimeout ()> uiSysTickCompareTimeout + SYS_TICK)break;}

    //配置引脚
    GPIOPinConfigure (GPIO_PB6_M0PWM0);
    GPIOPinConfigure (GPIO_PB7_M0PWM1);

    GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_4);

    GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_6);
    GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_7);

    //将 PWM 发生器配置为递减计数模式并立即更新参数。
    PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、MST_PWM_LENGTH);

    PWMGenConfigure (PWM0_BASE、PWM_GEN_1、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_1、MST_PWM_LENGTH);
    //更新 PWM wenn Zähler = 0
    PWMOutputUpdateMode (PWM0_BASE、PWM_OUT_0_BIT、PWM_OUTPUT_MODE_SYNC_LOCAL);
    PWMOutputUpdateMode (PWM0_BASE、PWM_OUT_1_BIT、PWM_OUTPUT_MODE_SYNC_LOCAL);

    PWMOutputInvert (PWM0_BASE、PWM_OUT_0_BIT | PWM_OUT_1_BIT、TRUE);

    //设置 PWM0的脉冲宽度
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、0);

    //设置 PWM1的脉冲宽度
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、0);

    //启动发生器0和1中的计时器
    PWMGenEnable (PWM0_BASE、PWM_GEN_0);
    PWMGenEnable (PWM0_BASE、PWM_GEN_1);

    //启用输出。
    PWMOutputState (PWM0_BASE、(PWM_OUT_0_BIT | PWM_OUT_1_BIT)、true);


    //静态 int iwm_Faktor = 3;
    //
    //将 PWM 信号写入电机驱动器并启用电机
    //
    void MST_WritePWMMotor (uint32_t uiDir、uint32_t uiPWM)

    if (uiPWM!= 0)

    //启用电机
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_PIN_4);

    IF (uiDir =MST_MOT_DIRECT_UP)

    //清除位置方向
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、0);
    //设置新值
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、uiPWM);

    其他

    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、0);
    //设置脉宽
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、uiPWM);


    其他


    MST_PWM_StopMotor ();



    void MST_PWM_StopMotor (void)

    //停止 PWM 和复位引脚
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、0);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、0);

    //禁用电机(直接到电机控制器)
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_4、0);


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

    您好!

     首先、如果您想要 PWM_GEN_1、则该发生器与 M0PWM2和 M0PWM3相关联。 M0PWM1与 PWM_GEN_0相关联。

     如何调用 MST_WritePWMMotor? 您的意思是、您循环地将其称为什么? 我看不到您启用中断、因此您很可能不会更改 ISR 中的占空比。 如果您在 while (1)循环中调用 MST_WritePWMMotor、则它将无法根据需要工作。 有时、计数器可能已经通过了您尝试写入的新占空比。  

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

    大家好、感谢发电机的提示。

    在计时器中断中调用 MST_WritePWMMotor 函数、当计算新的 PWM 值时、我猜、当计数器开始新周期时、会设置新的 PWM 值、开关可以与 PWM_OUTPUT MODE_SYNC_LOCAL 同步。 如果我理解正确、 那么新的 PWM 只能在 Interruptfunction 中设置吗?

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

    请考虑在此处使用双斜率。 如果计数器的值高于/低于您设置的比较值、在单个斜率操作(递增/递减计数器)中、您会错过一个脉冲。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的理解是正确的。 当您尝试更改匹配值时、计时器中断与 PWM 异步。 有时、计数器已通过您尝试设置的新占空比(匹配值)、您将错过 PWM 生成。 您应该尝试相对于 PWM 边沿(即上升、下降或两者)更改占空比。 您可以生成 PWM 中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我没有"仔细记录"完整的详细信息-但不是担心:"仅错过了一个(或几个) PWM 脉冲"-但实施了错误的 PWM 发生器代码分配?

    那么、PWM  是如何成功生成的?   (即使遇到 "PWM interrupts"、也是如此)  此处的内容报告不正确-或其他方面不正确...

    在这样的情况下-公司/我早就发现-我们关注"一次一个 PWM 发生器"-并由此获得成功" 远远超过"、 "多个 PWM 发生器-全部发挥作用-和(毫不奇怪)-问题的级联解决了!    "kiss"规定、"小、集中、可测量和系统的步骤"-而不是(赦免)"女巫酿造"- 最佳、"速度、简化和增强"客户-用户成功。   始终...

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

    您好 CB1、
    海报上说他正在产生两个 PWM。 您可以确定有两个问题。 一个 PWM 缺少脉冲、另一个 PWM 根本不会生成。 观察他的示波器电容器、可以看到通道 A1只是平坦的低电平。

    [编辑]、因为为 M0PWM1选择了错误的引脚、因此它保持扁平。  

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

    谢谢、Charles。 如上所述-我没有"直击"(细微细节)只是对失败的 PWM 编码做出反应以确保这一点得到充分注意。   

    一如既往-"过多的成分(经常)会破坏汤"-以及(有时/经常)客户-用户 项目-以及...

    KISS -通过单一关注、可衡量和系统步骤-始终带来最佳结果-使用最小的 Krash/燃烧...  (每天在这里目睹的 KISS 违规行为会导致"太少" 无法自解!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、现在我完全困惑了...
    PWM 脉冲不会循环丢失、它会在1到2秒内全部丢失、而不是在每次 PWM 更新时、让我继续:
    我不应该调用函数 PWMPulseWidthSet (...) Asyncron 我必须在计数器为零时设置一个中断、对 PWM 寄存器的写入是什么? 此致、Ewald
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不可以。这里只有一个问题。 一次只生成一个 PWM、另一个设置为零。 但缺少脉冲是问题所在、这些八进制序列以1 - 2秒为步长、而不是以 Evers 写入周期为周期。 此致 Ewald
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、您是否仅在 PWM 边沿中断之后尝试更改占空比?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的意思是:
    PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_INT_CNT_ZERO);
    Rgds、E.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、没错。

    如 CB1所建议、请每次从一个 PWM 开始。 在两个 PWM 单独工作后、您可以在最终项目中将这两个 PWM 组合在一起。 这样的调试将更容易。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你,查尔斯-和(海报)...   对您(以及对您的助手 crüe )来说、这真的会更容易(这里)-也是如此。

    变量过多 (初始)会极大 地增加您 的难度 

    • 使您的问题或问题变得更加难以合理和正确地解决-细节和解释
    • 找到"关键原因"-当许多"物品被怀疑"时
    • 这种额外的: 时间、精力和困惑-又是因为"太多的游戏"而迫使您这样做
    • 的支持团队要求的"阅读和吸收"时间和精力 也显著增加(可能不公平)。   这里有很多-需要帮助!

    早已确定: "一次一个小、重点突出、可衡量和系统的步骤"(即 kiss)可为所有相关人员带来最佳结果...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、我对它进行了编码、但现在它不起作用、明天我将查看 rgds。 E.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请仔细检查并确保使用启用 PWM0中断 PWMIntEnable (PWM0_BASE、PWM_INT_GEN_0)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好,查尔斯

    中断函数已被执行、很多问题!

    另一个问题是、我在这里有一个电路板、并向客户询问。 我知道它是电源、经过测试、电源正常。 然后、我连接到 IDE、它工作正常、然后断开连接、看起来闪存中没有软件。 TI 控制器对我而言是新手、您有没有提示、首先要去哪里? 谢谢。

    Rgds E.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    很高兴您的问题得到解决。

    是否可以打开新问题的新主题? 我不知道您对电路板的"追问"是什么意思。 您是指"已擦除"?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    可能“已被转出”为新的“混合”... 组合已损毁和已擦除?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好,查尔斯

    CPU 崩溃、这意味着它工作正常、CPU 突然丢失了所有闪存内容(似乎是这样-没有 LED 闪烁、在没有电源时也是如此、但电源正常/正常)现在、我使用 Launchpad 擦除了整个 CPU、并在 IDE 中对其进行了新的重新编程、 现在 CPU 正在工作、也是独立的、我怀疑... 如果您有任何想法、请告诉我。 感谢您的支持、Ewald

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ewald、
    之前在闪存中运行的是什么? 您能否详细介绍闪存中的固件? 您是否关闭了代码中的时钟? 我可以想象 LED 不闪烁。 这可能取决于代码。 但我无法想象闪存会被自身擦除。 当它不起作用时、您是否在重新连接到目标后读取了闪存内容? 您确定闪存全部变为 F 吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,查尔斯
    很抱歉、我对 IDE 并不是很熟悉、通常我没有独立编程器(例如 Launchpad)、因此我很匆忙地交付。 时钟(LED 闪烁)在主()功能中生成、并在时间中断(1ms 周期)中对延迟进行倒计数、如果闪存被擦除、我无法给出答案... 下次我会更加关注所发生的事情... 但非常感谢您的支持、Ewald 致您
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ewald、
    没问题。 如果您认为闪存被擦除时再次出现此问题、请尝试重新连接。 在 CCS 存储器浏览器窗口中、您可以将闪存存储器的指定范围保存到文件系统中。 当然、您可以在 CCS 存储器浏览器窗口中查看闪存是否被擦除。 我没有收到任何报告、说明当您不执行任何类型的闪存写入周期操作时、闪存内容会被无意中擦除。

    我将关闭此主题。 如果您遇到新问题、请打开新主题。