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.

[参考译文] SW-EK-TM4C123GXL:PWM -频率与放大器;占空比设置

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/587923/sw-ek-tm4c123gxl-pwm---frequency-duty-cycle-setting

器件型号:SW-EK-TM4C123GXL

HII 全部、

我正在挖掘 TM4C123G 的 PWM 功能、发现配置 PWM 分辨率非常令人困惑 、或者我可能会在某个地方出错、

让我举一个简单的代码示例 、它可以控制玩具直流电机的速度。我写了如下代码。

我将 PF1配置为 PWM 引脚、将 PE3配置为 POT 的 ADC。

-------------------------------------------------- 代码从这里开始-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include
#include
#include "inc/hw_gpio.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"
#include "driverlib/gpio.h"
#include "driverlib/pwm.h"
#include "driverlib/adc.h"

int main (空)

uint32_t 结果[0];
SysCtlClockSet (SYSCTL_SYSDIV_5| SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
SysCtlPWMClockSet (SYSCTL_PWMDIV_1);//将 PWM 模块的系统时钟分频
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

// ADCHardwareOversampleConfigure (ADC0_BASE、64);
SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
ADCSequenceDisable (ADC0_BASE、3);
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);
ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0|ADC_CTL_IE|ADC_CTL_END);
ADCSequenceEnable (ADC0_BASE、3);

SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);//Tiva Launchpad 有两个模块(0和1)。 模块1涵盖 LED 引脚
GPIOPinConfigure (GPIO_PF1_M1PWM5);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1);//将 PF1设置为 PWM
PWMGenConfigure (PWM1_base、PWM_GEN_2、PWM_GEN_MODE_DOWN|PWM_GEN_MODE_DBG_RUN);
PWMGenPeriodSet (PWM1_base、PWM_GEN_2、4095);
PWMGenEnable (PWM1_base、PWM_GEN_2);
PWMOutputState (PWM1_base、PWM_OUT_5_BIT、true);

while (1)

ADCIntClear (ADC0_BASE、3);

ADCProcessorTrigger (ADC0_BASE、3);

while (!ADCIntStatus (ADC0_BASE、3、false))


ADCSequenceDataGet (ADC0_BASE、3、RESULT);

PWMPulseWidthSet (PWM1_base、PWM_OUT_5、RESULSE[0]);


------------------------------------------------------ 结束这里----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我在 PF1引脚上连接了一个示波器和一个万用表、以查看输出结果。10k POT 在0V 和3.3V 之间连接。还在观察窗口中添加了"result"值、该值在0-4095范围内完全不同、现在当我通过 POT 示波器输入4095值时 显示了100%占空比和约为3.1v 的电压、当我缓慢地将 POT 值降低至0时、与我在示波器中看到的占空比减小时一样、LED 也相应地亮起。  

当我的电位计处于6级或7级时,低于 该 LED 指示灯开始闪烁,我认为这是 PWM 的属性 ,电压也停止降低,它从大约0.7V 持续上升到1.17v (上升和下降)。

如果我现在将同一个 PWM 与直流电机连接起来、我可以在高于 POT 电平(6或7)时控制速度、直至4095。

电流 随 LED 的闪烁而旋转。

我是否需要设置 PWM 分辨率、和  

如果我希望从最初的0级控制 PWM、我需要设置什么 PWM 分辨率以及如何计算它?

谢谢你

 

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

    [引述 USER="Sajad Raster4"]……当我的 POT 处于6级或7级以下时 ,LED 开始闪烁,我认为这是 PWM 的属性 ,电压也停止下降,它从大约0.7V 持续上升到1.17v (上升和下降)。[/QUOQ]

    您报告的内容(LED 开始闪烁)可能表示您的 PWM 频率过低。   在 PWM 频率足够高(即足够高)的情况下- LED 的亮度应(根据该 PWM 信号的占空比)从"完全打开"到"完全关闭"平稳变化。   (通常需要使用"特殊代码或硬件"处理"来实现 PWM 占空比的"极端"(即0和100%) 、建议立即避免(两者)。

    几百赫兹的 PWM 频率(偶数)应避免此类"闪烁"。  为了控制您的电机-我建议以5kHz PWM 频率作为一个合理的起点。

    您的代码:"SysCtlClockSet (SYSCTL_SYSDIV_5| SYSCTL_USE_OSC |SYSCTL_MAIN | SYSCTL_XTAL_16MHz);"似乎以40MHz 系统时钟为目标-但它缺少 PLL 的启用!   您的意图是这样吗?  我 列出了我们的团队过去使用的代码(如下所示)、该代码可产生40MHz 系统时钟。

    //将处理器配置为以40 MHz 运行。
    //
    SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); // 请注意我们启用 PLL!

    相信您最好将 PWM 占空比设置为50%、然后阅读并报告获得的 PWM 频率。  (我相信您的"PWMPeriodSet()"参数(4095)将产生一个"太高"的频率-但由于系统时钟设置错误-实际 MCU 时钟频率被"干扰"。)   

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

    我想问题是、当你进入一个小占空比时、你将使用计数器已经传递的值更新宽度。 这会导致一个长脉冲、因为计数器必须重新加载并再次递减以达到匹配。 我建议您将本地同步添加到配置中。

     

    PWMGenConfigure (PWM1_base、PWM_GEN_2、PWM_GEN_MODE_DOWN|PWM_GEN_MODE_SYNC|PWM_GEN_MODE_GEN_SYNC_LOCAL |PWM_GEN_MODE_DBG_RUN); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bob -我们的帖子刚刚交叉-我相信海报的 PLL "缺失"产生了"不确定"的系统时钟。 (我在上面详细介绍了)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BOB 和 CB1_MOBILE

    Bob、

    我尝试了您的想法、但它只提供了一个占空比为100%的恒定 PWM、无论 POT 电平是否高于6和7。

    和 CB1_MOBILE

    我用 PLL 将系统时钟改为40MHz。它也没有效果,我认为将时钟改为40MHz 将增加我周期中的总时钟。

    以前我曾尝试改变 LED 的亮度,但没有 ADC_POT 的作用,它在任何频率下都可以正常工作。我也用5kHz 的频率来改变它。

    我无法更改这里的周期、因为它的 ADC 输出 POT 高达4095、所以为了控制直流电机、PWM 占空比应在0 (0%)至4095 (100%)之间变化。

    我可以总结的是、当 POT 为0时、电机或 LED 占空比也应为0 (不闪烁)、当 POT 值增大时、电机应开始缓慢旋转或 LED 亮度应开始增大、类似地、POT 为2048时、占空比应为50%。 因此、POT 的最后一个值将是4095、应提供100%的占空比

    嗯,从上面的代码中,我可以得到100%,50%,75%,为什么不是0%……甚至把我的时钟频率增加到了40,并且试图进行同样的分频也没有效果。





    嗯、CB1表明系统频率低于6或7级过低。


    此致

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

    我找不到 PWM 频率@ 50%占空比的"报告"。  我计算的"4095"表示 F_PWM 略高于10kHz -这可以正常工作-但可能太高、无法满足您的初始使用需求。

    多年来、我们一直采用 POT 输入直接精确地改变 PWM 占空比、正如您所寻求的!   (但-不包括上述"极端"、我的帖子概述了这些内容)

    必须添加的 API 函数"PWMPulseWidthSet()。"   (这说明了您无法正确改变占空比的原因!)

    从我们过去的 StellarisWare 中:

    设置指定 PWM 输出的脉冲宽度。
    原型:
    无效
    PWMPulseWidthSet (无符号超长整型 ulBase、
    unsigned long ulPWMOut、
    无符号超长整型)

    我希望您将 PWM 频率调整为1KHz。   这是通过在"PWMGenPeriodSet()函数中放置一个计算值来完成的。  这就是控制 PWM 频率的方法。

    并且-通过我的"封套后部-电池辅助计算""40,000 "应该订购1KHz PWM 频率-当与 PWMGenPeriodSet()中的数据通信时。  (检查: 40MHz 产生25nS 周期- 40K 乘法器产生.001S = 1ms -因此1KHz!)

    如果随后(在上述之后)加载 一个等于该周期值的值(进入(您的新值) PWMPulseWidthSet())-将产生100% PWM。  同样、该值的50%将产生50%的占空比-正如您所希望的那样。  

    ***“此拼图的最后一个部分”让您“缩放”您的 ADC 读数(反映 POT 设置),范围介于(略高于零)和该值(40,000)之间,“在 PWMGenPeriodSet()函数中进行设置!”   最重要的是、这种扩展将成功覆盖您的 POT 的整个范围、从而实现流程自动化!

    您的缩放比例为40、000/4095 -它非常接近10 (10)-我将使用它。  (您必须“截取那些尝试输入高于39,900的值的 PWMPulseWidthSet()调用!  (由于100%占空比有问题)  您还必须阻止将占空比设置为0 - 正如我认为的那样-您可能更容易进行测试-然后防止您的 ADC 传递高于3990 (将按10进行缩放)且低于(例如) 5的值。  (再次将按10进行缩放)

    这是有保证的、完全不需要"同步"。   (您有"义务"单击 "验证" 以奖励此处的努力、不过...)

    BTW -您是一个聪明的人-但您的主题/标题提供了无/零主题指导或价值!   我建议您将其编辑为"PWM -频率和占空比设置"。  (其他人会发现兴趣/价值要高得多)

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


    非常感谢您的这篇解释文章。

    此致 Sajad