ZHCABH5B December 2011 – February 2022 MSP430G2112 , MSP430G2152 , MSP430G2212 , MSP430G2252 , MSP430G2312 , MSP430G2352 , MSP430G2412 , MSP430G2452
要在单个计时器模块上实现多个占空比以及多个频率,计时器 ISR 会变得稍微复杂一些。在确定触发中断的 TxCCRx 计数后,我们还必须确定输出是进入信号输出的高电平还是低电平部分,以便判断是否要增加高电平时间或低电平时间对应的计数。这可以通过检查相应 TxCCTL0 寄存器中的 CCI 位来实现。如果 CCI 位为 1,那么我们便知道输出刚刚切换至高电平,信号位于高电平周期的开始处,因此我们必须增加高电平时间对应的计数。相反,如果 CCI 位为 0,则表示输出刚刚切换至低电平,因此我们必须增加低电平时间对应的计数。高电平时间和低电平时间所对应计数之和决定信号的周期,而高电平时间和低电平时间与周期值之比则决定占空比。以下代码显示了 multi_freq_g2452_pwm_example.c 文件中的计时器 ISR:
// Timer_A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
if(TACCTL0 & CCI) // If output currently high
{
TACCR0 += 50; // 25% high
}
else
{
TACCR0 += 150; // 75% low
}
}
// Timer_A1 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1(void)
{
switch( TA0IV )
{
case 2: if(TACCTL1 & CCI) // If output currently high
{
TACCR1 += 50; // 12.5% high
}
else
{
TACCR1 += 350; // 87.5% low
}
break;
case 4: if(TACCTL2 & CCI) // If output currently high
{
TACCR2 += 600; // 60% high
}
else
{
TACCR2 += 400; // 40% low
}
break;
case 10: P1OUT ^= 0x01; // Timer overflow
break;
default: break;
}
}
本例中,代码会从 1MHz 计时器时钟源生成多个 5kHz、2.5kHz 和 1kHz 的相同频率信号。不过,这时信号的占空比分别为 25%、12.5% 和 60%(请参阅Equation5)。