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.

[参考译文] CC2340R5:如何在 LGPTimer 驱动器中控制单通道?

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1443300/cc2340r5-how-to-control-single-channel-in-lgptimer-driver

器件型号:CC2340R5

工具与软件:

尊敬的团队:

我将使用 LGPTimer 驱动程序输出3通道 PWM。

如何控制单个 PWM 通道? 具体来说、在配置 LGPTimer 参数并调用LGPTimerLPF3_open以初始化驱动程序后、所有三个 PWM 通道都处于活动状态。 但是、在某些时候、我需要禁用其中一个通道(例如、禁用通道2)。

我需要直接控制寄存器、请查看下面的代码。 是否推荐使用此方法实现此功能?

    LGPTimerLPF3_Handle lgptHandle;
    LGPTimerLPF3_Params params;
    uint32_t cntTargetVal = 48000 / 2;   // 1kHz PWM count in crystal of 48 MHz
    uint32_t chCompVal0    = cntTargetVal/2; // duty of 50%
    uint32_t chCompVal1    = cntTargetVal - cntTargetVal/10; // duty of 10%
    uint32_t chCompVal2    = cntTargetVal - cntTargetVal/20; // duty of 5%

    // Configure channels action
    LGPTimerLPF3_Params_init(&params);
    params.channelProperty[0].action = LGPTimerLPF3_CH_TOGGLE_ON_COMPARE_PERIODIC;
    params.channelProperty[1].action = LGPTimerLPF3_CH_TOGGLE_ON_COMPARE_PERIODIC;
    params.channelProperty[2].action = LGPTimerLPF3_CH_TOGGLE_ON_COMPARE_PERIODIC;

    // Open driver
    lgptHandle = LGPTimerLPF3_open(0, &params);

    // Set channel output signal period
    LGPTimerLPF3_setInitialCounterTarget(lgptHandle, cntTargetVal, false);

    // Set channel output signal duty cycle
    LGPTimerLPF3_setInitialChannelCompVal(lgptHandle, LGPTimerLPF3_CH_NO_0, chCompVal0, false);
    LGPTimerLPF3_setInitialChannelCompVal(lgptHandle, LGPTimerLPF3_CH_NO_1, chCompVal1, false);
    LGPTimerLPF3_setInitialChannelCompVal(lgptHandle, LGPTimerLPF3_CH_NO_2, chCompVal2, false);

    // Start the LGPTimer in up-down-periodic mode
    LGPTimerLPF3_start(lgptHandle, LGPTimerLPF3_CTL_MODE_UPDWN_PER);


    while(1)
    {
        usleep(100000);
        
        // Disable       
        HWREG(LGPT3_BASE | 0x000000C8) &= 0xFFFFFFF0;

        usleep(100000);
        // Enable
        HWREG(LGPT3_BASE | 0x000000C8) |= 0x0000000E;

    }
    

谢谢。

BR、

Connor。

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

    您好、Connor、

    我看了一下您的代码、并在我的终端运行了它、它运行得很好、这对客户来说意味着什么?  

    我有一个类似的请求单试图解决相同的问题、但需要修改我的案例中的驱动器本身 [TIDRIVERS-7004] CC2340R5 PWM 多通道修复-德州仪器(TI) JIRA。  

    谢谢!
    Alex F

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

    您好、Alex、

    这是否适用于客户?  [报价]

    是的、他们需要使用 CC2340的所有计时器资源。 但他们仍然发现限制。 因此、它们需要控制每个通道 PWM (例如、按下一个按钮来启用通道、按下释放按钮来禁用)。

    嗯、我创建这个线程只是为了确认风险

    是否有支持此功能的计划?

    谢谢!

    BR、

    Connor。

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

    您好、Conor、

    是否有任何支持此功能的计划?

    -我相信我们 可以使用上述代码片段与一些 GPIO 控制,以实现客户需要的东西。

    谢谢!
    Alex F

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

    您好、Alex、

    发现另一个问题。

    这个问题会被描述为:当周期性打开 LGPTimer 以生成 PWM 时,一个错误的 PWM 占空会出现 一些回合。 然后生成正确的 PWM 占空比。

    您能给我一些技巧来找出所示图片问题的根本原因吗? 代码片段。 红色的矩形表示错误的占空比 PWM。

        LGPTimerLPF3_Handle lgptHandle;
        LGPTimerLPF3_Params params;
        uint32_t cntTargetVal = 48000 / 2 / 3;   // 1kHz PWM count in crystal of 48 MHz
        uint32_t chCompVal0    = cntTargetVal/2; // duty of 50%
        uint32_t chCompVal1    = cntTargetVal - cntTargetVal/10; // duty of 10%
        uint32_t chCompVal2    = cntTargetVal/10; // duty of 90%
        uint32_t time2   = 2000;
        
        while(1)
        {
            // Configure channels action
            LGPTimerLPF3_Params_init(&params);
            params.channelProperty[0].action = LGPTimerLPF3_CH_TOGGLE_ON_COMPARE_PERIODIC;
            params.channelProperty[1].action = LGPTimerLPF3_CH_TOGGLE_ON_COMPARE_PERIODIC;
            params.channelProperty[2].action = LGPTimerLPF3_CH_TOGGLE_ON_COMPARE_PERIODIC;
    
            // Open driver
            lgptHandle = LGPTimerLPF3_open(0, &params);
    
            // Set channel output signal period
            LGPTimerLPF3_setInitialCounterTarget(lgptHandle, cntTargetVal, false);
    
            // Set channel output signal duty cycle
            LGPTimerLPF3_setInitialChannelCompVal(lgptHandle, LGPTimerLPF3_CH_NO_0, chCompVal0, false);
            LGPTimerLPF3_setInitialChannelCompVal(lgptHandle, LGPTimerLPF3_CH_NO_1, chCompVal1, false);
            LGPTimerLPF3_setInitialChannelCompVal(lgptHandle, LGPTimerLPF3_CH_NO_2, chCompVal2, false);
    
            // Start the LGPTimer in up-down-periodic mode
            LGPTimerLPF3_start(lgptHandle, LGPTimerLPF3_CTL_MODE_UPDWN_PER);
            
            usleep(time2);
            
            // Disable
            LGPTimerLPF3_stop(lgptHandle);
            LGPTimerLPF3_close(lgptHandle);
            usleep(time2);
    
        }

    实际上、我发现"time2"延迟时间会 影响此问题(时间过长(>100ms)不会重现此问题)。

    所以、我需要你们的帮助。

    谢谢!

    BR、

    Connor。

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

    您好、Connor、

    请参考下面的代码逻辑跟踪、我目前无法重现您的问题:

    #include <ti/drivers/timer/LGPTimerLPF3.h>
    /* Driver configuration */
    #include "ti_drivers_config.h"
    
    /*
     *  ======== mainThread ========
     *  Task periodically increments the PWM duty for the on board LED.
     */
        LGPTimerLPF3_Handle lgptHandle;
        LGPTimerLPF3_Params params;
    void *mainThread(void *arg0)
    {
        while(1)
        {
        uint32_t cntTargetVal = 48000 / 2 / 3;   // 1kHz PWM count in crystal of 48 MHz
        uint32_t chCompVal0    = cntTargetVal/2; // duty of 50%
        uint32_t chCompVal1    = cntTargetVal - cntTargetVal/10; // duty of 10%
        uint32_t chCompVal2    = cntTargetVal/10; // duty of 90%
        uint32_t time2   = 2000;
        // Configure channels action
        LGPTimerLPF3_Params_init(&params);
        params.channelProperty[0].action = LGPTimerLPF3_CH_TOGGLE_ON_COMPARE_PERIODIC;
        params.channelProperty[1].action = LGPTimerLPF3_CH_TOGGLE_ON_COMPARE_PERIODIC;
        params.channelProperty[2].action = LGPTimerLPF3_CH_TOGGLE_ON_COMPARE_PERIODIC;
    
        // Open driver
        lgptHandle = LGPTimerLPF3_open(0, &params);
    
        // Set channel output signal period
        LGPTimerLPF3_setInitialCounterTarget(lgptHandle, cntTargetVal, false);
    
        // Set channel output signal duty cycle
        LGPTimerLPF3_setInitialChannelCompVal(lgptHandle, LGPTimerLPF3_CH_NO_0, chCompVal0, false);
        LGPTimerLPF3_setInitialChannelCompVal(lgptHandle, LGPTimerLPF3_CH_NO_1, chCompVal1, false);
        LGPTimerLPF3_setInitialChannelCompVal(lgptHandle, LGPTimerLPF3_CH_NO_2, chCompVal2, false);
    
        // Start the LGPTimer in up-down-periodic mode
        LGPTimerLPF3_start(lgptHandle, LGPTimerLPF3_CTL_MODE_UPDWN_PER);
    
        usleep(time2);
    
        // Disable
        LGPTimerLPF3_stop(lgptHandle);
        LGPTimerLPF3_close(lgptHandle);
        usleep(time2);
        }
    }

    谢谢!
    Alex F

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

    您好、Connor、

    *请注意,我在这里使用8_10 F3 SDK。 (*我还测试了 time2设置为100、但仍然没有看到相同的问题)  

    谢谢!
    Alex F