zoukankan      html  css  js  c++  java
  • 基于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 }
  • 相关阅读:
    9_4前端(2)css
    9_3前端(1)
    8_23mysql的其他内容(视图等)
    8_22数据库(navicat操作)
    8_21表的查询
    8_20数据库3外键
    E. Pavel and Triangles dp+问题转化
    C. Grid game 思维+问题转化
    B. Game with string 思维问题转化
    D. Game with modulo 交互题(取余(膜)性质)附带a mod b<a/2证明
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/14128717.html
Copyright © 2011-2022 走看看