我正在尝试使用MSP430进行简单的PWM。使用计时器我面临一个问题。我注意到时钟分频器没有任何意义我设置ID_3,假设将时钟除以8,或者设置ID_1或ID_2。我在示波器上看到的输出频率是130Hz。有什么错误吗?
#include "msp430g2553.h"
volatile unsigned long i;
volatile unsigned int D1=50;
void main(void)
{
i=0;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
CCTL0 = CCIE; // CCR0 interrupt enabled
TACTL = TASSEL_2 + MC_1 + ID_1; // SMCLK, upmode MC1
CCR0 = 5; // Timer should count up to CCR) and reset
P1OUT &= 0x00; // Shut down everything
P1DIR &= 0x00;
P1DIR |= BIT0; // P1.0 pin output
_BIS_SR(CPUOFF + GIE); // Enter LPM0 w/ interrupt
while(1) //Loop forever, we work with interrupts!
{}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
i=i+1;
if (i>=100) {i=0;}
if (i<=D1) {P1OUT = BIT0;}
if (i>D1) {P1OUT &= 0x00;}
}
答案 0 :(得分:1)
默认情况下,SMCLK和CPU以相同的频率运行(约1.1 MHz)。
中断处理程序运行所需的时间要长于五个周期,因此输出速度不是由您配置计时器的方式决定的,而是由Timer_A()
中的代码运行速度决定的。
您可以尝试优化中断处理程序(i
不需要32位等)并使用更长的计时器间隔。
但是为硬件PWM配置定时器可能更好。