📄 pwm.c
字号:
#include<regX52.h>
#define uchar unsigned char
#define uint unsigned int
#define PWMON 0 //低
#define PWMOFF 1 //高
#define MAXSpeedPWMNum 10 //运行时电机的最高运行速度
#define RCAP2H_025ms 0xfc //22.1184*1000000/6=3686400; 1843200
#define RCAP2L_025ms 0x67 //3686400/4000=921=0x399 0x10000-0x399=0xfc67
#define RCAP2H_10ms 0x70
#define RCAP2L_10ms 0x00 //3686400/100=36864=0x9000 0x10000-0x9000=0x7000
#define SpeedUpTime 5 //可通过修改SpeedUpTime的值,改变PWM信号启动所用的时间
#define SpeedDownTime 20 //可通过修改SpeedDownTime的值,改变PWM信号停止所用的时间
sbit PWM=P0^0; //PWM输出引脚
bit StartPWMFlag=0; //启动PWM标志
bit StopPWMFlag=0; //停止PWM标志
bit OutPutPWMFlag=0; //输出PWM信号标志
uchar CurSpeed; //当前速度
uchar CurMaxSpeed; //需要达到的最高速度
uchar CurPWMNum; //当前PWM脉冲数
uchar ChangeSpeedTimesOut=0; //PWM由0到当前设定值所需要的时间或PWM由当前设定值到0所需要的时间
//****************************************
void timer0(void) interrupt 1 //0.5ms 定时
{
TH0=RCAP2H_025ms;
TL0=RCAP2L_025ms;
if(OutPutPWMFlag==1)
{
if(CurPWMNum<CurSpeed)
PWM=PWMON;
else
PWM=PWMOFF;
CurPWMNum++;
if(CurPWMNum==MAXSpeedPWMNum)
CurPWMNum=0;
}
else
PWM=PWMOFF;
}
void timer2(void) interrupt 5 //10ms 定时
{
TF2 = 0;
if(StartPWMFlag==1) //启动PWM,每隔50*10ms速度增加一档,当速度增加到CurMaxSpeed时,则停止增速
{ //可通过修改SpeedUpTime的值,改变PWM信号启动所用的时间
ChangeSpeedTimesOut--;
if(ChangeSpeedTimesOut==0)
{ ChangeSpeedTimesOut=SpeedUpTime;
CurSpeed++;
if(CurSpeed>CurMaxSpeed)
{ StartPWMFlag=0;
CurSpeed=CurMaxSpeed;
}
}
}
if(StopPWMFlag==1) //停止PWM,每隔SpeedDownTime*10ms速度降低一档,当CurSpeed==0时,停止输出PWM信号
{ //可通过修改SpeedDownTime的值,改变PWM信号停止所用的时间
ChangeSpeedTimesOut--;
if(ChangeSpeedTimesOut==0)
{
ChangeSpeedTimesOut=SpeedDownTime;
if(CurSpeed>0)
CurSpeed--;
if(CurSpeed==0)
{ StopPWMFlag=0;
PWM=PWMOFF;
OutPutPWMFlag=0;
}
}
}
}
//==========================
void StartPWM(uchar speed) //启动PWM,参数为该次启动所要达到的速度,speed的值为0~MAXSpeedPWMNum
{
PWM=PWMOFF;
CurPWMNum=0;
CurSpeed=1;
CurMaxSpeed=speed;
ChangeSpeedTimesOut=SpeedUpTime;
StartPWMFlag=1;
StopPWMFlag=0;
OutPutPWMFlag=1;
}
void StopPWM() //停止PWM
{
ChangeSpeedTimesOut=SpeedDownTime;
StartPWMFlag=0;
StopPWMFlag=1;
}
//************************************
void Init()
{ EA=0;
TMOD =0x21;
TH0=RCAP2H_025ms;
TL0=RCAP2L_025ms;
ET0=1;
TR0=1;
T2MOD = 0x00; //T2 is in 16 bit autoreload mode
T2CON = 0x00;
RCAP2L =RCAP2H_10ms; //genereating interrupts on 10 ms|22.1184 MHz clock
RCAP2H =RCAP2L_10ms;
TL2 = RCAP2L;
TH2 = RCAP2H;
ET2 = 1;
TR2 = 1;
EA=1;
PWM=PWMOFF;
}
void Delayms(uint msNum)
{uint i=0;
uint j=0;
for(i=0;i<msNum;i++)
{
for(j=0;j<112;j++)
;
}
}
main()
{
Init();
//SpeedTozero(); //************
StartPWM(5); //例如启动PWM,速度为5
Delayms(5000);
StopPWM();
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -