打印

msp 430 pwm怎么控制?

[复制链接]
6646|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinpaidianzi|  楼主 | 2011-11-19 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
创展和众| | 2011-11-19 11:37 | 只看该作者
#include  <msp430x14x.h>
void main(void)
{
  volatile unsigned int i;
  WDTCTL = WDTPW +WDTHOLD;                  // Stop WDT
  BCSCTL1 |= XTS;                           // ACLK= LFXT1 = HF XTAL
  do
  {
  IFG1 &= ~OFIFG;                           // Clear OSCFault flag
  for (i = 0xFF; i > 0; i--);               // Time for flag to set
  }
  while ((IFG1 & OFIFG));                   // OSCFault flag still set?
  BCSCTL2 |= SELM_3;                        // MCLK= LFXT1 (safe)
  P4DIR |= 0x06;                            // P4.1 and P4.2 output
  P4SEL |= 0x06;                            // P4.2 and P4.2 TB1/2 otions
  TBCCR0 = 128;                             // PWM Period/2
  TBCCTL1 = OUTMOD_6;                       // CCR1 toggle/set
  TBCCR1 = 32;                              // CCR1 PWM duty cycle
  TBCCTL2 = OUTMOD_6;                       // CCR2 toggle/set
  TBCCR2 = 96;                              // CCR2 PWM duty cycle
  TBCTL = TBSSEL_1 + MC_3;                  // ACLK, up-down mode
  _BIS_SR(CPUOFF);                          // Enter LPM0
}

使用特权

评论回复
板凳
sphinz| | 2011-11-19 15:05 | 只看该作者
2楼正解!

使用特权

评论回复
地板
fq1110| | 2011-11-19 15:24 | 只看该作者
使用timer的pwm,可通过修改寄存器调节占空比,网上有大把的例程可供参考。

使用特权

评论回复
5
一览| | 2011-11-19 16:37 | 只看该作者
Ti网站有很多历程与AP,初学者多去看看

使用特权

评论回复
6
jinpaidianzi|  楼主 | 2011-12-10 09:30 | 只看该作者
感谢上面兄弟的回答啊 现在我也明白是怎么回事了

使用特权

评论回复
7
meishizhaoshi| | 2011-12-10 10:04 | 只看该作者
飘过 学习了 不错

使用特权

评论回复
8
jiahy| | 2011-12-11 11:36 | 只看该作者
这个东西很成熟啊

使用特权

评论回复
9
tianm| | 2011-12-12 09:25 | 只看该作者
在没有CCR模块的单片机中,一般都是用定时器方法实现PWM。
耗费资源,一个定时器废掉了,而且需要CPU干预。
由于进入中断需要几个指令周期的时间,这个时间会给PWM带来不可避免的误差;同时,如果系统有多个中断源,定时器中断有时不能在第一时间得到响应,还会带来更郁闷随机的误差。

使用特权

评论回复
10
加班加点| | 2011-12-12 12:15 | 只看该作者
感觉楼主太懒了,百度下很多,而且书上也有很多

使用特权

评论回复
11
加班加点| | 2011-12-12 12:16 | 只看该作者
最简单的方式你可以到ti官网下载你所用芯片的例程

使用特权

评论回复
12
1021256354| | 2013-3-7 11:37 | 只看该作者
带参.......

使用特权

评论回复
13
雁舞白沙| | 2013-3-8 16:40 | 只看该作者
char TAPwmInit(unsigned char Clk,unsigned char Div,char Mode1,unsigned char Mode2)
{
    TACTL = 0;                  //清除以前设置
    TACTL |= MC_1;              //定时器TA设为增计数模式  
    switch(Clk)                 //选择时钟源
    {
        case 'A': case 'a':  TACTL|=TASSEL_1; break;    //ACLK
        case 'S': case 's':  TACTL|=TASSEL_2; break;    //SMCLK
        case 'E':            TACTL|=TASSEL_0; break;    //外部输入(TACLK)
        case 'e':            TACTL|=TASSEL_3; break;    //外部输入(TACLK取反)
        default :  return(0);                           //参数有误
    }
    switch(Div)                 //选择分频系数
    {
        case 1:   TACTL|=ID_0; break;   //1
        case 2:   TACTL|=ID_1; break;   //2
        case 4:   TACTL|=ID_2; break;   //4
        case 8:   TACTL|=ID_3; break;   //8
        default :  return(0);           //参数有误
    }
    switch(Mode1)               //设置PWM通道1的输出模式。
    {
        case 'P':case 'p':          //如果设置为高电平模式
            TACCTL1 = OUTMOD_7;     //高电平PWM输出
            P1SEL |= BIT2;          //从P1.2输出 (不同型号单片机可能不一样)
            P1DIR |= BIT2;          //从P1.2输出 (不同型号单片机可能不一样)              
            break;
        case 'N':case 'n':          //如果设置为低电平模式         
            TACCTL1 = OUTMOD_3;     //低电平PWM输出
            P1SEL |= BIT2;          //从P1.2输出 (不同型号单片机可能不一样)
            P1DIR |= BIT2;          //从P1.2输出 (不同型号单片机可能不一样)               
            break;
        case '0':case 0:            //如果设置为禁用         
            P1SEL &= ~BIT2;         //P1.2恢复为普通IO口              
            break;                 
        default :  return(0);       //参数有误
    }
    switch(Mode2)                   //设置PWM通道1的输出模式。
    {
        case 'P':case 'p':          //如果设置为高电平模式
            TACCTL2 =OUTMOD_7;      //高电平PWM输出
            P2SEL |= BIT0;          //从P2.0输出 (不同型号单片机可能不一样)
            P2DIR |= BIT0;          //从P2.0输出 (不同型号单片机可能不一样)
            break;
        case 'N':case 'n':          //如果设置为低电平模式         
            TACCTL2 =OUTMOD_3;      //低电平PWM输出
            P2SEL |= BIT0;          //从P2.0输出 (不同型号单片机可能不一样)  
            P2DIR |= BIT0;          //从P2.0输出 (不同型号单片机可能不一样)              
            break;
        case '0':case 0:            //如果设置为禁用         
            P2SEL &= ~BIT0;         //P2.0恢复为普通IO口              
            break;                 
        default :  return(0);       //参数有误
    }   
    return(1);  
}

使用特权

评论回复
14
雁舞白沙| | 2013-3-8 16:41 | 只看该作者
void TAPwmSetPeriod(unsigned int Period)
{
    TACCR0 = Period;
}
void TAPwmSetDuty(unsigned char Channel,unsigned int Duty)
{
    switch(Channel)
    {
        case 1: TACCR1=Duty; break;
        case 2: TACCR2=Duty; break;   
    }
}
void PwmInit(void)
{
    TAPwmInit('S',1,'p','0');
    TAPwmSetPeriod(100);     
}

使用特权

评论回复
15
雁舞白沙| | 2013-3-8 16:41 | 只看该作者
void PwmConn(unsigned int *DataDptr,unsigned int TimesliceFg)
{
    unsigned int i;
    i=~TimesliceFg;
    if(*DataDptr&TimesliceFg)
    {
        *DataDptr&=i;
        TAPwmInit('S',1,'p','0');  
        PwmTem=PwmTem+5;
        TAPwmSetDuty(1,PwmTem);//---温度输出  
    }
}

使用特权

评论回复
16
Redstar2012| | 2013-3-8 22:36 | 只看该作者
这设置PWM程序挺好的,应该可以控制PWM信号

使用特权

评论回复
17
comeon201208| | 2013-3-9 15:54 | 只看该作者
这个用到定时器的很简单的,正如楼上各位的解决办法的

使用特权

评论回复
18
数码小叶| | 2014-3-19 20:28 | 只看该作者
收藏了,不是很懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

1489

帖子

1

粉丝