msp 430 pwm怎么控制?

[复制链接]
7737|17
 楼主| jinpaidianzi 发表于 2011-11-19 11:30 | 显示全部楼层 |阅读模式
想写个软件来实时输出占空比可调的pwm波形,请各位高手帮忙解答
创展和众 发表于 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,可通过修改寄存器调节占空比,网上有大把的例程可供参考。
一览 发表于 2011-11-19 16:37 | 显示全部楼层
Ti网站有很多历程与AP,初学者多去看看
 楼主| jinpaidianzi 发表于 2011-12-10 09:30 | 显示全部楼层
感谢上面兄弟的回答啊 现在我也明白是怎么回事了
meishizhaoshi 发表于 2011-12-10 10:04 | 显示全部楼层
飘过 学习了 不错
jiahy 发表于 2011-12-11 11:36 | 显示全部楼层
这个东西很成熟啊
tianm 发表于 2011-12-12 09:25 | 显示全部楼层
在没有CCR模块的单片机中,一般都是用定时器方法实现PWM。
耗费资源,一个定时器废掉了,而且需要CPU干预。
由于进入中断需要几个指令周期的时间,这个时间会给PWM带来不可避免的误差;同时,如果系统有多个中断源,定时器中断有时不能在第一时间得到响应,还会带来更郁闷随机的误差。
加班加点 发表于 2011-12-12 12:15 | 显示全部楼层
感觉楼主太懒了,百度下很多,而且书上也有很多
加班加点 发表于 2011-12-12 12:16 | 显示全部楼层
最简单的方式你可以到ti官网下载你所用芯片的例程
1021256354 发表于 2013-3-7 11:37 | 显示全部楼层
带参.......
雁舞白沙 发表于 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);  
}
雁舞白沙 发表于 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);     
}
雁舞白沙 发表于 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);//---温度输出  
    }
}
Redstar2012 发表于 2013-3-8 22:36 | 显示全部楼层
这设置PWM程序挺好的,应该可以控制PWM信号
comeon201208 发表于 2013-3-9 15:54 | 显示全部楼层
这个用到定时器的很简单的,正如楼上各位的解决办法的
数码小叶 发表于 2014-3-19 20:28 | 显示全部楼层
收藏了,不是很懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

1489

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部