4391|3

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于对PWM库函数配置TA0CCR1和TA0CCR2的值计算的问题 [复制链接]

 

按照这个库函数,由TA0_PWM_Init()函数知道,在死区模式下工作的话,通道1工作在模式6,通道2工作在模式2,然后在TA0_PWM_SetPermill()这个函数中

case 2: case 6:            /**死区模式2,6时,需要判断修正死区时间,且同时设定TA1CCR1/2 的值*/
        {
            if((1000-2*Percent)<=DEADTIME)    //预留死区时间
                Percent=(1000-DEADTIME)/2;
            TA0CCR1=Percent* TA0CCR0/1000;
            TA0CCR2= TA0CCR0-TA0CCR1;
            break;
        }

这部分我看不懂了,为什么TA1CCR1=Percent * TA1CCR0/1000是这样计算的

书上看到死区的时间应该是TA0CCR1 - TA0CCR2,也就是TA0CCR1应该大于TA0CCR2,而按照程序的计算方法,由于死区的占空比应该要小于50%,所以TA0CCR1是明显小于TA0CCR2的啊

按我的理解应该是TA2CCR1=Percent * TA1CCR0/1000;TA0CCR1= TA0CCR0-TA0CCR2; 这样才对啊

麻烦各位帮忙,谢谢!

库函数:

#include <msp430g2553.h>

#define DEADTIME 20                            //预设死区时间,以TA的clk为单位

/*******设定TA输出IO口,目前设定为MSP430G2553,20Pin封装无TA0.2********/
#define TA01_SET     P1SEL |= BIT6; P1DIR |= BIT6        //P1.6
#define TA02_SET     P3SEL |= BIT0; P3DIR |= BIT0        //P3.0
#define TA11_SET     P2SEL |= BIT2; P2DIR |= BIT2        //P2.2
#define TA12_SET     P2SEL |= BIT4; P2DIR |= BIT4        //P2.4
#define TA01_OFF     P1SEL&= ~BIT6                         //P1.6
#define TA02_OFF     P3SEL &= ~BIT0                         //P3.0
#define TA11_OFF     P2SEL &= ~BIT2                         //P2.2
#define TA12_OFF     P2SEL &= ~BIT4                        //P2.4
/******************************************************************************************************
* 名       称:TA0_PWM_Init()
* 功       能:TA0定时器作为PWM发生器的初始化设置函数
* 入口参数:Clk:时钟源 'S'=SMCLK;   'A'=ACLK ;   'E'=TACLK(外部输入); 'e'= TACLK(TACLK取反)
                    Div:时钟分频系数: 1/2/4/8
            Mode1:通道1的输出模式 'F'设为超前PWM(模式7),'B'滞后PWM(模式3) ,'D'带死区增PWM(模式6),0=禁用
            Mode2:通道2的输出模式 'F'设为超前PWM(模式7),'B'滞后PWM (模式3),'D'带死区减PWM(模式2),0=禁用
            设置输出带死区控制的PWM时,两通道均需使用,且均为死区模式。
* 出口参数:1表示设置成功,0表示参数错误,设置失败。
* 说       明 : 在调用PWM相关函数之前,需要调用该函数设置TA的模式和时钟源。
* 范       例 : TA0_PWM_Init('A',1,'F','P')TA时钟设为ACLK,通道1和通道2均为超前PWM输出
               TA0_PWM_Init('S',4,'D','D')TA时钟设为SMCLK/4, 通道1为死区增PWM、通道2为死区减PWM
               TA0_PWM_Init('A',1,'F',0)TA时钟设为ACLK,通道1超前PWM输出,通道2不作TA用。
 ******************************************************************************************************/
char TA0_PWM_Init(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);
}
/******************************************************************************************************
* 名       称:TA0_PWM_SetPeriod()
* 功       能:设置PWM发生器的周期
* 入口参数:Channel: TA0=0, TA1=1
*                     Period:周期(0~65535) 时钟个数
* 出口参数:1:设置成功     0:设置失败
* 说       明 : 普通PWM与带死区PWM周期相差一倍
* 范       例 : TA0_PWM_SetPeriod(500)设置PWM方波周期为500或1000个时钟周期
 ******************************************************************************************************/
char TA0_PWM_SetPeriod(unsigned int Period)
{
    if (Period>65535)    return(0);
     TA0CCR0 = Period;
    return(1);
}

/******************************************************************************************************
* 名    称:TA0_PWM_SetPermill()
* 功    能:设置PWM输出的占空比(千分比)
* 入口参数:Channel: 当前设置的通道号  1/2
            Duty: PWM高电平有效时间的千分比 (0~1000),
* 出口参数:1设置成功,0设置失败
* 说    明: 1000=100.0%  500=50.0% ,依次类推。死区模式时,两channel同时设定。
* 范    例: TA0_PWM_SetPermill(1,300)设置PWM通道1方波的占空比为30.0%
               TA0_PWM_SetPermill(2,,825)设置PWM通道2方波的占空比为82.5%
 ******************************************************************************************************/
char TA0_PWM_SetPermill(char Channel,unsigned int Duty)
{
    unsigned char Mod = 0;
    unsigned int DeadPermill=0;
    unsigned long int Percent=0;                            //防止乘法运算时溢出
    Percent=Duty;
    DeadPermill=((DEADTIME*1000)/TACCR0);        //将绝对死区时间换算成千分比死区时间
    switch (Channel)                                                //先判断出通道的工作模式
        {
    case 1:
        Mod = (TA0CCTL1& 0x00e0)>>5;        break;    //读取输出模式,OUTMOD0位于5-7位
    case 2:
        Mod = (TA0CCTL2 & 0x00e0)>>5;    break;    //读取输出模式,OUTMOD1位于5-7位
    default:    return(0);
        }

    switch(Mod)                                                        //根据模式设定TACCRx
        {
    case 2: case 6:            /**死区模式2,6时,需要判断修正死区时间,且同时设定TA0CCR1/2 的值*/
        {
            if((1000-2*Percent)<=DeadPermill)            //预留死区时间
                Percent=(1000-DeadPermill)/2;
            TA0CCR1=Percent*TA0CCR0/1000;
            TA0CCR2= TA0CCR0-TA0CCR1;
            break;
        }
        case 7:
        {
            if(Percent>1000)    Percent=1000;
            if(Channel==1) TA0CCR1=Percent* TA0CCR0/1000;
            if(Channel==2) TA0CCR2=Percent* TA0CCR0/1000;
            break;
        }
        case 3:        //占空比一律为正脉宽,所以需要 TA0CCR0减去占空比
        {
            if(Percent>1000)    Percent=1000;
            if(Channel==1) TA0CCR1= TA0CCR0-Percent*TA0CCR0/1000;
            if(Channel==2) TA0CCR2= TA0CCR0-Percent*TA0CCR0/1000;
            break;
        }
        default: return(0);
        }
        return (1);
    }

 

最新回复

[attach]555945[/attach]   [attach]555949[/attach]   详情 回复 发表于 2021-8-10 15:06
点赞 关注
 

回复
举报

6593

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

不知道楼主看哪本书,要以官方的手册为准

msp430单片机本身是不带硬件死区,即便没有专门的死区时间设置,但通过特定方式编程可以实现类似死区功能。编程手册的定时器部分,采用递增递减的计时方式来产生pwm信号,可以通过判断设置PWM的值来实现死区时间的控制。

 

下面是一个msp430手册,看参考一下部分章节

 

 
 
 

回复

6593

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 

 

MSP430x1xx FamilY User’s Guide.pdf (1.51 MB, 下载次数: 2)

点评

非常感谢!!! 我看的是杨艳,傅强编写的《从零开启大学生电子设计之路》  详情 回复 发表于 2021-8-10 16:40
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

4
 

非常感谢!!!

我看的是杨艳,傅强编写的《从零开启大学生电子设计之路》

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表