最近在调试一款产品,需要同时输出3路不同占空比的PWM,看了很多资料和例程,发现很多都是单路的,也有很多多路的,经过测试后发现只能同时输出3路不同占空比的PWM,将程序公布如下,经过测试了,需要改变CCR0可以改变频率,改变CCR1和 CCR2可以改变占空比; void tapwm(void) { //引脚设置(暂时使用P1.2输出一路PWM)TA0定时器只有P1.2/P1.6/P2.6 可以输出PWM,而TA1定时器则有P2.1\P2.2\P2.4\P2.5输出一共可以输出3路不同占空比的PWM,2个频率的 // TA0支持的引脚有P1.1、P1.2、P1.5、P1.6、P2.6(P2.6一般不用,因为要接晶振哦)只有P1.2、P1.6、P2.6输出CCR1 /* TA0CTL = TASSEL_2 + TACLR; // 设置定时器A控制寄存器,// TACLR=0x0004,清除定时器A计数器// TASSEL2=0x1000,Timer A clock source select: 2 - SMCLK TA0CCR0 =400; //始终为 8MHz,设置中断频率为10K TA0CCTL1 = OUTMOD_7; // CCR1 reset/set模式7.当计数器计至CCTL1时TA0清零,至CCR0时TA0置1 TA0CCR1 = 100; // CCR1 PWM 任务周期 TA0CCTL2 = OUTMOD_7; // CCR2 reset/set模式7.当计数器计至CCTL2时TA1清零,至CCR0时TA1置1 TA0CCR2 = 300; // CCR2 PWM 任务周期 P2DIR |= BIT6 ; // P2.6 P2.0 输出 P2SEL |= BIT6 ; // P2.6 TA0模式 输出CCR1 P1DIR |= BIT2 + BIT6; // P1.2 P1.6 TA0模式 输出CCR1 P1SEL |= BIT2 + BIT6; // P1.2 P1.6 TA0模式 输出CCR1 TA0CTL |= MC_1; // 增模式启动Timer_A */ // TA1支持的引脚有P2.1 P2.2 P2.4 P2.5 可以输出2路不同占空比的PWM(CCR1/CCR2) TA1CTL = TASSEL_2 + TACLR; // 设置定时器A控制寄存器,// TACLR=0x0004,清除定时器A计数器// TASSEL2=0x1000,Timer A clock source select: 2 - SMCLK TA1CCR0 =400; //始终为 8MHz,设置中断频率为10K TA1CCTL1 = OUTMOD_7; // CCR1 reset/set模式7.当计数器计至CCTL1时TA0清零,至CCR0时TA0置1 TA1CCR1 = 100; // CCR1 PWM 任务周期 TA1CCTL2 = OUTMOD_7; // CCR2 reset/set模式7.当计数器计至CCTL2时TA1清零,至CCR0时TA1置1 TA1CCR2 = 300; // CCR2 PWM 任务周期 P2DIR |= BIT1 + BIT2 + BIT4 + BIT5; // P2.1 P2.2 P2.4 P2.5 输出 P2SEL |= BIT1 + BIT2 + BIT4 + BIT5; // P2.1 P2.2 TA1模式 输出CCR1 P2.4 P2.5 TA1模式 输出CCR2 TA1CTL |= MC_1; }