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.

[参考译文] MSP430FR6047:如何限制 TA0计时器的脉冲数?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1492810/msp430fr6047-how-do-i-limit-the-number-of-pulses-for-ta0-timers

器件型号:MSP430FR6047

工具与软件:

您好!

我想将脉冲输出的数量限制为10、但效果不佳、因此需要了我的帮助。

系统时钟为8 MHz 、我按如下方式配置 TA0、以便两个输出为180度异相:

void initPulseGenerator(void)

{

    // Stop the watchdog timer

    WDTCTL = WDTPW | WDTHOLD;

 

    // Disable the default high-impedance mode

    PM5CTL0 &= ~LOCKLPM5;

 

    // Configure P7.4 for TA0.1 and P7.7 for TA0.2

    // (Check that these pins do not require port mapping on your board.)

    P7DIR |= BIT4 | BIT7;      // OUTPUT DIRECTION

    P7SEL0 |= BIT4 | BIT7;     // Timer function

    P7SEL1 &= ~(BIT4 | BIT7);  // Clear to 0 for TA0.x

 

    // Stop Timer_A0 during configuration

    TA0CTL = MC__STOP;

 

    // With SMCLK at 8MHz, one clock is 125ns.

    // To get a 1MHz output (period = 1µs = 8 clocks), set CCR0 = 7 (timer counts 0..7).

    TA0CCR0 = 7;

 

    // For a 50% duty cycle, set both CCR1 and CCR2 to 4.

    TA0CCR1 = 4;

    TA0CCR2 = 4;

 

    // Configure PWM output modes:

    // TA0CCTL1: OUTMOD_3 (set/reset) => high at timer start, low after CCR1

    TA0CCTL1 = OUTMOD_3;

 

    // TA0CCTL2: OUTMOD_7 (reset/set) => low at timer start, high after CCR2

    TA0CCTL2 = OUTMOD_7;

}

现在、它持续生成脉冲。

在下面的代码中、我将尝试在中断标志触发时清除中断标志、并在重复10次后停止、但该信号只是保持高电平。

void startPulseGenerator(void)

{

    TA0R = 0; // Reset timer counter

    TA0CTL = TASSEL__SMCLK | MC__UP | TACLR;

 

    // Wait for exactly 10 pulse cycles

    int cycles = 0;

    while (cycles < 10)

    {

       while (!(TA0CCTL1 & CCIFG)); // Wait for rising edge of PWM (CCR1 match)

       TA0CCTL1 &= ~CCIFG;          // Clear flag

       cycles++;

    }

 

    stopPulseGenerator();

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    系统时钟为8 MHz 、我按如下所示配置了 TA0、以便两个输出为180度异相:

    1MHz 速度太快、CPU 无法检查计时器的状态。

    我建议您使用1kHz 进行功能测试、然后切换回更高频率。

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

    正如 Helic 所说、尝试跟上1MHz PWM 的步伐是非常紧张的、你可能不会成功。 您可以尝试(作为启发法)计数到例如9。

    如果您通过停止计时器(MC__STOP)来停止 PWM、引脚将保留其最后的设置。 相反、您应更改 OUTMOD。 如果您希望引脚立即变为低电平、请将 CCTL-s 更改为{OUTMOD=0、OUT=0}。 如果您想完成此循环、请尝试{OUTMOD=5 [Reset]}。

    一旦你改变了 OUTMOD-s、你就有足够的时间--你可以在下一个 CCR0事件时停止定时器、甚至让它在下一个突发中运行。

    [编辑:如果这是一个重要的要求、我认为也有 DMA 解决方案。]

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

    感谢你的帮助。 这是解决我的问题的良好起点。 尽管它没有解决我的问题、但我会将此标记为已解决。

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

    谢谢你。 这绝对是我所缺少的。 现在、我已经超过了开启和关闭的阈值。

    现在我面临着另一个问题、尽管它不是那么重要。 我想将脉冲计数限制为10。 当频率很低时(我按照 Helic 建议在1KHz 下进行了测试)、我恰好得到了10个脉冲。 但在1 MHz、我会得到25个脉冲。 然后我将计数减少到5、然后得到15个脉冲。

    我试图将 int 计数从向上更改为向下、然后将计数更改为5、即从5更改为 0。 没有变化。 我仍然有15个脉冲。  

    因此我将计数更改为4、然后我得到11个脉冲。

    我认为这已经足够接近了。 我要将该线程标记为已解析。 但如果你能帮我整理这件事,它将是非常有帮助的。

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

    抱歉、我漏掉了这里隐含的问题。

    DMA 解决方案背后的概念是:要获取 N 个脉冲、请让 DMA 从 N 元素数组中传输由 CCR0触发的 TA0CCTL1的 N 个副本。 第一次(N-1)(重新)写入相同的值、即您在开头设置的值;然后、N-TA0CCTL1 th 写入值(OUTMOD=) 、其中 是您在上面挑选的设置。

     在单模式下、DMA 每个触发只能传输1个字(16位)、因此这可能会捆绑2个 DMA 通道(对于2个计时器通道)。 这就是我在上面提到"重要要求"的原因。

    根据用户指南(SLAU367P)表11-3中的 DMA 时序、8MHz 可能足够了。 (但在你依赖它之前尝试它。) DMA 触发器在数据表(SLASEB7C)的表6-11中列出。

    [免责声明:我还没有尝试过这种方法、但我已经用基于计时器的 DMA 做了一些其他 oddball 技巧、而且我很少感到惊讶。]

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

    谢谢你。  

    但我会保留您的宝贵提示以供将来使用。 现在它在我的电平之上、我找到了实现它的正确方法、即获取差动1 MHz 脉冲。 仅仅几天前、我就意识到我可以使用 CH0_OUT 和 CH1_OUT 作为差分输出、这将会在换能器的任一侧撞击。

    我曾尝试在 EVM 中进行确认、但不知何故、从这些引脚没有得到任何信息。 可能这些引脚已损坏。 但我很确定,如果他们不是,我会得到我需要的东西。 但即使我错了,我仍然会得到我需要的一半。

    干杯!!