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.

[参考译文] MSP430FR2476:PWM 比较值更新跳过一个周期

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1522537/msp430fr2476-pwm-compare-value-update-skips-one-cycle

器件型号:MSP430FR2476

工具/软件:

您好、
我使用的是 MSP430FR4276微控制器、在使用 Timer_A3生成 PWM 信号时遇到问题。 需要通过 PI 控制器随时调节 PWM 占空比。 然而,我面临一个问题(如所附的图像中所示),我认为是有关时间我更新 CCR1.

似乎、如果我 CCR1 在错误的时刻更新、 CCR1 和之间的比较事件 CCR0 在计时器达到其最大值之前不会发生。 因此、新的占空比仅在下一个周期生效。

挑战在于、我不想使用 MC 位来停止计时器、也不想使用中断(ISR)。 根据数据表、影子寄存器用于此目的、应由自动处理 Timer_A_initCompareMode()。 因此、我希望只需调用以下命令:  

Timer_A_setCompareValue(TA3_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1, newDutyCycle);

void MY_TIMER_init(void)
{
  // Set up Timer_A3 in Up Mode
  Timer_A_initUpModeParam upModeParams = {0};
  upModeParams.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
  upModeParams.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
  upModeParams.timerPeriod = 0xFFF;
  upModeParams.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
  upModeParams.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE;
  upModeParams.timerClear = TIMER_A_DO_CLEAR;
  upModeParams.startTimer = false;


  Timer_A_initUpMode(TA3_BASE, &upModeParams);


  // Configure CCR1 for PWM output
  Timer_A_initCompareModeParam compareParams = {0};
  compareParams.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;
  compareParams.compareInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
  compareParams.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;
  compareParams.compareValue = 0x7FF;


  Timer_A_initCompareMode(TA3_BASE, &compareParams);
  Timer_A_startCounter(TA3_BASE, TIMER_A_UP_MODE);
}

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

    你好 Strahinja,

    该影子寄存器用于"在当前 PWM 周期结束时更新占空比或加载值"。 使用影子寄存器不会立即更改 PWM、而是在当前 PWM 周期结束后更改 PWM。 实际上、我记得我们的技术参考手册不建议在当前 PWM 尚未结束时更改 PWM 占空比或负载值。 我认为、您可能需要仔细检查 TIMER_A 在  MSP430FR2476中是否具有影子寄存器。  

    有关计时器寄存器使用方法的更多信息、您可以尝试参阅技术参考手册。 如果您不使用影子寄存器、我认为在代码中更改占空比或加载值后将立即更改。

    此致、

    Janz Bai

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

    JANZ 正确、TimerA 没有影子寄存器。 TimerB 理论上可以、但实际上它们并不起作用[Ref 勘误表(SLAZ726B)项目 TB25]、因此(实际上)任何地方都没有影子寄存器。

    更新 CCR 需要一些策略;如果 CCR 值设置有一些已知的模式、这将很有帮助。 在 CCR0 (与 CCR1相比)中断处更新通常是更好的选择。 您不必停止计时器即可更改 CCR。

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

    正如指南所述、在计时器运行时更改 CCRx 可能会导致意外行为。

    例如、CCR1中的当前值大于计时器计数、但新值较小。 向 CCR1写入新值将导致此周期中 CCR1不匹配。 为了避免跳过周期、您必须采取一些措施来避免这种情况。

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

    我看了看,是的,影子寄存器确实是为  TimerB 。 在 Bruce McKenney 的帖子之后、似乎它们的功能不正常、因此需要另一种策略。

    我把计时器更改为  向上/向下计数模式  可利用  切换/复位输出模式 。 由于计时器在每个周期检查两次比较值、因此如果错过了第一次比较的更新、它仍然可以在第二次比较时捕获。 如果没有 PI 控制、这种方法效果很好。

    然而、一旦我添加 PI 控制器、就会出现一些不良行为。

    最好的解决方案似乎是使用  中断服务例程(ISR) 。 为确保平稳运行、中断应配置为  防止嵌套中断 、这可能会干扰比较寄存器的更新。 此外、  中断优先级  应仔细检查和设置、以避免冲突。

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

    您好 Lukic、

    我同意 Bruce 的意见。  在 CCR0 (与 CCR1相比)中断处更新通常是更好的选择。 如果您需要和想要、也许您可以考虑使用其他包含计时器 A 的器件。 例如 MSPM0系列

    此致、

    Janz Bai

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

    正如大卫所描述的,危险与旧/新值和当前反值之间的关系有关,并且彼此之间的关系有关;理论上,你可以计算这些,但这会引入种族。 至少在 CCR0中断处更改 CCR1值可以得到可预测的关系、只有 CCR1非常小时才会出现风险。

    ISR 是在禁用中断(GIE=0)的情况下进入的、因此除非您执行特殊操作、否则不会发生嵌套中断(我不建议这样做)。 如果您有较大的 ISR (也不建议这样做)、则优先级主要是需要关注的问题。