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.

[参考译文] MSP430F5529:根据 ADC 输入更改 PWM 占空比

Guru**** 2538955 points
Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/849127/msp430f5529-changing-pwm-duty-cycle-based-on-adc-input

器件型号:MSP430F5529

您好、MSP 低功耗微控制器论坛、  

我目前正在使用 MSP430F5529并尝试根据 ADC 输入更改占空比。 当我在调试器中运行代码时、它可能会运行两次并更新 TA0CCR1、但随后它会卡在  while 循环中的_bis_SR_register (LPM0_bits + GIE)上。  

请帮助您弄清这是为什么?  

请参阅以下代码:  

#include 



int main (void)
{
TA0CCR1 = 499;//占空比
WDTCTL = WDTPW + WDTHOLD; //停止 WDT

ADC12CTL0 = ADC12SHT02 + ADC12ON; //采样时间、ADC12在
ADC12CTL1 = ADC12SHP 上的时间; //使用采样定时器
ADC12IE = 0x01; //启用中断
ADC12CTL0 |= ADC12ENC;
P6SEL |= 0x01; // P6.0 ADC 选项选择
P1DIR |= 0x01; // P1.0输出

P2DIR |= BIT2; // P2.2
P2SEL |= BIT2; // P2.2选项选择
TA0CCR0 = 512-1; // PWM 周期
TA0CCTL1 = OUTMOD_7; // CCR1复位/置位
TA0CTL = tassel_2 + MC_1 + TACLR; // SMCLK、向上计数模式、清零 TAR

// _bis_SR_register (LPM0_bits + GIE);
while (1)
{
ADC12CTL0 |= ADC12SC; //开始采样/转换

_bis_SR_register (LPM0_bits + GIE); // LPM0、ADC12_ISR 将强制退出
//_no_operation (); //对于调试
器}
#if

defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector = ADC12_vector
__interrupt void ADC12_ISR (void)
#elif defined (__GNU__)
void __attribute__((interrupt (ADC12_vector)#if

Compiler (void)(void))#define_ISR (void)错误!
#endif
{
switch (__even_in_range (ADC12IV、34))
{
case 0:break; //向量0:无中断
情况2:中断; //向量2:ADC 溢出
情况4:中断; //向量4:ADC 时序溢出
情况6: //向量6:ADC12IFG0
if (ADC12MEM0 >= 0x7ff){ // ADC12MEM = A0 > 0.5AVcc?
P1OUT |= BIT0;
如果(TA0CCR1 = 0){TA0CCR1 = 0;}
IF (TA0CCR1 > TA0CCR0){TA0CCR1 = TA0CCR0;}
其他
TA0CCR1---;
} // P1.0 = 1
否则{
如果(TA0CCR1 = 0){TA0CCR1 = 0;}
IF (TA0CCR1 > TA0CCR0){TA0CCR1 = TA0CCR0;}
P1OUT &=~BIT0;
TA0CCR1++;

}


_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
案例8:中断; //向量8:ADC12IFG1
大小写10:break; //向量10:ADC12IFG2
大小写12:break; //向量12:ADC12IFG3
case 14:break; //向量14:ADC12IFG4
情况16:中断; //向量16:ADC12IFG5
情况18:中断; //向量18:ADC12IFG6
案例20:中断; //向量20:ADC12IFG7
case 22:break; //向量22:ADC12IFG8
case 24:break; //向量24:ADC12IFG9
大小写26:break; //向量26:ADC12IFG10
case 28:break; //向量28:ADC12IFG11
case 30:break; //向量30:ADC12IFG12
大小写32:break; //向量32:ADC12IFG13
case 34:break; //向量34:ADC12IFG14
默认值:break;
}
}

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

    您好、Mitchell、

    [引用用户="Mitchell Spears"]__bis_SR_register (LPM0_Bits + GIE);

    这通过将 MSP430配置为进入 LPM0来将 CPU 置于睡眠状态。 只需使用 GIE、您就应该能够进行调试。 此外、高代码优化设置可能会使调试具有挑战性。

    低功耗模式调试行为?

    CCS/MSP430F2274:使用 CCS 调试器验证器件是否处于低功耗模式

    此致、

    James

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

    尊敬的 James:

    感谢您的回复。 代码不再卡住、但我无法弄清为什么每次 TA0CCRR1更改时 PWM 占空比不会更新。 正确的实施方法是什么?

    谢谢

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

    您的 PWM 周期(一个周期)为512 μ s、您的转换大约需要15 μ s、加上(粗略猜测)对于 ISR 大约需要50 μ s、因此您每周期进行大约7次 CCR1更新。

    每个周期多次更新 CCR 并不是很有用。 它最多不起作用、但最坏的情况下会引起干扰。 在许多/大多数应用中(我不知道您的应用)、您需要在更改之间使用多个 PWM 周期。 另一个影响是、通过将 CCR1递增多次、占空比将跳转。

    因此、请减慢 ADC 采样速度。 一种简单的策略是在设置 ADCSC 之前使用_DELAY_CYCLES (512)等内容。 另一种方法是创建 CCR0中断并在此处执行 ADCSC。

    我所做的一件事是让激励(在本例中为 ADC)计算目标占空比、然后让 CCR0中断向目标递增、以产生平滑转换(无过冲)。  

    在这里、我要提到:如果 CCR1恰好在设置时接近计数器值、则 Timer_A 容易受到干扰。 Timer_B (CLLD=1)可以很好地防止这种情况。 如果您未连接到 TA0.1引脚、这可能是一个有用的举措。