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.

[参考译文] CCS/TM4C123GH6PM:如何重复切换 ui8Adust 值(例如60和110)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/916276/ccs-tm4c123gh6pm-how-to-switch-ui8adjust-value-say-60-and-110-repeatatively

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

您好!

我需要有关 PWM 代码的帮助。 在 TI 提供的示例中、 ui8Adjust = 83;. If I want to repeat this value as ui8Adjust = 60 and after two second ui8Adjust = 110;and after 2 sec ui8Adjust = 60 again and repeat in this way(ie switch between 60 and 110 every 2 second).

您可以告诉我代码的更改是什么。

此致、

Nasim

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

    您好!

     您指的是哪一个 TI 示例? 您能澄清一下吗?

     您是否正在尝试调整占空比或周期?

     如果要配置占空比,将使用 PWMPulseWidthSet()。 如果要配置周期,将使用 PWMGenPeriodSet()。

     下面是一个配置 PWM 模块的示例。 您需要使用 PWM_GEN_MODE_GEN_SYNC_LOCAL、以便如果您要重复更改占空比或周期、更改将在 PWM 周期结束时生效。

    //
    //将 PWM0配置为通过同步进行递增/递减计数。
    //
    PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN |
    PWM_GEN_MODE_GEN_SYNC_LOCAL);
    
    //
    //将 PWM 周期设置为250Hz。 以计算适当的参数
    //使用以下公式:n =(1 / f)* SYSCLK。 其中 N 是
    //函数参数、f 是所需的频率、SYSCLK 是
    //系统时钟频率。
    //在本例中、您得到:(1/250Hz)* 16MHz = 64000个周期。 请注意
    //可以设置的最大周期为2^16。
    // TODO:修改此计算以使用您当前的时钟频率
    //使用。
    //
    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、64000);
    
    //
    //将 PWM0设置为25%的占空比。 您将占空比设置为函数
    /的周期。 由于周期是在上面设置的、因此您可以使用
    // PWMGenPeriodGet ()函数。 在本示例中、PWM 将为高电平
    // 25%的时间或16000个时钟周期(64000 / 4)。
    //
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、
    PWMGenPeriodGet (PWM0_BASE、PWM_GEN_0)/ 4);
    
    //
    //启用 PWM0位0 (PD0)输出信号。
    //
    PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT、TRUE);
    
    //
    //启用 PWM 发生器模块。
    //
    PWMGenEnable (PWM0_BASE、PWM_GEN_0); 

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

    您好、Charles、

    非常感谢您的回答。  我希望 ui8adjuste 为110和60、间隔为2秒。 然后在2秒后为110、并继续重复此操作。 请帮我处理该代码。

    我用下面提到的代码来参考 PWM 控制示例:

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

    #define PWM_FREQUENCY 55
    int main (空)

       volatile uint32_t ui32Load;
       volatile uint32_t ui32PWMClock;
       volatile uint8_t ui8Adcust;
       ui8Adsit= 83;

       ROM_SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);
       ROM_SysCtlPWMClockSet (SYSCTL_PWMDIV_64);
       ROM_SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);
       ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
       ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
       ROM_GPIOPinTypePWM (GPIO_PORTD_BASE、GPIO_PIN_1);
       ROM_GPIOPinConfigure (GPIO_PD1_M1PWM1);
       HWREG (GPIO_PORTF_BASE + GPIO_LO_LOCK)= GPIO_LOCK_KEY;
       HWREG (GPIO_PORTF_BASE + GPIO_O_CR)|= 0x01;
       HWREG (GPIO_PORTF_BASE + GPIO_LO_LOCK)= 0;
       ROM_GPIODirModeSet (GPIO_PORTF_BASE、GPIO_PIN_4|GPIO_PIN_0、GPIO_DIR_MODE_IN);
       ROM_GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_4|GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
       ui32PWMClock = SysCtlClockGet ()/64;
       ui32Load =(ui32PWMClock/PWM_FREQUENCY)- 1;
       PWMGenConfigure (PWM1_base、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_GEN_SYNC_LOCAL);
       PWMGenPeriodSet (PWM1_base、PWM_GEN_0、ui32Load);
       ROM_PWMPulseWidthSet (PWM1_base、PWM_OUT_1、ui8Adust * ui32Load / 1000);
       ROM_PWMOutputState (PWM1_base、PWM_OUT_1_BIT、true);
       ROM_PWMGenEnable (PWM1_base、PWM_GEN_0);
       while (1)
       {
           if (ROM_GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_4)=0x00)
           {
               ui8Adife--;
               IF (ui8Ads正义< 56)
               {
                   ui8Adsust = 56;
               }
               ROM_PWMPulseWidthSet (PWM1_base、PWM_OUT_1、ui8Adust * ui32Load / 1000);
           }
           if (ROM_GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_0)=0x00)
           {
               ui8Adife++;
               IF (ui8Adsust > 111)
               {
                   ui8Adsit= 111;
               }
               ROM_PWMPulseWidthSet (PWM1_base、PWM_OUT_1、ui8Adust * ui32Load / 1000);
           }
           ROM_SysCtlDelay (100000);
       }
    此致、
    Nasim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     您在哪里获得了此示例? 我不认为这是 TivaWare 示例。 在任何情况下、如果您希望在2秒间隔内更改占空比、则最好在应用中添加一个计时器函数。 计时器将配置为每2秒超时一次。 在超时 ISR 中、您可以相应地更改占空比(例如110或60)。  

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

    代码经过位修改2将 PWM 输出发送到 D1而不是 D0、并且工作正常。

    非常感谢您的建议。 我会尝试。

    此致、

    Nasim