This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

采用msp430f169输出2路互补pwm,怎么在pwm上增加死区啊?

Other Parts Discussed in Thread: MSP430F169

采用msp430f169输出2路互补pwm,怎么在pwm上增加死区啊?

static char TAPwmInit(char Clk,char Div,char Mode1,char Mode2,char Mode3,char Mode4)
{
    TBCTL = 0;                  //清除以前设置
    TBCTL |= MC_1;              //定时器TA设为增计数模式  
    switch(Clk)                 //选择时钟源
    { 
        case 'A': case 'a':  TBCTL|=TBSSEL_1; break;    //ACLK
        case 'S': case 's':  TBCTL|=TBSSEL_2; break;    //SMCLK
        case 'E':            TBCTL|=TBSSEL_0; break;    //外部输入(TACLK)
        case 'e':            TBCTL|=TBSSEL_3; break;    //外部输入(TACLK取反)
        default :  return(0);                           //参数有误
    } 
    switch(Div)                 //选择分频系数
    { 
        case 1:   TBCTL|=ID_0; break;   //1
        case 2:   TBCTL|=ID_1; break;   //2
        case 4:   TBCTL|=ID_2; break;   //4
        case 8:   TBCTL|=ID_3; break;   //8
        default :  return(0);           //参数有误
    } 
    switch(Mode1)               //设置PWM通道1的输出模式。
    { 
        case 'P':case 'p':          //如果设置为高电平模式
            TBCCTL1 = OUTMOD_7;     //高电平PWM输出
            P4SEL |= BIT1;          //从P1.2输出 (不同型号单片机可能不一样)
            P4DIR |= BIT1;          //从P1.2输出 (不同型号单片机可能不一样)              
            break;
        case 'N':case 'n':          //如果设置为低电平模式          
            TBCCTL1 = OUTMOD_3;     //低电平PWM输出
            P4SEL |= BIT1;          //从P1.2输出 (不同型号单片机可能不一样) 
            P4DIR |= BIT1;          //从P1.2输出 (不同型号单片机可能不一样)                
            break; 
        case '0':case 0:            //如果设置为禁用          
            P4SEL &= ~BIT1;         //P1.2恢复为普通IO口              
            break;                 
        default :  return(0);       //参数有误
    } 
    switch(Mode2)                   //设置PWM通道1的输出模式。
    { 
        case 'P':case 'p':          //如果设置为高电平模式
            TBCCTL2 =OUTMOD_7;      //高电平PWM输出
            P4SEL |= BIT2;          //从P1.3输出 (不同型号单片机可能不一样)
            P4DIR |= BIT2;          //从P1.3输出 (不同型号单片机可能不一样)
            break;
        case 'N':case 'n':          //如果设置为低电平模式          
            TBCCTL2 =OUTMOD_3;      //低电平PWM输出
            P4SEL |= BIT2;          //从P1.3输出 (不同型号单片机可能不一样)  
            P4DIR |= BIT2;          //从P1.3输出 (不同型号单片机可能不一样)              
            break; 
        case '0':case 0:            //如果设置为禁用          
            P4SEL &= ~BIT2;         //P1.3恢复为普通IO口              
            break;                 
        default :  return(0);       //参数有误
    }
    switch(Mode3)                   //设置PWM通道3的输出模式。
    { 
        case 'P':case 'p':          //如果设置为高电平模式
            TBCCTL3 =OUTMOD_7;      //高电平PWM输出
            P4SEL |= BIT3;          //从P1.3输出 (不同型号单片机可能不一样)
            P4DIR |= BIT3;          //从P1.3输出 (不同型号单片机可能不一样)
            break;
        case 'N':case 'n':          //如果设置为低电平模式          
            TBCCTL3 =OUTMOD_3;      //低电平PWM输出
            P4SEL |= BIT3;          //从P1.3输出 (不同型号单片机可能不一样)  
            P4DIR |= BIT3;          //从P1.3输出 (不同型号单片机可能不一样)              
            break; 
        case '0':case 0:            //如果设置为禁用          
            P4SEL &= ~BIT3;         //P1.3恢复为普通IO口              
            break;                 
        default :  return(0);       //参数有误
    } 
        switch(Mode4)                   //设置PWM通道4的输出模式。
    { 
        case 'P':case 'p':          //如果设置为高电平模式
            TBCCTL4 =OUTMOD_7;      //高电平PWM输出
            P4SEL |= BIT4;          //从P1.3输出 (不同型号单片机可能不一样)
            P4DIR |= BIT4;          //从P1.3输出 (不同型号单片机可能不一样)
            break;
        case 'N':case 'n':          //如果设置为低电平模式          
            TBCCTL4 =OUTMOD_3;      //低电平PWM输出
            P4SEL |= BIT4;          //从P1.3输出 (不同型号单片机可能不一样)  
            P4DIR |= BIT4;          //从P1.3输出 (不同型号单片机可能不一样)              
            break; 
        case '0':case 0:            //如果设置为禁用          
            P4SEL &= ~BIT4;         //P1.3恢复为普通IO口              
            break;                 
        default :  return(0);       //参数有误
    }  
    return(1);  
}

static void TAPwmSetPeriod(unsigned int Period)
{
    TBCCR0 = Period;
    TBCCR1 = Period;
    TBCCR2 = Period;
    TBCCR3 = Period;
    TBCCR4 = Period;
}

static void TAPwmSetDuty(char Channel,unsigned int Duty)
{
    switch(Channel)
    {
        case 1: TBCCR1=Duty; break; 
        case 2: TBCCR2=Duty; break; 
        case 3: TBCCR3=Duty; break; 
        case 4: TBCCR4=Duty; break;
    }
}

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

void pwm_init(void)
{
  TAPwmInit('A',2,'P','P','P','P');   //将定时器TA初始化成为PWM发生器
  TAPwmSetPeriod(1000);        //通道1/2的PWM方波周期均设为500个时钟周期
}

void pwm_set(unsigned char sta,unsigned char dir,unsigned int pwm_in,unsigned int pwm_out)
{
	if((1 == sta) && (1 == dir))
	{
		    TAPwmInit('A',2,'0','0','N','P');
			TAPwmSetPermill(3,(pwm_out-2));     //2通道 20.0%
			TAPwmSetPermill(4,(pwm_out));     //2通道 20.0%	
			P4OUT |=BIT1;  //   1
			//P4OUT&=~BIT1;  //   0
   			//P4OUT |=BIT2;  //   1
			P4OUT&=~BIT2;  //   0
    		//P4OUT |=BIT3;  //   1
			//P4OUT&=~BIT3;  //   0
			//P4OUT |=BIT4;  //   1
			//P4OUT&=~BIT4;  //
	}
	else if((1 == sta) && (0 == dir))
	{
			TAPwmInit('A',2,'N','P','0','0');
			TAPwmSetPermill(1,(pwm_in-2));     //2通道 20.0%
			TAPwmSetPermill(2,(pwm_in));     //2通道 20.0%
			//P4OUT |=BIT1;  //   1
			//P4OUT&=~BIT1;  //   0
			//P4OUT |=BIT2;  //   1
			//P4OUT&=~BIT2;  //   0
    		P4OUT |=BIT3;  //   1
			//P4OUT&=~BIT3;  //   0
			//P4OUT |=BIT4;  //   1
			P4OUT&=~BIT4;  //   0
	}
	else if(0 == sta)
	{
			TAPwmInit('A',2,'0','0','0','0');
			P4OUT |=BIT1;  //   1
			//P4OUT&=~BIT1;  //   0
			  
   			//P4OUT |=BIT2;  //   1
			P4OUT&=~BIT2;  //   0
			  
    		//P4OUT |=BIT3;  //   1
			P4OUT&=~BIT3;  //   0
			  
			//P4OUT |=BIT4;  //   1
			P4OUT&=~BIT4;  //   0	
	}
	else {};
  
}