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.

[参考译文] MSP430G2131:使用 MCU 上的计时器生成2个不同的 PWM

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1010878/msp430g2131-generating-2-different-pwms-using-the-timer-on-the-mcu

器件型号:MSP430G2131
主题中讨论的其他器件: DRV8838DRV8838EVM

您好!

我对 MSP430G2131计时器有疑问。 此链接 “M 400基于单个计时器.pdf 的多时基”提到“在特定 MSP430器件上可以同时生成的频率和占空比数量取决于器件上所有 TxCCRx 寄存器的总数”(对于多时基方法)。 我们在 DRV8838 EVM 上使用 MSP430G2131。 它有2个 TxCCRx 寄存器、因此我们假设它可以创建2个不同的频率和占空比。  

对于我们的项目、我们需要生成:

  1. 一个 PWM、频率= 20Hz、占空比= 20%。 我们可以正确生成这个。
  2. 另一个 PWM (用于驱动电机)、其设置频率优于 KHz、占空比随用户输入而变化。

我们不使用 DRV8838EVM 上的电位器来更改占空比。 我们在 MSP430G2131和 CH341芯片之间建立了 SPI 通信。 因此、可通过 PC 上的软件更改占空比(使用 SPI 通过 CH341发送到 MSP430G2131)。

我们在生成 PWM 以驱动电机时遇到问题。 对于每个频率、有几个可精细生成 PWM 的占空比值(占空比根据 PC 的输入变化)。 但是、对于剩余的占空比值、PWM 要么在两者之间存在较大间隙时不稳定、要么不会产生正确的 PWM 信号。 我们已在随附的 Excel 文件中注意到这些影响。 然而,我们无法理解这背后的原因。

e2e.ti.com/.../DRV88-PWM.xlsx

附件也是我们的 CCS 代码。

e2e.ti.com/.../CCS-code.txt

感谢您的任何帮助。

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

    该方法要求每个 PWM 边沿都有一个中断(ISR 调用)。 因此,中断必须在 PWM 阶段周期内完成,否则下一个中断将“丢失”--在计数器超过该值后,CCR 将被更改,并且不会发生边沿。 这限制了您可以管理的最短相位(高或低)。

    我通常估计20-30个 CPU 时钟用于进入/退出 ISR、以及函数实际执行的任何操作。 (您可能可以更精确地使用电子表格中的数据进行估算、但您的数字看起来是正确的。)

    通常的解决方案是提高 CPU (DCO)的速度- 8MHz 可能就足够了。 G2131只有一个校准频率(1MHz)、这会使事情复杂化。 如果电路板上有32kHz 晶体、则可以生成其他时钟速度校准。 您有这样的晶体吗?

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

    您好!  

    感谢你的答复。  

    G2131的数据表规定如下:   

    MCU 的 CCS 头文件提到:  

    可以 通过调整 CCS 代码来生成高达16MHz 的时钟。

    我们是否需要将 SMCLK 源从 DCOCLK 更改为 XT2CLK/LFXTCLK 并 通过数据表中规定的2个引脚连接一个外部晶体振荡器。

    谢谢你。  

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

    通过调整 DCOCTL 和 BCSCTL1寄存器[参考用户指南(SLAU144J)第5.3.1/2节]、您可以生成 DCO 时钟(高达16MHz)。 挑战在于、我无法告诉您要使用的值(没有人可以)。 对于 G2131、TI 测量/计算一组经校准的 CALCO/CALBC1值、如果将其放入时钟寄存器中、将以1MHz 的频率运行 DCO [参考数据表(SLAS694J)表9]。 您没有理由拥有多个器件(如 G2553中所示)、但 TI 仅为此器件提供了一个。 要进行此计算、您需要来自芯片外部的某种参考信号。

    计算这些常量如以下示例 msp430g2xx1_DCO_flashcal.c 所示:

    https://dev.ti.com/tirex/explore/node?node=AAsjUg5xPFRFUbXN9Ehc.Q__IOGqZri__LATEST

    按照编码、它假定一个32kHz 晶振被连接至 P2.6/7并且它使用来自 ACLK 的定时器捕捉来运行一个 FLL。 (运行时间可能为1-2秒。) 它计算常数并将其存储在闪存(信息段 A)中、因此您只需执行一次。

    此技术的变体可能会在 P1.6上接受32kHz 信号、并使用 TA0.CCI1B 中的捕捉[参考数据表表表16]。 实验信号发生器或另一个 MSP430 (经过适当编程)可以 提供此类信号。

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

    您好!  

    感谢你的答复。  

    我们正在稍微改变一些东西。 我们希望在向上计数模式下使用计时器来生成单个 PWM、并使用计时器中断来递增计数器变量、以供其他用途。

    但是、变量的值不会改变。 是否有任何需要满足的特定条件、以便程序进入计时器中断服务例程?  

    谢谢、  

    Piyusha   

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

    您是否达到了 ISR 中设置的断点?

    如果没有、请确保(相关) CCIE 和 GIE 都被置位。

    如果是、请确保您的计数器被声明为"volatile"。

    如果您可以发布(或附加)您的代码、我们可能能够更好地进行猜测。

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

    你(们)好  

    抱歉。 我们仍在使用一个计时器来生成2个 PWM。 假设其中一个 PWM 的频率= 20Hz、占空比= 20%。 这意味着周期为50ms (高电平时间= 10ms)。 即 CCR0寄存器最多可达1000个计数)。  

    我们需要等待0.6ms、然后再将 ADC10_MEM 中的数据放入另一个变量中。  因此、我假设0.6ms = 60次计数。 但是、当我们尝试这样做时、ADC 仅返回值0。  

    附件是我们的代码。 感谢您的任何帮助。  

    e2e.ti.com/.../8611.code.txt

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

    您在查看 ADC_val 还是 ADC10MEM 吗?  

    这看起来有点奇怪:

    >SLAVE_DATA[11]=低电平;
    >IF (((low - slave_data[11])== 60)

     在这里、(l低层 从数据[11])似乎始终为0 (或可能为1)。  我不太确定你打算做什么、但这会阻止读取 ADC10MEM。

    ----------

    >  while (ADC10IFG & ADC10CTL0);    //等待转换完成

    该测试是向后的、因此(IFG 的工作方式)它将(a)完全不等待或(b)永远等待。 这通常会"意外工作"、但有一天会给您带来麻烦。 尝试:

    >  while (!(ADC10IFG & ADC10CTL0));    //等待转换完成