#define OUTMOD_2 (2*0x20u) /* PWM output mode: 2 - PWM toggle/reset */
在上面这个宏定义当中 2*0x20u 中,这个‘2*’是不是‘2乘以’的意思?还是表示OUTMOD的第2模式是0x02?
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);
}
在上面这个程序当中: unsigned long int Percent=0; //防止乘法运算时溢出
Percent=Duty;
以上这段语句是不是显得很鸡肋,因为下面又要重新定义过-----Percent=(1000-DeadPermill)/2;
2*0x20u 就是2乘
代码没看,哪里复制的?最好问作者
2*0x20u是430里的位赋值而已,两个理解不冲突。一点不鸡肋啊,下面那个赋值是有条件的,不能和初始化对比,还有,你问了 好几个死区的问题,你没有理解430的定时器死区,还是多看看手册吧