×
嵌入式 > 嵌入式开发 > 详情

固定占空比PWM频率可调子程序

发布时间:2020-08-25 发布时间:
|
//PWM频率=1/((PR2+1)*4*(1/fosc)*预分频值)HZ

//spdval=255 频率=11.71875KHz
//spdval=14 频率=200.0KHz
void HiSpd(unsigned char spdval)
{
unsigned char x;
unsigned int y;
x=PR2;
if(spdval==x) return;
if(spdval<14) //
spdval=14; //最大限定在200KHz
T2CKPS1=0;
T2CKPS0=0; //预分频1:1
/*
y=(spdval+1)*5/2; //(CCPR1L:CCP1CON<5:4>)=(PR2+1)/占空比
if(0x0001==(y&0x0001))
{CCP2Y=1;}
else
{CCP2Y=0;}
if(0x0002==(y&0x0002))
{CCP2X=1;}
else
{CCP2X=0;}
CCPR2L=y>>2;
TMR2IF=0;
while(!TMR2IF);
PR2=spdval;
*/
if(spdval>x)
{
for(;x
{
y=(x+1)*5/2; //(CCPR1L:CCP1CON<5:4>)=(PR2+1)/占空比
if(0x0001==(y&0x0001))
{CCP2Y=1;}
else
{CCP2Y=0;}
if(0x0002==(y&0x0002))
{CCP2X=1;}
else
{CCP2X=0;}
CCPR2L=y>>2;
TMR2IF=0;
while(!TMR2IF);
PR2=x;
if((30<=x)&&(x<60))
{
delaynms(10);
}
else if((24<=x)&&(x<30))
{
delaynms(30);
}
else if((19<=x)&&(x<24))//120KHz~150KHz
{
delaynms(35);
}
else if((14<=x)&&(x<19))//150KHz~200KHz
{
delaynms(40);
}
else
{}
}
}
else
{
for(;x>=spdval;x--)
{
y=(x+1)*5/2; //(CCPR1L:CCP1CON<5:4>)=(PR2+1)/占空比
if(0x0001==(y&0x0001))
{CCP2Y=1;}
else
{CCP2Y=0;}
if(0x0002==(y&0x0002))
{CCP2X=1;}
else
{CCP2X=0;}
CCPR2L=y>>2;
TMR2IF=0;
while(!TMR2IF);
PR2=x;
if((30<=x)&&(x<60))
{
delaynms(10);
}
else if((24<=x)&&(x<30))
{
delaynms(30);
}
else if((19<=x)&&(x<24))
{
delaynms(35);
}
else if((14<=x)&&(x<19))//150KHz~200KHz
{
delaynms(40);
}
else
{}
}
}
}
//spdval=255 频率=732.42Hz
//spdval=15 频率=11.71875KHz
void LoSpd(unsigned char spdval)
{
unsigned char x;
unsigned int y;
x=PR2;
if(spdval==x) return;
if(spdval<15) //
spdval=15; //最大限定在11.71875KHz
T2CKPS1=1;
T2CKPS0=0; //预分频1:16
/*
y=(spdval+1)*5/2; //(CCPR1L:CCP1CON<5:4>)=(PR2+1)/占空比
if(0x0001==(y&0x0001))
{CCP2Y=1;}
else
{CCP2Y=0;}
if(0x0002==(y&0x0002))
{CCP2X=1;}
else
{CCP2X=0;}
CCPR2L=y>>2;
TMR2IF=0;
while(!TMR2IF);
PR2=spdval;
*/
if(spdval>x)
{
for(;x
{
y=(x+1)*5/2; //(CCPR1L:CCP1CON<5:4>)=(PR2+1)/占空比
if(0x0001==(y&0x0001))
{CCP2Y=1;}
else
{CCP2Y=0;}
if(0x0002==(y&0x0002))
{CCP2X=1;}
else
{CCP2X=0;}
CCPR2L=y>>2;
TMR2IF=0;
while(!TMR2IF);
PR2=x;

if((30<=x)&&(x<60))
{
delaynms(10);
}
else if((15<=x)&&(x<30))
{
delaynms(15);
}
else
{}
}
}
else
{
for(;x>=spdval;x--)
{
y=(x+1)*5/2; //(CCPR1L:CCP1CON<5:4>)=(PR2+1)/占空比
if(0x0001==(y&0x0001))
{CCP2Y=1;}
else
{CCP2Y=0;}
if(0x0002==(y&0x0002))
{CCP2X=1;}
else
{CCP2X=0;}
CCPR2L=y>>2;
TMR2IF=0;
while(!TMR2IF);
PR2=x;

if((30<=x)&&(x<60))
{
delaynms(10);
}
else if((15<=x)&&(x<30))
{
delaynms(15);
}
else
{}
}
}
}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机汇编语言 如何实现点亮熄灭二极管