基於MSP430f5529之PWM舵機控制程序


代碼:

 1 #include <msp430f5529.h>                        //函數庫
 2 int sum=0;                                  //全局變量
 3 int main(void)
 4 {
 5   volatile unsigned int i;                  //局部變量
 6                 //設置timerA相關參數
 7   WDTCTL = WDTPW+WDTHOLD;                   // 關閉看門狗
 8   P1DIR |= BIT2;                            // 將P1.2設置為輸出端口,驗證狀態
 9   P2DIR |= BIT0;                            //P2.0輸出PWM波
10   TA0CCTL1 = OUTMOD_7;                         //將輸出模式選擇為模式7
11   TA0CTL = TASSEL_1 + MC_1 + TACLR ;         //選擇ACLK時鍾源,timerA計數模式選擇up模式,計數到TA0CCR0,重置timerA計數器
12   TA1CCTL1 = OUTMOD_7;
13   TA1CTL = TASSEL_1 + MC_1 +TACLR ;
14 
15     P1REN |= BIT7;                            // 使能端口1.7
16     P1OUT |= BIT7;                            // 選擇下拉模式
17     P1IES |= BIT7;                            // 1.7端口中斷觸發沿選擇下降沿,高到低觸發
18     P1IFG &= ~BIT7;                           // 1.7端口中斷寄存器清零
19     P1IE |= BIT7;                       // 1.7端口中斷使能
20 
21     __bis_SR_register(GIE);                     //將GIE置1,打開全局中斷使能
22 
23   while(1)                                       // 采用switch,每一個case值對應一個狀態
24   {
25     switch (sum)
26     {
27     case 0:
28     P1OUT &= ~BIT2;                              //初始狀態為低功耗狀態
29         TA0CCR1 = 0;
30         __bis_SR_register(LPM3_bits);            //將LPM3置1,使系統進入低功耗
31         break;                                   //跳出switch函數
32     case 1:                                      //選系統的默認時鍾,頻率為1MHZ。
33         P1OUT &= ~BIT2;                 //狀態1要求:轉到—60°,900微秒,設置的為1000微秒,時鍾頻率為32768Hz
34         TA0CCR0 = 20000;          //驗證進入狀態1
35         TA0CCR1 = 10000;
36         TA1CCR0 = 100;              //輸出PWM波周期
37         TA1CCR1 = 34;               占空比
38         P1DIR |=BIT2;
39         P1SEL |=BIT2;
40         P2DIR |=BIT0;
41         P2SEL |=BIT0;
42         break;
43     case 2:                
44         P1OUT &= ~BIT2;                 //狀態2要求:轉到0°。1520微秒
45         TA0CCR0 = 20000;          
46         TA0CCR1 = 5000;
47         TA1CCR0 = 100;          
48         TA1CCR1 = 50;
49         P1DIR |=BIT2;
50         P1SEL |=BIT2;
51         P2DIR |=BIT0;
52         P2SEL |=BIT0;
53         break;
54     case 3:                     //時鍾為輔助時鍾ACLK,頻率為32768HZ
55     //P1OUT &= ~BIT2;                 //狀態3要求:轉到60°   2100微秒
56         TA0CCR0 = 20000;          
57         TA0CCR1 = 800;
58         TA1CCR0 = 100;
59         TA1CCR1 = 66;
60         P1DIR |=BIT2;
61         P1SEL |=BIT2;  //選擇1.2端口的復用功能,使之能夠實現亮和滅
62         P2DIR |=BIT0;
63         P2SEL |=BIT0;
64         break;
65 
66     }
67     if(sum>3)                     //當sum的值超過3時,要讓sum減3,重新進入循環
68           {
69             sum=sum-3;
70           }
71   }
72 }
73 
74 //采用S1中斷按鍵實現
75 #pragma vector=PORT1_VECTOR                //端口p1的中斷函數
76 __interrupt void Port_1(void)
77 {
78     unsigned int push_key =0;
79     push_key == P1IFG & (P1IN);
80     __delay_cycles(20000);                  //精確時間延遲,乘以MCLK時鍾周期,防止抖動
81     if( push_key == (P1IN & BIT7))
82     {
83     __low_power_mode_off_on_exit();        //SR寄存器置0,退出低功耗
84     sum=sum+1;                               // 按下p1.7,sum加1,周期變化一次
85     }
86       P1IFG &= ~BIT7;                          // p1.7中斷重置
87 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM