|
DeadPermill =((DeadTime*1000)/TA0CCR0); //怎么理解?DeadTime哪里来的的
if((1000-2*Percent)<=DeadPermill) //死区必须小等死区时间
Percent = (1000-DeadPermill)/2;//减去死区时间,剩下有效的么
TA0CCR1=Percent*TA0CCR0/1000; //不懂怎么个解释,
TA0CCR2=TA0CCR0-TA0CCR1; //不懂,图解倒是在Y轴上,勉强理解
char TA0_PWM_SetPerilld(char Channel, uint32_t Duty)//通道和高电平有效千分比
{
uint8_t Mode =0; //模式
uint32_t DeadPermill=0; //绝对死区占空比
uint64_t Percent =0; //有效比值
Percent =Duty; // 有效占空比、转化为千分
DeadPermill =((DeadTime*1000)/TA0CCR0); //绝对死区时间换成千分比。周期=时间/N
switch(Channel)
{
case 1: Mode =(TA0CCTL1&0x00e0>>5) ;break;
case 2: Mode =(TA0CCTL2&0x00e0>>5) break;//读OUTMOD输出模式,
default:return(0);
}
switch(Mode)
{
case 2: case 6:
{
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);
} |
|