直流电机PWM调速程序(C语言)
#include
//头文件
#define ulong unsigned long//关键字宏定义 #define uchar unsigned char
sbit motor_l_a=P0^2;//直流电机控制线接口定义 sbit motor_l_b=P0^3;// sbit motor_r_a=P0^0;// sbit motor_r_b=P0^1;// sbit motor_l_en=P0^4;// sbit motor_r_en=P0^5;//
//*****************变量定义***************************//
ulong delay_flag=0;//用于较精确延时的变量 uchar pwm=0;//定时器0中断服务程序中的计数变量 uchar PWM_L=0,PWM_R=0;
//***************函数声明******************************//
void init_time0();//定时器0初始化函数 void motor_run(uchar direct,uchar speed_l,uchar speed_r);//直流电机控制函数.direct
控制方向,speed分别控制两个电机转速
//***************主函数********************************//
void main()
{
uchar i;//用于直流电机循环工作中的变量
init_time0();//调用初始化函数
while(1)
{
for(i=0;i<11;i++)//直流电机正向加速
{
motor_run(1,i,i);
delay_flag=20000;
while(delay_flag);
}
for(i=10;i>0;i--)//直流电机反向减速
{
motor_run(0,i,i);
delay_flag=20000;
while(delay_flag);
}
}
}
void time0_pwm() interrupt 1//定时器0中断服务程序 {
//**********************直流电机PWM调速部分***************************//
pwm++;
if(pwm==10)//设置PWM调速周期为1ms。
{
pwm=0;
P0|=0X30;//P0口进行或运算。
}
if(pwm==PWM_L)//PWM_L=0~10;
motor_l_en=0;
if(pwm==PWM_R)//PWM_R=0~10;
motor_r_en=0;
//*******************较精确延时部分*********************************//
if(delay_flag)
delay_flag--;
}
void init_time0()//定时器0初始化函数
{
TMOD=0X02;//采用定时器模式2,8位精确定时
TH0=156;//定时器赋初值;100US中断一次,这里的晶振是11.0592M;若晶振为12M,则
选用156;
TL0=156;
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//定时器0开始运行
}
void motor_run(uchar direct,uchar speed_l,uchar speed_r)//直流电机控制函数,direct
代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
方向;speed分别控制两个电机速度
{
if(direct)//direct==1代表向前
{
P0=(P0&0x30)|0x05;//(P0&0x30)的作用是停止电机,目的是为了避免切换时产生不
规则脉冲。
}
else//direct==0代表向后
{
P0=(P0&0x30)|0x0A;
}
PWM_L=speed_l;
PWM_R=speed_r;
}