1. 程式人生 > 實用技巧 >基於MSP430f5529之PWM舵機控制程式

基於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 }