[求助] 用MSP430F5529为什么无法输出pwm

tei333   2015-7-24 17:08 楼主
#include

#define TA01_SET         P2SEL |= BIT0; P2DIR |= BIT0                //P2.0
#define TA02_SET         P3SEL |= BIT0; P3DIR |= BIT0                //P3.0
#define TA01_OFF         P2SEL&= ~BIT0                                                         //P1.6
#define TA02_OFF         P3SEL &= ~BIT0                                                 //P3.0

char TAPwmInit(char Clk,char Div,char Mode1,char Mode2)
{
          TA0CTL =0;                                                                                                                                                // 清除以前设置

          switch(Mode1)                                                                                                                                        //为定时器选择计数模式
          {
          case 'F':case 'f':                                                                                                                                //普通PWM
                          TA0CTL |=MC_1; break;                                                                                        //主定时器为增计数
          case 'B':case 'b':
                            TA0CTL |=MC_1; break;                                                                                        //主定时器为增计数
          case 'D': case 'd':                                                                                                                                //死区PWM
                       TA0CTL |=MC_3; break;                                                                                        //主定时器为增减计数
          default : return(0);                                                                                                                        //其他情况都是设置参数有误,返回0
          }

          switch(Clk)                                                                                                                                                  //为定时器TA选择时钟源
          {
            case 'A': case 'a':          TA0CTL|=TASSEL_1; break;                           //ACLK
            case 'S': case 's':         TA0CTL|=TASSEL_2; break;                          //SMCLK
            case 'E':                    TA0CTL|=TASSEL_0; break;                          //外部输入(TACLK)
            case 'e':                          TA0CTL|=TASSEL_3; break;                           //外部输入(TACLK取反)
            default :  return(0);                                                                                                                  //设置参数有误,返回0
          }
          switch(Div)                                                                                                                                                 //为定时器TA选择分频系数
          {
            case 1:   TA0CTL|=ID_0; break;   //1
            case 2:   TA0CTL|=ID_1; break;   //2
            case 4:   TA0CTL|=ID_2; break;   //4
            case 8:   TA0CTL|=ID_3; break;   //8
            default :  return(0);                                                                                                                  //设置参数有误,返回0
          }
          switch(Mode1)                                                                                                                                         //设置PWM通道1的输出模式。
          {
             case 'F':        case 'f':
                      TA0CCTL1 = OUTMOD_7;
                      TA01_SET;
                      break;
             case 'B':        case 'b':
                      TA0CCTL1 = OUTMOD_3;
                      TA01_SET;
                      break;
             case 'D': case'd':
                         TA0CCTL1 = OUTMOD_6;
                         TA01_SET;
                         break;
              case '0':case 0:                                                                                                                           //如果设置为禁用
                     TA01_OFF;                                                                                                                           //TA0.1恢复为普通IO口
                      break;
             default :  return(0);                                                                                                                   //设置参数有误,返回0
          }
          switch(Mode2)                                                                                                                                 //设置PWM通道2的输出模式。
          {
              case 'F':         case 'f':
                      TA0CCTL2 = OUTMOD_7;
                      TA02_SET;  break;
               case 'B':        case 'b':
                      TA0CCTL2 = OUTMOD_3;
                      TA02_SET;
                        break;
               case 'D': case 'd':
                                  TA0CCTL2 = OUTMOD_2;
                                  TA02_SET;
                                  break;
               case '0':case 0:                                                                                                                   //如果设置为禁用
                                    TA02_OFF;                                                                                                            //TA0.1恢复为普通IO口
                                    break;
               default :  return(0);                                                                                                 //设置参数有误,返回0
            }
          return(1);
}

void TAPwmSetPeriod(unsigned int Period)
{
         TA0CCR0 = Period;
}

void TAPwmSetDuty(char Channel,unsigned int Duty)
{
        switch(Channel)
        {
        case 1:TA0CCR1=Duty;break;
        case 2:TA0CCR2=Duty;break;
        }
}

void TAPwmSetPermill(char Channel,unsigned int Percent)
{
  unsigned long int Period;
  unsigned int Duty;
  Period=TA0CCR0;
  Duty=Period*Percent/1000;
  TAPwmSetDuty(Channel,Duty);
}

void main()
{
     WDTCTL=WDTPW+WDTHOLD;
     TAPwmInit('A',1,'F',0);
     TAPwmSetPeriod(500);
     TAPwmSetDuty(1,500);
     LPM0;
}

这个程序无法输出PWM波形,一直都是低电平,求大神指教

回复评论 (11)

ok问题解决了    把TA0换成TA1就行了
点赞  2015-7-24 18:09
引用: tei333 发表于 2015-7-24 18:09
ok问题解决了    把TA0换成TA1就行了

TA1比TA0多个比较锁存器     其他不都一样吗     这是什么原因?   我学的169是因为不一样吗
点赞  2015-7-24 19:18
主要是我选的端口的原因,MSP430F5529的PWM输出端口P2^0是由TA1控制的,并不是说TA0和TA1其他有什么不一样,没注意看芯片手册
点赞  2015-7-25 12:42
大神啊。感觉都看不懂     
点赞  2015-7-25 13:39
别叫大神,我也是才入手学
点赞  2015-7-25 18:52
是将所有TA0改成TA1不  例如TA01_SET; 改成TA11_SET;这样子的不
点赞  2015-8-4 10:27
引用: happyhyq1010 发表于 2015-8-4 10:27
是将所有TA0改成TA1不  例如TA01_SET; 改成TA11_SET;这样子的不

对   但是这样改是基于我的PWM输出端口是MSP430F5529的P2^0端口
点赞  2015-8-4 14:46
引用: tei333 发表于 2015-8-4 14:46
对   但是这样改是基于我的PWM输出端口是MSP430F5529的P2^0端口

哈哈  我的刚好也是F5529 由TA1控制    你有做pwm控制电机不
点赞  2015-8-5 17:26
引用: happyhyq1010 发表于 2015-8-5 17:26
哈哈  我的刚好也是F5529 由TA1控制    你有做pwm控制电机不

没有  我的外设板子没有电机    我做的是通过控制PWM的占空比来控制一个LED灯的亮度     但是原理应该都差不多吧  都是通过PWM的占空比来控制吧
点赞  2015-8-5 20:28
大神5529还有哪几个IO可以输出PWM,我需要两个端口输出
点赞  2016-6-26 23:51
问题都解决了。。。。
点赞  2017-10-12 11:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复