总结:选SMCLK(可以测出来)
若选ACLK,经示波器PWM时有时无 举例一: - #include <MSP430G2553.h>
- #define CPU_F ((double)12000000)//cpu frequency12000000
- #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
- #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
- //功能:TA0.1输出PWM
- //说明:TA0.1由P1.2 p1.6输出
- void timerA0_1_init()
- {
- TACTL |= TASSEL_2 + MC_1; //选SMCLK(可以测出来),增计数
- //若选ACLK,经示波器PWM时有时无
- CCTL1 = OUTMOD_7; //输出模式为复位/置位
- CCR0 = 1115000/1000; //SMCLK时钟频率为1.115MHZ,PWM(频率):1.115MHZ/CCR0
- CCR1 = (1115000/1000) * 30/100; //占空比:CCR1/CCR0 ;
- }
- //功能:TA1.1输出PWM
- //说明:TA1.1由P2.1 P2.2输出;
- //TA1.1与TA1.2共用TA1CCR0,TA1CTL
- void timerA1_1_init()
- {
- TA1CCTL1 = OUTMOD_7;
- TA1CCR1 = (1115000/200) * 10/100; ; //占空比:TACCR1/TACCR0
- }
- //功能:TA1.2输出PWM
- //说明:TA1.2由P2.4 P2.5输出
- void timerA1_2_init()
- {
- TA1CTL |= TASSEL_2 + MC_1; //选SMCLK,增计数
- //若选ACLK,经示波器PWM时有时无
- TA1CCTL2 = OUTMOD_7; //输出模式为复位/置位
- TA1CCR0 = 1115000/200; ///SMCLK时钟频率为1.115MHZ,PWM(频率):1.115MHZ/CCR0
- TA1CCR2 = (1115000/200) * 60/100; //占空比: CCR2/CCR0
- }
- void port_init()
- {
- P1SEL |= BIT2 + BIT6;
- P1DIR |= BIT2 + BIT6;
- //P1.2/6 设为输出TA0.1
-
- P2SEL |= BIT1 + BIT2;
- P2DIR |= BIT1 + BIT2;
- //P2.1/2设为输出TA1.1
-
- P2SEL |= BIT4 + BIT5;
- P2DIR |= BIT4 + BIT5;
- //P2.4/5 设为输出TA1.2
-
- }
- void main()
- {
- WDTCTL = WDTPW + WDTHOLD;
-
- port_init();
- timerA0_1_init();
- timerA1_2_init();
- timerA1_1_init();
- _BIS_SR(CPUOFF); // Enter LPM0 进入低功耗模式0 SMCLK ON,ACLK ON
- //while(1);
- }
复制代码举例2: - #include <MSP430G2553.h>
- void set_timerA(void) {
- P2DIR |= 0x12; // P2.1 and P2.4 output
- P2SEL |= 0x12; // P2.1 and P2.4 TA1 options
- TA1CCR0 = 1000000/1000-1; // PWM Period
- TA1CCTL1 = OUTMOD_7; // CCR1 reset/set
- TA1CCTL2 = OUTMOD_7;
- TA1CCR1 =(1115000/1000)*80/100;
- TA1CCR2 = (1115000/1000)*20/100;
- TA1CTL = TASSEL_2 + MC_1; // SMCLK, up mode
- // CCTL0 = CCIE; // CCR0 interrupt enabled
- }
- //参数说明:duty是占空比,50是代表百分之50,范围1-100
- void pwm_sinit(unsigned char duty)
- {
- TACTL = TASSEL_2 + MC_1;
- CCR0 = 1115000/500; //通过示波器观察此时SMLK=1115000
- CCTL1 = OUTMOD_7;
- CCR1 = (1115000*duty)/(100*500);
- P1DIR |= 0x44; //P1.2/6 output
- P1SEL |= 0x44; //通过特殊功能口输出
-
- }
- int main( void )
- {
- // Stop watchdog timer to prevent time out reset
- WDTCTL = WDTPW + WDTHOLD;
- Set_TimerA();
- pwm_sinit(50);
- while(1);
- }
复制代码
|