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.

[参考译文] RTOS/TM4C1294NCPDT:频率较低的 PWM 信号

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/810345/rtos-tm4c1294ncpdt-pwm-signal-with-lower-frequency

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

大家好、

我正在研究一个应用、其中一个任务需要生成频率范围为0.25Hz 至25Hz (周期值范围为40至4000毫秒)的 PWM 信号。
以下是我的配置

1) 1) PWM 硬件属性代码片段:

CONST PWMTiva_HWAttrs pwmTivaHWAttrs[EK_TM4C1294XL_PWMCOUNT]={
   {
       baseAddr = PWM0_BASE、
       pwmOutput = PWM_OUT_0、
       pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
   }、
   {
        baseAddr = PWM0_BASE、
        .pwmOutput = PWM_OUT_1、
        pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
   }、
   {
        baseAddr = PWM0_BASE、
        pwmOutput = PWM_OUT_2、
        pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
    }、
};

CONST PWM_Config PWM_CONFIG[]={
   {
       fxnTablePtr =&PWMTiva_fxnTable、
       .object =&pwmTivaObjects[0]、
       hwAttrs =&pwmTivaHWAttrs[0]
   }、
   {
        fxnTablePtr =&PWMTiva_fxnTable、
        .object =&pwmTivaObjects[1]、
        hwAttrs =&pwmTivaHWAttrs[1]
   }、
   {
        fxnTablePtr =&PWMTiva_fxnTable、
        .object =&pwmTivaObjects[2]、
        hwAttrs =&pwmTivaHWAttrs[2]
   }、
   {NULL、NULL、NULL}
};

2) 2) PWM 引脚复用和 GPIO 配置

void EK_TM4C1294XL_initPWM (void)

   /*启用 PWM 模块0 */
   SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);


   GPIOPinConfigure (GPIO_PF0_M0PWM0);
   GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0);

   GPIOPinConfigure (GPIO_PF1_M0PWM1);
   GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1);


   GPIOPinConfigure (GPIO_PF2_M0PWM2);
   GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_2);

   PWM_init();

3) 3) EK_TM4C1294XL.h 枚举更新为三个 PWM 输出。

typedef 枚举 EK_TM4C1294XL_PWMName{
   EK_TM4C1294XL_PWM0 = 0、
   EK_TM4C1294XL_PWM1、
   EK_TM4C1294XL_PWM2、

   EK_TM4C1294XL_PWMCOUNT //= 3
}EK_TM4C1294XL_PWMName;

4) 4) PWM 配置参数

已尝试以下两种模式:

1) PWM 占空比模式:PWM_Duty_Time:以微秒为单位分配的周期和占空比值。

2) 2) PWM 占空比模式:PWM_Duty_scalar:计算:

Duty_cycle_percentage =((ON_TIME * 1000)/(ON_TIME + OFF_TIME)* 1000)* 100

Duty_cycle_scalar =(65535 * Duty_cycle_percentage)/ 100

PWM_setDuty (pwmHandle、Duty_cycle_scalar);

问题:周期值范围为40到68毫秒(频率为25Hz 到14.705Hz)、我能够生成 PWM 信号。 但是、当我尝试使用等于70毫秒及以上(频率14.28Hz 及以下)的周期值时、PWM 信号线变为高电平、之后没有变化。

我想知道、PWM 模块能否生成此低频信号? 如果是、我需要在 TI-RTOS 项目中执行哪些配置来实现这种低频。

和 PWM 信号、占空比为20毫秒、DSO 将值显示为10ms 占空比。 我不确定为什么会发生这种情况。

我们衷心感谢您的帮助。 提前感谢。

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

    您好!

     您需要检查几件事情。

     -我假设您在打开 PWM 驱动程序实例之前设置 PMW_DUTY 标量。 是这样吗? 默认值为 PWM_Duty_Time。 打开驱动程序实例后,更改操作模式的唯一方法是关闭并使用新模式重新打开该实例。 请参阅以下用户指南。  

    该模式由 PWM_Params 数据结构中的 PWM_DutyMode 字段确定。 。
    该域的 PWM_Params 默认为 PWM_Duty_Time 模式。 打开后、唯一的更改方法
    工作模式是使用新模式关闭并重新打开 PWM 实例。

     -您能否在寄存器浏览器窗口中检查 PWMCC 寄存器并检查您具有的 PWM 时钟分频器? PWM 模块基于16位计数器。 最快的 PWM 时钟可以是120MHz、等于系统时钟。  如果您的 PWM 时钟等于系统时钟(PWM 时钟由系统时钟1分频)、那么您可以拥有的最大周期为8.3ns * 65535 = 0.544ms。 如果将 PWM 时钟除以系统时钟的64、则可以得到的最大周期为34ms。  

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

    您好!

    感谢您提供如此快速的响应。 是的、我在打开 PWM 实例之前设置 PWM 占空比模式。 请找到以下代码:

    PWM_Params PWM_params;

    PWM_Handle pwm1;

    PWM_PARAMS_INIT (&PWM_params);
    PWM_params.dutyMode = PWM_Duty_Scalar;

    PWM_params.period =(ton + toff)* 1000;//以微秒为单位的周期

    pwm1 = PWM_OPEN (Board_PWM1、&PWM_params);
    if (pwm1 = NULL){
        System_abort ("Board_PWM1 did not open");

    Duty_cycle_percentage =((ton * 1000)/PWM_params.period)* 100;

    Duty_cycle =(65535 * Duty_cycle_percentage)/ 100;

    PWM_setDuty (pwm1、Duty_cycle);

    在寄存器浏览器窗口中、我发现 PWMCC 寄存器的值为0x00000005、这表示 PWM 时钟被64分频、这就是我能够输入最大周期34ms 的原因。  

    如何更改该寄存器值、将时钟分频值设为1、将频率设为0.544ms?

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

    您好!

     请注意、要使用分频器时钟、需要将位8设置为高电平。 请参阅下面的内容。 如果您的位8为低电平、则它使用 PWM 模块的源时钟作为系统时钟。  

    据我所知、TI-RTOS 没有用于动态配置 PWM 时钟的 API。 我建议您使用 TivaWare PWMClockSet() API 来配置分频器。 此 API 将设置位8并使用分频器时钟作为时钟源。   

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

    大家好、

    我使用 PWMClockSet()来更改 PWM 时钟配置。 但它没有影响。 您能告诉我在哪里添加这一行代码吗?

    我尝试执行以下操作:

    1) 1) PWM 模块被配置为生成 PWM 信号的任务内部。 在这里,我在创建 PWM 句柄之前调用了 API PWMClockSet()。 :这没有影响。

    PWM_Handle pwm1;

    PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_1);

    PWM_Params PWM_params;
    PWM_PARAMS_INIT (&PWM_params);

    PWM_params.dutyMode = PWM_Duty_Scalar;

    PWM_params.period = 200;

    pwm1 = PWM_OPEN (Board_PWM1、&PWM_params);
    if (pwm1 = NULL){
               System_abort ("Board_PWM1 did not open");

    2)在文件 EK_TM4C1294XL.c 中、如下所示:

    void EK_TM4C1294XL_initPWM (void)

       /*启用 PWM 模块0 */
       SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
       PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_1);

       GPIOPinConfigure (GPIO_PF0_M0PWM0);
       GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0);

       GPIOPinConfigure (GPIO_PF1_M0PWM1);
       GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1);

       GPIOPinConfigure (GPIO_PF2_M0PWM2);
       GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_2);

       PWM_init();

    在这两种情况下、我都无法生成34ms 以上的 PWM 信号。 请提供一些建议。

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

    您好!

     我已将您的问题转交给我们的 TI-RTOS 专家。  

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

    您好!

     您能否在 PWM_open()之后尝试调用 PWMClockSet()?

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

    您好、Charles、

    感谢您的回答。 但仍然没有改善。 每当我给出大于34ms 的值时、就像导通时间/占空比一样。 它不工作。

    我有一个观察结果、如果这有助于找到导致这种情况的根本原因、只要我导通时间为34ms、关断时间为34ms (占空比为50%、周期值为68ms (params.period= 68000))。 生成 PWM 信号。 但在 DSO 中、我看到导通时间和关断时间是输入值的一半。

    请为我们提供指导。

     

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

    您好!

     您能否澄清一下,插入 PWMClockSet()后,根本没有效果,或者行为发生了一些变化,但行为不正确?

     当您查看 PWMCC 寄存器时、您是否看到了新的变化?

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

    您好!

     稍等。 在我之前的答复中、我说过、使用 PWM 时钟除以系统时钟的64、由于16位计数器宽度、您将获得34mS 的最长周期。 在120MHz 时、系统时钟周期为8.3ns。 如果 PWM 时钟被64分频、则 PWM 时钟周期为531ns。 531ns * 2^16 = 34.8ms。 这意味着在50/50占空比 PWM 下、您只能获得大约17.4ms 的导通时间和17.4ms 的关断时间。  

     您可能希望探索如何在 MCU 中使用 GPTM 模块。 MCU 中的 GPTM 模块也可以在 PWM 模式下运行、它可以为您提供高达24位的精度。 另一种解决方案是降低系统时钟频率。 如果您以60MHz 或更慢的频率运行、则它将为您提供所需的最大周期、但以较慢的系统时钟运行也会降低您的器件性能。 这将是您的折衷方案。

     您是否必须在应用中使用 RTOS?

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

    您好!

    正如您所建议的那样,我在 PWM_open()之后使用了 PWMClockSet() API。 编译和闪存后、我检查了寄存器值、它为0x0。

      配置三个 PWM 输出(PWM_OUT_0、PWM_OUT_1和 PWM_OUT_2)。 现在我观察到、每当我以微秒为单位写入周期值(该值大于34ms)时、我会得到类似的结果(对于 Board_PWM1、它显示"无法打开 Board_PWM1"):

    无法打开 Board_PWM。 当前占空比为32767
    FSR = 0x0000
    HFSR = 0x40000000
    DFSR = 0x0000000b
    MMAR = 0xe000ed34
    BFAR = 0xe000ed38
    AFSR = 0x00000000
    正在终止执行..

    我再尝试一次、即尝试在 EK_TM4C1294XL.h 文件中将 PWM 输出从 PWM_OUT_1更改为 PWM_OUT_2、并将 PWM_OUT_3更改为 PWM_OUT_4。 请在下面查找代码片段。 执行此操作后、程序不会终止、但信号始终处于高电平。

    CONST PWMTiva_HWAttrs pwmTivaHWAttrs[EK_TM4C1294XL_PWMCOUNT]={
       {
           baseAddr = PWM0_BASE、
           pwmOutput = PWM_OUT_0、
           pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
       }、
       {
            baseAddr = PWM0_BASE、
            pwmOutput = PWM_OUT_2、
            pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
       }、
       {
            baseAddr = PWM0_BASE、
            pwmOutput = PWM_OUT_4、
            pwmGenOpts = PWM_GEN_MODE_DOWN | PWM_GEN_MODE_DBG_RUN
        }、
    };

    是的、我们的主要要求是使用 TI-RTOS。 好的、如果这会产生积极的结果、我们可以使用 GPTM 模块。 但在 TI-RTOS 用户指南中看不到任何与 GPTM 模块相关的信息/API。 您能建议我在哪里找到它吗?

    您还能解释一下、在 PWM_Duty_scalar 模式下、周期和占空比的值是多少? 例如:我的导通时间为20ms、关断时间为20ms。 因此周期值变为40ms。 基于我正在提供周期参数 A 值:

    PWM_params.period = period =(ON_TIME + OFF_TIME)* 1000;// as period is in microseconds。

    使用以下公式计算 Duty_cycle:

    浮点 Duty_cycle_percentage;

    int32_t CURRENT_DUTY 周期;

    Duty_cycle_percentage = ON_TIME * 1000;
    Duty_cycle_percentage = Duty_cycle_percentage /((ON_TIME + OFF_TIME)* 1000);
    Current_Duty_cycle = Duty_cycle_percentage * 100;
    Current_Duty_cycle =(Current_Duty_cycle * 65535)/ 100;

    我在这里是否有任何问题、或者是否有更好的方法来计算这些值? 在示波器中、对于20ms 的导通时间和20ms 的关断时间、我认为频率为50Hz、但它应该是25Hz、对吧?

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

    您好!

    我很高兴你能为我们提供支持。 您能否向我解释一下、在 PWM_Duty_scalar 模式下、周期和占空比的值是多少? 例如:我的导通时间为20ms、关断时间为20ms。 因此周期值变为40ms。 基于我正在提供周期参数 A 值:

    PWM_params.period = period =(ON_TIME + OFF_TIME)* 1000;// as period is in microseconds。

    使用以下公式计算 Duty_cycle:

    浮点 Duty_cycle_percentage;

    int32_t CURRENT_DUTY 周期;

    Duty_cycle_percentage = ON_TIME * 1000;
    Duty_cycle_percentage = Duty_cycle_percentage /((ON_TIME + OFF_TIME)* 1000);
    Current_Duty_cycle = Duty_cycle_percentage * 100;
    Current_Duty_cycle =(Current_Duty_cycle * 65535)/ 100;

    我在这里是否有任何问题、或者是否有更好的方法来计算这些值? 在示波器中、对于20ms 的导通时间和20ms 的关断时间、我认为频率为50Hz、但它应该是25Hz、对吧?

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

    您好、Nishitha、

     您是否有机会阅读我的上次答复? 正如我解释过的、最大周期受16位计数器 PWM 模块的限制。 最大周期将约为35mS (或更精确地说为34.952ms)、等于28.57Hz。 您不能低于该值。 因此、25Hz 是无法实现的。 当您指定40ms 作为周期时、您会溢出16位计数器能够支持的值。 一些不正确的预加载值被加载到 PWM0_LOAD 寄存器中。 在寄存器窗口中检查寄存器、您将知道我的意思。  

    下面是我刚才做的一个实验。 我将 PWM 配置为具有 34.952ms 的最大周期。  

    void pwmLEDFxn (UARg arg0、UARg arg1)
    {
    PWM_Handle pwm1;
    PWM_PARAMS 参数;
    uint16_t pwmPeriod = 34952; //一个16位计数器可以支持的最大 PWM 周期为34.952ms
    uint16_t Duty = 32768; // 32768是65535的50%
    
    PWM_PARAMS_INIT (params);
    params.period = pwmPeriod;
    params.dutyMode = PWM_Duty_scalar;
    
    
    pwm1 = PWM_OPEN (Board_PWM0、params);
    
    if (pwm1 = NULL){
    System_abort ("Board_PWM0未打开");
    }
    
    /*循环永远递增 PWM 占空比*/
    while (1){
    PWM_setDuty (pwm1、占空比);
    
    Task_sleep ((UINT) arg0);
    }
    } 

    查看 PWM_0_LOAD 寄存器、加载的值为0xFFFE、接近于16位寄存器可以保存的最大值。 查看确定占空比为周期一半的 PWM_0_CMPA。  

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

    您好、Charles、

    感谢您的讲解。 这是合理的、即使我在加载寄存器中观察到0x0000FFFF 也是如此。

    正如您建议使用 GPTM 模块的那样、我如何使其正常工作? 我在 TI RTOS 用户指南中找不到任何 API? 请就此向我提出建议。

    如果您有任何其他解决方法、请告诉我。

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

    您好!

     TI-RTOS 没有用于支持在 PWM 模式下运行的计时器模块的 API。 您将需要使用 TivaWare 来完成。 首先、请参阅数据表、了解 GPTM 模块的工作原理和在 PWM 模式下工作的能力。 然后、您可以参考 TivaWare 示例 /examples/peripherals/timer/pwm.c. 在将代码迁移到 TI-RTOS 之前、请按原样运行示例以了解它。 还请注意、BIOS 从硬件中借用两个计时器来管理 BIOS 系统时钟和时间戳提供商。 通常、它使用系统中的前两个计时器。 如果您仍然想将 TI-RTOS 提供的驱动程序用于 PWM、那么我建议的最佳方法是降低系统时钟的速度。 例如、如果您将系统时钟配置为60MHz、则可以使用16位 PWM 模块获得所需的40ms 周期。

    我还稍微修改了该示例、以接近40ms 的 PWM 周期。

    //
    //
    // pwm.c -在16位 CCP 上演示基于定时器的 PWM 的示例。
    //
    //版权所有(c) 2010-2017 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    以源代码和二进制形式重新分发和使用,无论是否
    进行//修改,只要
    满足以下条件//:
    //
    重新分发源代码必须保留上述版权
    //声明、此条件列表和以下免责声明。
    //
    //二进制形式的再发行必须复制上述版权
    //声明、此条件列表和//
    
    分发随附的//文档和/或其他材料中的以下免责声明。
    ////
    未经
    
    事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。
    ////
    本软件由版权所有者和贡献者提供
    //“按原样”,不
    
    承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权
    //所有者或贡献者都不对任何直接、间接、偶然、
    //特殊、模范、 或相应的损害(包括但不
    限于采购替代产品或服务;丧失使用、
    //数据或利润; 或业务中断)、无论
    
    出于何种原因使用
    本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。
    //
    //这是 Tiva 固件开发包的修订版2.1.4.178的一部分。
    ////
    *****************
    
    #include 
    #include 
    #include "inc/hw_gpio.h"
    #include "include/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_timer.h"
    #include "inc/hw_types.h"
    #include "driverlib/gpio.h"
    
    #include "driverlib/interrupt.h"#include "driverlib/driver.h"#include"#driverlib/driverlib.idio.try"
    #include "driverlib/driver.h"#driverlib/driverlib.ide"#include "driver.h"
    
    
    
    
    
    //
    //! addtogroup timer_examples_list
    //! 

    使用计时器的 PWM (PWM)

    //! //! 此示例展示了如何配置 Timer1B 在 //! 定时器的 CCP 管脚。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - Timer1外设 //! - GPIO 端口 B 外设(用于 T1CCP1引脚) //! - T1CCP1 - PB5 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 操作 //! 定时器0。 //! - UART0外设 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! -无。 //// ***************** // // // g_ui32SysClock 包含系统时钟频率 // //********* #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) uint32_t g_ui32SysClock; #endif //********* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); // //启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } //********* // //打印出5个“”。 每次打印后出现第二次延迟。 此函数将 //然后退格,清除先前打印的点,再退格,以便 //在同一行上连续打印输出。 //// ***************** void PrintRunningDots (void) { UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("。 "); #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/3); #endif UARTprintf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); UARTprintf (" "); UARTprintf ("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); #if defined (target_is_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SysCtlDelay (g_ui32SysClock / 3); #else SysCtlDelay (SysCtlClockGet ()/ 3); #endif } //************* // //将 Timer1B 配置为占空比为66%的16位 PWM。 //// ***************** int main (void) { // //将时钟设置为直接从外部晶振/振荡器运行。 // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值 板上的//晶体。 // #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); #else SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); #endif // //必须启用 Timer1外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_Timer1); // //对于此示例、T1CCP1与端口 D 引脚3一起使用。 //您使用的实际端口和引脚可能有所不同,请参阅 //数据表以了解更多信息。 // GPIO 端口 B 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); // //为定时器/CCCP 功能配置 GPIO 管脚复用。 //只有当您的器件支持 GPIO 引脚功能多路复用时才需要此功能。 //研究数据表以查看每个引脚分配的函数。 // TODO:更改此选项以选择您正在使用的端口/引脚 // GPIOPinConfigure (GPIO_PD3_T1CCP1); // //设置用于显示消息的串行控制台。 这是 //仅针对此示例程序,计时器/PWM 操作不需要。 // InitConsole(); // //为 CCP 管脚配置 ccp 设置。 该函数也会提供 将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表 //查看每个引脚分配的函数。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_3); // //在控制台上显示示例设置。 // UARTprintf ("16位计时器 PWM ->); UARTprintf ("\n 计时器= Timer1B"); UARTprintf ("\n 模式= PWM"); UARTprintf ("\n 占空比= 50%\n"); UARTprintf ("\n 在 CCP3 (PD3)上生成 PWM ->"); //配置计时器以将 PIOSC=16MHz 作为源时钟 // // TimerClockSourceSet (Timer1_base、timer_clock_PIOSC); // //将 Timer1B 配置为16位周期定时器。 // TimerConfigure (Timer1_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PWM); //将 Timer1B 预加载设置为/10 TimerPrescaleSet (Timer1_base、timer_B、0x49); // //将 Timer1B 加载值设置为0x3E00。 // TimerLoadSet (Timer1_base、timer_B、0x3E00); // //将 Timer1B 匹配值设置为装载值/2。 TimerPrescaleMatchSet (Timer1_base、Timer_B、 TimerPrescaleGet (Timer1_base、timer_B)/ 2); // TimerMatchSet (Timer1_base、Timer_B、 TimerLoadGet (Timer1_base、timer_B)/ 2); // //启用 Timer1B。 // TimerEnable (Timer1_base、timer_B); // //在 Timer1B PWM 运行时永久循环。 // while (1) { // //控制台上显示程序正在运行的打印输出指示。 // PrintRunningDots(); } }

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

    您好、Charles、

    感谢解决方案、我们一定会尝试这一点。

    谢谢、

    Nischitha