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.

问题1:msp430f2619,定时器时钟选择为SMCLK,8M。使用TimerA从TA0 TA1 TA2产生频率,分别为4M,10k,1k。



如题,当程序运行时,检测到的主时钟MCLK频率(8MHZ)变化,每次TACCRX的值变化,数值从几百k至几MHZ之间。不知道是怎么回事。TA0端口没有输出4MHZ的频率,改变TACCR0的值,输出也很混乱。TA1和TA2的10k、1k频率输出正常。TA1和TA2最高输出100khz的频率。到底是怎么回事呢?

问:2:可以使用32768或8MHZ时钟产生9Khz的频率吗?

以下是代码:

#include <msp430x26x.h>

void main(void)
{int i;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 &= ~XT2OFF;
BCSCTL3 |= XT2S_2;
do
{
IFG1&= ~OFIFG;
for(i=0xff;i>0;i--);
}
while((IFG1&OFIFG));
BCSCTL2|=SELM1+SELS;
P5DIR |= 0X70;
P5SEL |= 0X70;

P1SEL |= 0x3E; // P1.1 - P1.3 option select
P1DIR |= 0x3F; // P1.0 - P1.3 outputs
TACCTL0 = CCIE; // CCR0 toggle, interrupt enabled
TACCTL1 = OUTMOD_4 + CCIE; // CCR1 toggle, interrupt enabled
TACCTL2 = OUTMOD_4 + CCIE; // CCR2 toggle, interrupt enabled
TACTL = TASSEL_2 + MC_2 + TAIE; // ACLK, contmode, interrupt enabled
// while(1);

_BIS_SR(LPM1_bits + GIE); // Enter LPM3 w/interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{
CCR0 += 1; // Add Offset to CCR0
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
switch(TAIV)
{
case 2: CCR1 += 400; // Add Offset to CCR1
break;
case 4: CCR2 += 4000; // Add Offset to CCR2
break;
case 10: P1OUT ^= 0x01; // Timer_A3 overflow
break;
}


}

  • 你好,很高兴能够回答您的问题:

    看了你的程序我觉得问题很有可能出现在你用TA3产生波形的用法上。

    1.你通过在中断服务程序里给CCRx增加值得方式实现PWM的输出这种方法存在问题,比如CCR0。由于中断服务函数存在一定的延迟,因此我觉得MCU在处理完中断服务函数(即调整CCR0的值)之前TAR就已经超过了CCR0新写入的值,因此一直没有波形输出。CCR1,2为什么输出不正常我觉得可能也是由中断延迟和嵌套问题引起的。

    2. 建议你不要用这种方式。输出4M可以选择用单片机的SMLK输出专用引脚通过分频实现。其他的两路信号可以通过配置TA3工作在up mode,用CCR1,2PWM输出来实现。这样会更合理。