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:PWM 波形中的奇怪毛刺脉冲。 需要代码审核

Guru**** 2562120 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/603011/msp430f5529-weird-glitch-in-a-pwm-waveform-need-a-code-review

器件型号:MSP430F5529

团队、

我正在尝试通过查找表生成 OWM 正弦波、但我在该波中看到一个奇怪的赝像。 下面是我用于生成波形的代码:

#include

void setClocks();
void PWMRegsetup ();

unsigned int i=0、j=0;//循环计数器
const unsigned int sinTable[]={512、562、611、660、707、753、796、836、876、907、937、963、984、100、101、13、101、21、23、101、101、13、1001、
                          984,963,937,907,873,836,796,753,707,660,611,562,512,461,412,363,316,270,227,187
                          150、116、86、60、39、22、10、10、22、39、60、86、116、150、187、227、270、316、363、412、461、512};

void main (void)

WDTCTL = WDTPW+WDTHOLD;//禁用 WDT
PWMRegsetup();
setClocks();

TBCTL = TBSSEL_2+MC_1;      // SMCLK、upmode
TBCCR0 = 1024-1;              // PWM 周期表示一个10位 DAC
TBCCTL0 = CCIE;               //启用 TRCCR0中断
TBCCTL6 = OUTMOD_7;         // CCR3复位/置位

while (1){
_bis_SR_register (LPM0_bits + GIE);     // CPU 关闭。 用于 ISR
__no_operation();                      //用于调试器

//函数//

// Timer B0中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMERB0_vector
_interrupt void TIMERB1_ISR (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (TIMERB0_vector)) TIMERB1_ISR (void)
其他
错误编译器不受支持!
#endif

//在引脚 P3.6上输出正弦波 PWM
TBCCR6 = sinTable[j];// CCR3 PWM 占空比
J++;
if (j>=64)
J = 0;

void setClocks (void)(空)

UCSCTL3 = SELREF_2;//设置 DCO FLL 基准= REFO
UCSCTL4 |= SELA_2;//设置 ACLK = REFO
UCSCTL0 = 0x0000;//设置可能的最低 DCOx、MODx

//循环直到 XT1、XT2和 DCO 稳定-在这种情况下、只有 DCO 必须稳定
操作

UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);
//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG;//清除故障标志
} while (SFRIFG1&OFIFG);//测试振荡器故障标志

_bis_SR_register (SCG0);//禁用 FLL 控制循环
UCSCTL1 = DCORSEL_5;//选择 DCO 范围16MHz 运行
UCSCTL2 |= 762;//将 DCO 乘法器设置为8MHz
//(N + 1)* FLLRef = Fdco
//(762 + 1)* 32768 = 25MHz
_BIC_SR_register (SCG0);//启用 FLL 控制环路

// DCO 范围位已经存在时、DCO 的最坏情况稳定时间
//已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。
// 32 x 32 x 25 MHz/32、768Hz = 781000 = DCO 稳定的 MCLK 周期
_DELAY_CYCLES (781000);

void PWMRegsetup (void)

P3SEL |= BIT6;// P3.6选项选择
P3DIR |= BIT6;// P3.6输出(TB6)

我想知道我是否错误地调用 ISR 例程中的某项内容? 如有任何建议,请提出。

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

    您很可能遇到具有较小 CCR 值的比赛。

    使用 TBCCTL6:CLLD 位。 您可能需要 CLLD=01b。

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

    Bruce、

    这也是我的感受。 我查看了用户指南并模糊地理解了这些位的实现、但我们是否有任何有关如何正确实现 CLLD 位的示例代码/配套资料?

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

    TI 不提供任何有关实现 CLLD 位的具体示例、因为它们只是控制比较锁存器。 由于您不使用组、用户指南的第18.2.4.2.1节将是您了解 TBxCLn 比较锁存器的主要重点。 关于比赛条件、如 Bruce 所述、您应该尝试 CLLD = 01b (甚至是11b)并评论观察到的差异。 轮询 CCIFG 而不是使用带中断的 LPM0可能会更快地处理 TBCCR6覆盖、但需要手动复位 CCIFG。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢快速辅助剂。 CLLD_1解决了该问题。