采用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;//ACLKcase 'S': case 's': TBCTL|=TBSSEL_2; break;//SMCLKcase 'E':TBCTL|=TBSSEL_0; break;//外部输入(TACLK)case 'e':TBCTL|=TBSSEL_3; break;//外部输入(TACLK取反)default : return(0);//参数有误}switch(Div)//选择分频系数{case 1:TBCTL|=ID_0; break;//1case 2:TBCTL|=ID_1; break;//2case 4:TBCTL|=ID_2; break;//4case 8:TBCTL|=ID_3; break;//8default : 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 {};
}
Delta:
现在输出的波形由截图吗?两路是否对齐的?
如果硬件不支持的死区设定,你可以做个修正值delta,加在每一路duty设置上。如果不够精细,可以每一路单独设一个修正值。
但是前沿和后沿想单独设定的话,就不太容易。
是否可以用其他MSP430 的型号?
Jacky Xu:
430本身不带硬件死区,有一种方法可以做类似功能
如下图,采用updown计数模式,用中心对其的方式可以做出一个死区
灰小子:
对pwm要求比较高的话,建议选用c2000系列
TI中文支持网




