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/MSP432P401R:是否可以在突发模式下执行 PWM?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/683809/ccs-msp432p401r-is-it-possible-to-do-pwm-in-burst-mode

器件型号:MSP432P401R

工具/软件:Code Composer Studio

大家好、我想在突发模式下使用 MSP432 PWM、这是可行的吗?

如果没有、TI 是否有任何 IC 可以使我在突发模式下形成方波?

我需要设置突发中的平方量和从一个到另一个的距离时间。

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

    当您说突发模式时、您能描述一下该行为吗? 您是否希望 PWM 在没有 CPU 干预的情况下持续输出信号?

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

    您好、Michael、

    您是指哪种突发模式?

    Timer_A 生成的 PWM 不应受克突发操作或 DMA 突发传输的影响。

    我是否错过了 MSP432P4xx Tech 的一些内容。 参考 手册(SLAU356H)?

    此致、

    Tomasz

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

    您好!

    我想使用 MSP432的 PWM 计时器生成如下突发:

    MSP432的 PWM 计时器驱动程序能否执行此操作? 如果没有、MSP432是否可以这样做?

    如果 MSp432不能做到这一点、TI 是否有能够执行突发信号的 IC?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您必须使用另一个计时器作为栅极。 外部与门可用于生成突发。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keith、

    感谢您的回答。 我可以使用2个 PWM。
    一个具有正常频率、另一个用于控制"突发接收"(信号矩形量)和"突发距离"(每次突发之间的时间量)的计时器 PWM
    我认为这是可行的、它确实需要 CPU 来处理任何事情。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Michael、

    感谢您的解释!

    如果 PWM 和突发的分辨率为15位、那么所有这些都能满足 您的要求、
    我有一些您可能喜欢的东西。
    仅1个计时器、无外部逻辑。

    只需将输出模式设置为010 Toggle / Reset 即可。

    当定时器计数到 TAxCCRn 值时、输出被切换。
    当定时器计数到 TAxCCR0值时、它被复位。

    TAxCCRn 评估您的 RECT 值。
    TAxCCR0会分配您的 RECT +距离值。

    它能解决您的问题吗?

    如果是、请将此主题标记为已回答。

    我会永远记住你的突发:-)

    此致、

    Tomasz

    输出
    被切换
    时间
    计时器
    计数
    连接到 TAxCCRn
    值。
    它被复位
    时间
    计时器
    计数
    连接到 TAxCCR0
    值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    对我上一篇帖子的评论。
    我提到了15位分辨率。
    如果我不正确、一个输出将被切换为"定时器时钟"频率的一半。
    图19-1. Timer_A 方框图、SLAU356H 技术 参考 手册。


    此致、

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

    我已经发布了与 Timer_A 文档相关的问题。

    e2e.ti.com/.../684588

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

    您好、Tomasz、

    我更喜欢您的想法、因为我只能使用 MSP432来执行突发。

    我在设置两个计时器以执行突发时遇到了一些问题。

    您可以在附件中找到我的 code.e2e.ti.com/.../3731.timer_5F00_a_5F00_pwm_5F00_mode.c

    我将使用两个计时器 TIMER_A0_BASE 和 TIMER_A1_BASE、并在 GPIO 引脚上单独输出、以使用示波器进行测量并理解。

    我使用 driverlib 来生成 PWM。

    黄色:4MHz PWM 信号

    蓝色:栅极和定时控制

    唯一的问题是未同步。 现在、我如何将这两个信号与一个计时器混合在一起?

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

    Keith 写道:可以使用外部与门来产生突发。

    使用两个 PWM 需要对两个信号进行逻辑与运算
    我认为无法使用 MSP432内部电路来实现。
    可以使用外部与门、基于导体的开式导体逻辑和可能就足够了。

    如果15位分辨率适合您、只需进入切换/复位输出模式即可。


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

    我看不到您的解决方案如何完成工作。 TAxCCR0可以设置 rect+distance、TAxCCRn 可以设置 rect、但如何在"rect"时间内切换 PWM 的引脚?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    安德烈

    《技术参考手册》规定:

    输出模式010切换/复位。
    当定时器计数到 TAxCCRn 值时、输出被切换。
    当定时器计数到 TAxCCR0值时、它被复位。
    第19.2.5.1节输出模式。

    D 型锁存器由计时器时钟反向触发。
    图19-1中的 Looak。

    有什么用吗?

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

    您需要设置 PWM 导通时间、PWM 关断时间、突发时间和距离时间。 您如何实现它? 您能否提供代码片段?
    我现在做了一些肮脏的工作示例,并将在晚上张贴这些示例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有趣的

    您是否说在切换/复位模式下、输出信号未切换?
    也许在星期一晚上,我会有一个空闲时间来调查这件事。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我提供的超快、超脏的示例。

    主要思路:我们使用 CCR0和 CCR1 ISR、计时器处于向上计数模式

    1) 1) CCR0用于 Rect 时间和距离时间。 虽然我们处于距离时间内、但我们不会输出任何 PWM、但我们通过将 CCR1设置为 CCR0 + 1 (以便 CCR1中断永远不会达到)来确保

    2) 2)当我们切换到 Rect 时间(计时器溢出)时、我们通过将 CCR1值更改为 PWM 时间来启动突发、然后在 CCR1 ISR 内部切换开/关时间、直到 wi 再次命中 CCR0。

    /*
    我们假设 SMCLK 为源~ 3MHz、因此
    *采样= 1/3MHz = 333nsec
    * PWM 导通时间= 300 *采样= 100usec;
    * PWM 关闭时间= 150 *采样= 50 μ s
    *且 PWM 周期= 150 μ 秒、占空比= 66.6%
    * Rect 时间= 3000 *采样= 1毫秒
    *距离= 6000 *采样= 2毫秒
    *静态
    
    
    uint16_t u16PwmOnTime = 300;
    静态 uint16_t u16PwmOffTime = 150;
    静态 uint16_t u16RectTime = 3000;
    静态 uint16_t u16DistanceTime = 6000;
    
    
    静态 bool bPwmHigh = false;
    静态 bool bBurstTime = false;
    
    int main (void)
    {
    WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;
    
    P2->DIR |= BIT4;
    P2->SEL0 |= BIT4;
    
    // TACCR0
    Timer_A0->CCTL[0]= TIMER_A_CCTLN_CCIE;
    Timer_A0->CCR[0]= u16DistanceTime; //我们从距离时间开始
    
    // TACCR1
    TIMER_A0->CCTL[1]= TIMER_A_CCTLN_OUTMOD_2 | TIMER_A_CCTLN_CCIE;
    Timer_A0->CCR[1]= u16DistanceTime + 1; //我们不应在距离时间内切换
    
    // ACLK、CONT 模式
    Timer_A0->CTL = TIMER_A_CTL_ssel_SMCLK | TIMER_A_CTL_MC_UP;
    
    
    SCB->SCR |= SCB_SCR_SLEEPONEXIT_MSK;//从 ISR 退出时启用睡眠
    
    //确保 SLEEPONEXIT 立即生效
    _DSB();
    
    //启用全局中断
    __ENABLE_IRQ();
    NVIC->ISER[0]|= 1 <<(TA0_N_IRQn)& 31);
    NVIC->ISER[0]|= 1 <<(TA0_0_IRQn)& 31);
    
    _SLEEP();
    __no_operation(); //对于调试
    器}
    
    
    void TA0_0_IRQHandler (void)
    {
    Timer_A0->CCTL[0]&&~Timer_A_CCTLN_CCIFG;
    
    if (bBurstTime = true)
    {
    bBurstTime = false;
    //重置到距离时间和“关闭”CCR1
    Timer_A0->CCR[0]= u16DistanceTime;
    Timer_A0->CCR[1]= u16DistanceTime + 1;
    }
    其他
    {
    bBurstTime = true;
    //启动突发、将 CCR1设置为 PWM 关闭时间(我们也可以从开启开始-没关系)
    Timer_A0->CCR[0]= u16RectTime;
    Timer_A0->CCR[1]= u16PwmOffTime;
    bPwmHigh = false;
    }
    }
    
    void TA0_N_IRQHandler (void)
    {
    if (timer_A0->CCTL[1]&timer_A_CCTLN_CCIFG)
    {
    Timer_A0->CCTL[1]&&~Timer_A_CCTLN_CCIFG;
    if (bPwmHigh = true)
    {
    bPwmHigh = false;
    Timer_A0->CCR[1]+= u16PwmOffTime;
    }
    其他
    {
    bPwmHigh = true;
    Timer_A0->CCR[1]+= u16PwmOnTime;
    }
    }
    

    第一张图片:突发(1毫秒分辨率)、第二张图片:PWM 本身(50微秒分辨率)。

    请记住、这不是很可靠:在 ISR 内动态调整 PWM。

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

    您好 Andrei、

    感谢您的回答和示例代码。
    我必须对其进行改进、以便它确实需要任何中断。

    如果不能做到这一点、我认为和解决方案会更好。

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

    您好 Andrei、

    我做了一些修改、但仍然无法在没有中断的情况下工作、而是使用外部和。

    为了确保这2个计时器是同步的、我使用 TIMER_A1_BASE (4MHz)作为"突发矩形"发生器、并将其作为 TIMER_A0_BASE 的输入时钟从外部接线。

    Timer_A0_BASE 也会生成 PWM、但会使用 TIMER_A1_BASE 作为时钟、在这里我知道我是同步器。 两者都需要进入和逻辑 IC、TIMER_A0_BASE 控制突发时间和距离。

    这个代码不需要 CPU 来执行任何 ISR 来改变计数器、以此类推。

    以下是我的代码:

    /* DriverLib 包括*/

    #include

    /*应用程序定义*/

    #define TIMER_PERIOD 6.

    #define TIMER_PERIOD_distance 12.

    #define TIMER_PERIOD_BURST  16.

    #define Duty_Cyclle1 3.

    #define DUTY CYCLE2

    /* Timer_A 上行配置参数*/

    CONST Timer_A_UpDownModeConfig upDownConfig =

        Timer_A_CLOCKSOURCE_SMCLK、        // SMCLK 时钟源

        Timer_A_CLOCKSOURCE_divider _1、      // SMCLK/1 = 3MHz

        Timer_Period、              // 127个周期

        Timer_A_TAIE_INTERRUPT_DISABLE、     //禁用计时器中断

        Timer_A_CCIE_CCR0_INTERRUPT_DISABLE、  //禁用 CCR0中断

        Timer_A_do 清除             //清除值

    };

    /* Timer_A 比较配置参数 (PWM1)*/

    CONST Timer_A_CompareModeConfig compareConfig_PWM1 =

        Timer_A_CAPTURECOMPARE 寄存器_1、      //使用 CCR1

        Timer_A_CAPTURECMOLE_INTERRUPT_DISABLE、 //禁用 CCR 中断

        Timer_A_OUTPUTMODE_TOGGLE_SET、        //切换输出但是

        Duty_Cyclle1                 // 32占空比

    };

    Timer_A_PWMConfig pwmConfig2 =

        Timer_A_CLOCKSOURCE_EXTERNAL_TXCLK、//TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK、

        Timer_A_CLOCKSOURCE_DEVIDER_1、//8MHz = Timer_A_CLOCKSOURCE_DEVIDER_3 4MHz = Timer_A_CLOCKSOURCE_DEVIDER_6 2MHz = Timer_A_CLOCKSOURCE_DEVIDER_12

        Timer_Period_burst、

        Timer_A_CAPTURECOMPARE 寄存器_1、

        Timer_A_OUTPUTMODE_TOGGLE_RESET、

        Timer_Period_Distance

    };

    int main (空)

      /*停止 WDT */

      MAP_WDT_A_HOLDTimer();

      GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);

      cs_setExternalClockSourceFrequency (32768、48000000);

      PCM_setCoreVoltageLevel (PCM_VCORE1);

      FlashCtl_setWaitState (FLASH_BANK0、2);

      FlashCtl_setWaitState (FLASH_BANK1、2);

      CS_startHFXT (false);

      CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_Clock_divider);

      CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_select、CS_clock_divider);// MHz

      /*为 CCR 设置 P7.7和 P7.6以及外设输出*/

      MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P7、GPIO_PIN7、GPIO_PRIMARY_MODULE_Function);

      MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4、GPIO_PRIMARY_MODULE_Function);

      MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P7、GPIO_PIN1、GPIO_PRIMARY_MODULE_Function);

      /*将 Timer_A1配置为上行模式并启动*/

      MAP_Timer_A_configureUpDownMode (timer_A1_base、&upDownConfig);

      MAP_Timer_A_startCounter (timer_A1_base、timer_A_updown_mode);

      MAP_Timer_A_initCompare (timer_A1_base、&compareConfig_PWM1);

      MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig2);

      /*不使用时睡眠*/

      while (1)

      {

        MAP_PCM_gotoLPM0 ();

      }

    OBS:对于和逻辑芯片、我找到 了 TI 的 SN74AHC1G09

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

    当然你是对的。
    很高兴您提出了问题。
    谢谢您、Michael 能够朝着正确的方向前进、并取得一些进展。

    上一周五、感谢您、我发现我对 Timer_A 的操作有多误解

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

    很抱歉出现错误提示。

    今天晚上,我为您尝试了一些替代方案。
    我在 Timer_A 和 Comp_E 模数之间的信号路径上看不到任何逻辑和运算。

    我认为、外部和是唯一的选择。


    祝你好运、

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

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

    我已经了解了 MSP430FR5994及其可编程脉冲发生器。
    但仍然没有阐述如何在没有 MPU 周期的情况下实现 PWM 总线。

    请花5分钟时间浏览以下网址:Google、查看此网址:41631B.pdf
    两种 MSP 16/32位架构都具有大量多路复用器、引脚映射等
    但是、它们之间没有 MCU 关闭加载胶。
    添加一些多路复用器和几个栅极/铁条可以提供非常大的 PCB 空间并节省功耗。
    假设 MSP 业务以节能为驱动因素、这真的很遗憾没有 CLCS 模块。

    是否有专利限制?
    我不这么做。

    请继续!
    Rgds/TMK

    P.S. 您是否有任何关于部分屏幕捕获工具的建议?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Michael、

    事实上、您的解决方案是可靠地完成工作的最恰当方式。

    总之、您提出了一个有趣的问题、可以根据您在无 CPU 干预与无外部器件之间可能存在的折衷来以不同的方式解决。

    Tomasz、

    这是一个好问题。 也许来自 MSP 数字设计团队的人可以对此有所了解。 感谢您提供了有趣的参考资料。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    安德烈、迈克尔、我
    我在讨论之后遇到了一些小问题。 您要求提供一些信息的方面是什么?

    关于最初的问题、我使用了定时器/DMA/eusci 的组合来执行类似的操作。 突发是 SPI 输出(MOSI 或 CLK)、由 DMA (加载两个字节的散聚模式)加载、而 DMA 又由计时器触发。

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

    尊敬的 Chris:

     我不理解你的问题:"你要求提供一些照明的方面是什么? "

    我的问题很简单、就是如何执行突发信号并控制矩形的数量和它们之间的时间(距离)。

    对我来说、最好的方法是使用两个计时器和一个外部计时器、并将其组合成突发。