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.

[参考译文] LP-MSPM0L1306:更改占空比

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1196893/lp-mspm0l1306-changing-duty-cycle

Thread 中讨论的其他器件:SysConfig

您好、Luke、

       我们通过 SysConfig 工具使用 PWM 和计时器。现在我们需要在代码本身中加载占空比值。由于占空比在 SysConfig 中预定义为单个值、因此无法在代码中更改。因此、如何通过定义来更改代码中的占空比值 函数中的变量。

       我们尝试将 PWM 和计时器外设组合在一起。代码编译无错误。但 我们将获得 PWM 或计时器输出的输出。请帮助我们尽快完成这些问题。

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

    大家好、Mohankumar、

    我创建了一个新的线程并将其移动到这里。 将来在讨论新主题时、请创建新主题、这将使其他用户能够找到相关主题的解决方案。

    您可以通过调用相关函数来更改 PWM 的占空比。 调用 DL_TimerG_startCounter (PWM_0_INST);

    uint16_t ccv = 30; //This is the capture compare value you want to set
    
    //Call this function to change the capture compare value
    DL_TimerG_setCaptureCompareValue(PWM_0_INST, ccv, DL_TIMER_CC_0_INDEX);

    此致、

    Luke

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

    大家好、Mohankumar、

    查看 您在这里发布的图表、您可以调用上面显示的函数、例如更改占空比。 如果您有 PWM_0_INST、则可以设置捕获比较值以匹配占空比、也可以使用 SysConfig 查找所需的数字。 然后、您可以根据 ADC 读数动态更改占空比。

    uint16_t adcVal = 1000;
    
    if(adcVal < 1000)
        DL_TimerG_setCaptureCompareValue(PWM_0_INST, 1800, DL_TIMER_CC_0_INDEX);
    else if(adcVal < 2000)
        DL_TimerG_setCaptureCompareValue(PWM_0_INST, 1400, DL_TIMER_CC_0_INDEX);
    else if(adcVal < 3000)
        DL_TimerG_setCaptureCompareValue(PWM_0_INST, 600, DL_TIMER_CC_0_INDEX);
    else
        DL_TimerG_setCaptureCompareValue(PWM_0_INST, 200, DL_TIMER_CC_0_INDEX);

    我建议使用 SysConfig 帮助根据您的配置查找占空比 CCV、只需打开 SysConfig 和代码选项卡(右上角的<>符号)并单击 ti_MSP_dl_config.c 即可

    向下滚动到 PWM 初始化的位置、您可以看到用于设置捕获比较值的函数。 (此处为第150行)

    当您更改占空比时、行将更新并显示更改、然后您可以获取此值并在代码中放置相同的值。

    此致、

    Luke

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

    您好、Luke、

             我们使用 Timer_0来生成  400ms 计时器、在该计时器中断中、我们添加了一个标志来确认计时器中断正在工作、并 使用它来切换 LED。我们将获得所需的输出 (即400ms 开/关)、但我们无法  获取标志的更新值(即 e flag=1)。因此、请帮助我们在计时器中断函数中添加变量。  

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

    大家好、Mohankumar、

    您能否共享您的计时器 ISR? 此外、在计时器 ISR 中放置一个断点、以验证是否已到达计时器 ISR。

    此致、

    Luke

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

    您好、Luke、

         我们 在 ISR 计时 器函数中设置断点、它   位于 ISR 函数循环内部、我们将其称为 LED 切换函数、但如果我们设置变量(flag)、则无法获取该变量的设置值。

    void timer_0_INST_IRQHandler (void)

    静态 uint16_t count = timer_800_milliseconds;
    开关(DL_TimerG_getPendingInterrupt (TIMER_0_INST))

    案例 DL_TIMER_IIDX_ZERO:
    /*
    *计数器停止以避免与计时器读数发生冲突
    *正在设置的加载值
    *
    DL_TimerG_stopCounter (timer_0_INST);

    /*
    *在复位前、计数以0.05s 的增量逐渐变小
    * 0.5s
    *
    uint32_t count = timer_800_milliseconds;

    DL_Timer_setLoadValue (TIMER_0_INST、COUNT);
    /*
    *默认情况下、这应加载新的计数值并递减计数
    *从那里(CVAE = 0)
    *
    DL_TimerG_startCounter (timer_0_INST);
    DL_GPIO_togglePins (GPIO_LED_PORT、GPIO_LED_USER_LED_1_PIN);
    flag =~ flag;
    中断;
    默认值:
    中断;

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

    大家好、Mohankumar、

    如果您希望每次切换标志。

    将 FLAG =~标志;更改为 FLAG =!FLAG;

    否则、我会将变量显式设置为所需的值。

    在这里、位数学对您不利、您可以单步执行反汇编以查看此处的差异。 如果变量是 char (如果变量是 bool、则不起作用)、您还可以将运算更改为 flag =~(flag & 0xFF)。

    此致、

    Luke

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

    您好、Luke、

          我们尝试了上述指令 来设置变量(flag)。不起作用、我们无法获取变量的设置值。

    flag= !flag;

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

    大家好、Mohankumar、

    标志是什么类型的变量? 变量是否在 ISR 范围内?

    我使用了 timx_timer_mode_periode_sleep 示例、并在 ISR 中放置了一个正在切换的 bool、下面是略微修改的代码。

    #include "ti_msp_dl_config.h"
    
    bool check = false;
    
    int main(void)
    {
        SYSCFG_DL_init();
    
        NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
        DL_SYSCTL_enableSleepOnExit();
    
        DL_TimerG_startCounter(TIMER_0_INST);
    
        while (1) {
            __WFI();
        }
    }
    
    void TIMER_0_INST_IRQHandler(void)
    {
        switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
            case DL_TIMER_IIDX_ZERO:
                DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
                check = !check;
                break;
            default:
                break;
        }
    }
    

    此致、

    Luke