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.

[参考译文] MSP430FR5994:使用 printf 或其他函数时、PWM 输出出现波动

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1394798/msp430fr5994-pwm-output-fluctuating-when-using-printf-or-other-functions

器件型号:MSP430FR5994
Thread 中讨论的其他器件:Energia

工具与软件:

您好!  

当我尝试使用打印功能或任何其他功能时、会得到 PWM 电压的波动。 在该功能完成后、电压会随机变为高电平或低电平、然后继续以设定的占空比运行。 相同的操作在 Energia IDE 中可以轻松运行、但在 CCS 中不起作用。

理想情况下、我希望它在设定的占空比下保持恒定、而不受干扰。

下面是我的代码:

#include

#include

空 initClock()

  WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

  PM5CTL0并且=~Ω LOCKLPM5;//禁用 GPIO 高阻抗模式

  //将 DCO 配置为1 MHz

  CSCTL0_H = CSKEY >> 8;//解锁 CS 寄存器

  CSCTL1 = DCOFSEL_0 | DCORSEL;//将 DCO 设置为1 MHz

  CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;//设置 ACLK = VLO;SMCLK = DCO;MCLK = DCO

  CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;//将所有分频器设置为1

  CSCTL0_H = 0;//锁定 CS 寄存器

}

空 initPWM()

  //将 P1.0配置为 PWM 输出

  P1DIR |= BIT0;//将 P1.0设置为输出

  P1SEL0 |= BIT0;//为 P1.0选择 Timer_A 函数

  //配置 Timer_A

  TA0CCR0 = 1000 - 1;// PWM 周期

  TA0CCTL1 = OUTMOD_7;// CCR1复位/设置

  TA0CCR1 = 0;// CCR1 PWM 占空比

  TA0CTL = TASSEL_2 + MC_1 + TACLR;// SMCLK、向上计数模式、清除 TAR

}

void setPWMDutyCycle (unsigned int dutyCycle)

  TA0CCR1 = dutyCycle;//设置 PWM 占空比

}

void main (void)

{   

  initClock();

  initPWM();

  setPWMDutyCycle (100);

  while (1)

  {

    printf ("hello\n");

    __delay_cycles (1000000);//调整淡出速度的延迟

  }

}

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

    您好、Shoaib、

    我想与您确认:

    您的意思是当您添加"printf ()"指令时、PWM 会发生波动、但当您删除"printf ()"指令时、PWM 不会发生波动?

    您可以尝试在执行"printf ()"指令时监视 VDD 电压。

    此致、

    Janz Bai

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

    尊敬的 Janz:

    这些波动发生在 printf()或任何其他函数运行时。 如果没有指令、仅设置 PWM、则没有波动。

    我监控了 PWM 电压、也可以看到所提供代码中使用的内置 LED 的波动。

    相同的操作可在 Energia IDE 中完美地运行。

    此致、

    Shoaib

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

    您好、Shoaib、

    感谢您的具体信息、您可以帮助确认当 printf()被操作时 MCU 的 VDD 是否也有波动? 不是用于生成 PWM 的 GPIO、而是用于为 MCU 供电的 GPIO。

    此致、

    Janz Bai

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

    感谢您的答复 Janz、

    我尚未检查 MCU 的 VDD 是否存在波动。 在这种情况下、这对我有何帮助?

    在代码中、假设我要将 Pin 1.0用于 PWM、但我已经测试了其他引脚、但同样的问题仍然存在。  

    此致、

    Shoaib

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

    您好、Shoaib、

    因为我想知道 printf ()是否会影响 MCU 上电(VDD 上的电压)、那么 VDD 的波动会影响 PWM 输出。

    此致、

    Janz Bai

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

    如果要在 CCS 控制台中使用 printf()、该控制台中使用类似于断点的主机(PC)协议。 到达断点时、时钟通常会停止。

    调试器"Tools->Debugger Options->MSP43x Debugger Options->Clock Control"提供了计时器停止的复选框、我在其中看到 Timer0_A3。 我尚未使用此功能、但它可能会有所帮助。

    为了完全避免这种情况、我直接使用反向通道(或其他) UART。 我希望这正是 Energia 的功能。

    [编辑: 这在 C 编译器用户指南(SLAU132Y)第7.2.3节中进行了讨论]

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

    是的、卸下 printf 后解决了问题。

    谢谢你。