找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9085|回复: 8
收起左侧

MSP430f5529之PWM控制舵机程序

  [复制链接]
ID:519285 发表于 2019-4-23 09:39 | 显示全部楼层 |阅读模式
#include <msp430.h>                        //函数库
int sum=0;                                  //全局变量
int main(void)
{
  volatile unsigned int i;                  //局部变量
                //设置timerA相关参数
  WDTCTL = WDTPW+WDTHOLD;                   // 关闭看门狗
  P1DIR |= BIT2;                            // 将P1.2设置为输出端口,验证状态
  P2DIR |= BIT0;                            //P2.0输出PWM波
  TA0CCTL1 = OUTMOD_7;                         //将输出模式选择为模式7
  TA0CTL = TASSEL_1 + MC_1 + TACLR ;         //选择ACLK时钟源,timerA计数模式选择up模式,计数到TA0CCR0,重置timerA计数器
  TA1CCTL1 = OUTMOD_7;
  TA1CTL = TASSEL_1 + MC_1 +TACLR ;

    P1REN |= BIT7;                            // 使能端口1.7
    P1OUT |= BIT7;                            // 选择下拉模式
    P1IES |= BIT7;                            // 1.7端口中断触发沿选择下降沿,高到低触发
    P1IFG &= ~BIT7;                           // 1.7端口中断寄存器清零
    P1IE |= BIT7;                       // 1.7端口中断使能

    __bis_SR_register(GIE);                     //将GIE置1,打开全局中断使能

  while(1)                                       // 采用switch,每一个case值对应一个状态
  {
    switch (sum)
    {
    case 0:
    P1OUT &= ~BIT2;                              //初始状态为低功耗状态
        TA0CCR1 = 0;
        __bis_SR_register(LPM3_bits);            //将LPM3置1,使系统进入低功耗
        break;                                   //跳出switch函数
    case 1:                                      //选系统的默认时钟,频率为1MHZ。
        P1OUT &= ~BIT2;                 //状态1要求:转到—60°,900微秒,设置的为1000微秒,时钟频率为32768Hz
        TA0CCR0 = 20000;          //验证进入状态1
        TA0CCR1 = 10000;
        TA1CCR0 = 100;              //输出PWM波周期
        TA1CCR1 = 34;               占空比
        P1DIR |=BIT2;
        P1SEL |=BIT2;
        P2DIR |=BIT0;
        P2SEL |=BIT0;
        break;
    case 2:               
        P1OUT &= ~BIT2;                 //状态2要求:转到0°。1520微秒
        TA0CCR0 = 20000;         
        TA0CCR1 = 5000;
        TA1CCR0 = 100;         
        TA1CCR1 = 50;
        P1DIR |=BIT2;
        P1SEL |=BIT2;
        P2DIR |=BIT0;
        P2SEL |=BIT0;
        break;
    case 3:                     //时钟为辅助时钟ACLK,频率为32768HZ
    //P1OUT &= ~BIT2;                 //状态3要求:转到60°   2100微秒
        TA0CCR0 = 20000;         
        TA0CCR1 = 800;
        TA1CCR0 = 100;
        TA1CCR1 = 66;
        P1DIR |=BIT2;
        P1SEL |=BIT2;  //选择1.2端口的复用功能,使之能够实现亮和灭
        P2DIR |=BIT0;
        P2SEL |=BIT0;
        break;

    }
    if(sum>3)                     //当sum的值超过3时,要让sum减3,重新进入循环
          {
            sum=sum-3;
          }

  }
}

//采用S1作为按键实现
#pragma vector=PORT1_VECTOR                //端口p1的中断函数
__interrupt void Port_1(void)
{
    unsigned int push_key =0;
    push_key == P1IFG & (P1IN);
    __delay_cycles(20000);                  //精确时间延迟,乘以MCLK时钟周期,防止抖动
    if( push_key == (P1IN & BIT7))
    {
    __low_power_mode_off_on_exit();        //SR寄存器置0,退出低功耗
    sum=sum+1;                               // 按下p1.7,sum加1,周期变化一次
    }
      P1IFG &= ~BIT7;                          // p1.7中断重置
}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:825693 发表于 2020-10-11 16:57 | 显示全部楼层
编译报错了,没有定义
回复

使用道具 举报

ID:529775 发表于 2020-10-11 23:37 | 显示全部楼层
TA1CCR1是什么啊,显示没有定义
回复

使用道具 举报

ID:314910 发表于 2020-12-13 15:08 | 显示全部楼层
包含个正确的头文件,需要MSP430F5529.h即可,是定时器的寄存器
回复

使用道具 举报

ID:921783 发表于 2021-8-7 21:00 | 显示全部楼层
依然释然 发表于 2020-10-11 23:37
TA1CCR1是什么啊,显示没有定义

定时器1,初值设置
包含头文件
回复

使用道具 举报

ID:1039079 发表于 2022-7-25 09:44 | 显示全部楼层
TA1CCR1咋弄,谢谢
回复

使用道具 举报

ID:996033 发表于 2023-1-2 20:05 | 显示全部楼层
KIVENDon 发表于 2022-7-25 09:44
TA1CCR1咋弄,谢谢

需要包含一个头文件msp430f5529.h
回复

使用道具 举报

ID:1071756 发表于 2023-4-15 15:36 | 显示全部楼层
太厉害了解决了我许多困难,对新手太友好了
回复

使用道具 举报

ID:1088048 发表于 2023-7-11 10:52 | 显示全部楼层
msp430f5529也不行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表