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/MSP430F5438A:正弦调制 PWM

Guru**** 2562380 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/596491/ccs-msp430f5438a-sinusoidal-modulation-pwm

器件型号:MSP430F5438A

工具/软件:Code Composer Studio

我有一项任务、需要将正弦 PWM 发送到 LE 二极管。 此类正弦信号的频率通过按钮进行更改、频率范围为1Hz 至16Hz。

MSP430计时器非常复杂,使用适当的输出模式(复位/设置= OUTMODE7),它们可以轻松地生成 PWM 输出,并将其发送到选定的外围设备,在我的情况下,端口4的引脚3是 LE 二极管。 因此、我使用比较寄存器 TB0CCR3来复位脉冲、使用 TB0CCR0寄存器来设置 PWM 的脉冲、所有这些都符合 SLAU401E。

问题是、有时当我将频率更改为偶数(它绝不是奇数)时、TB0CCR3寄存器似乎卡在值0x0000、并且不会改变、从而使输出为零、或者换句话说、LE 二极管不会发光。 此外、发生这种情况时没有规律性、我只能说、在奇数频率下不会发生、偶数频率下也不会发生、有时也不会有规律性发生。

中断是用汇编语言编写的、主程序是用 C 语言编写的

以下是代码:

e2e.ti.com/.../7206.main.ce2e.ti.com/.../interruptP2.asm

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尼科拉
    您是否在 TI Resource Explorer 中查看过我们的示例? 我们在汇编语言和 c 中有一些介绍如何执行 PWM 的内容。

    我立即认为、您要将 CCR3设置为0、因为您的 sine_Values 数组中有许多条目为0。 这是可行的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

    我不明白为什么零会成为问题。 当 TB0R 寄存器的值达到255时、TB0CCIFG0被置位并请求中断。 此外、由于选择了 OUTMODE_7、因此设置输出。 在中断服务例程中、我更改用于生成 PWM 脉冲宽度的样本的值。 如果我将其更改为零并返回主程序、当 TB0R 从255更改为0时、应该执行另一个定时器时钟(TB0R 在达到 TB0CCR0后被复位、因为定时器在增模式下工作)。 此时、输出应该被复位、因为 TB0R 达到比较寄存器 TB0CCR3中的值、在之前的中断例程中、这个值被改变为零。
    不过、我也考虑到了这一点、因为这是最简单的解决方案。 我将把所有零更改为1。 当我拿到电路板时、我会检查这一点、因为我会与另一位同事分享这一点。

    不过、要将其清除。 TB0CCR3似乎一直保持为零、因为在某些情况下、代码永远不会到达定时器 B0的中断例程。 因此、该寄存器的值永远不会改变、因此 PWM 的脉冲宽度始终设置为零、因此 LE 二极管不会发光。 当我按下任一按钮更改频率时、它再次开始正常工作。 再按几次键后(在此期间一切正常、LE 二极管根据设定的频率以正弦方式发光)、它就会停止、这两种情况之间没有规律性、除非我将频率从偶数更改为奇数时从未发生过这种情况。 我想知道什么可能是问题? 按下某个按钮后、为什么停止生成中断? 它是否必须在按下按钮时的特定时间内执行某项操作?

    同时、我将检查 TI Resource Explorer。 没有意识到它。 我主要依赖 SLAU208P 文档。

    此致!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nikola、
    只需办理入住手续。 您是否在尝试新值方面取得了任何进展?

    我怀疑您的体验是 CCR 值的组合、这种组合会阻止 Timber B ISR 触发。 我看到您在 main.c 的底部添加了 ISR 注释、在 ISR 的 C 语言实现时、您是否看到了此问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好。

    我发布了有关我所面临问题的问题已经有一段时间了。 我有时间处理我的问题。

    遗憾的是、我没有解决在汇编语言中写入的 Timer B 中断例程的问题。 我尝试了所有东西,但实际上不知道下一步该做什么。

    所以、我确实使用了用 C 语言编写的代码、这很好。 它可能与我在例程中使用正弦值数组的方式有关(特定值不是问题,因为当我尝试时,我将它们全部更改为相同值,但仍然有相同的问题)。 我需要进行更多读取。  

    任务表现出色、这样我就没有问题、因此这个线程可能会被遗忘。

    感谢 Cameron 的帮助、感谢他为解决问题展示了其他一些方法。

    此致!

    Nikola Gajic

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    听得好、如果您在这里遇到更多问题、请告诉我。