基于51单片机直流电机PWM调速设计

1、设计需求及目标

设计以单片机STC89C51和三极管控制的直流电机脉宽调制调速系统。利用STC89C51芯片进行低成本直流电动机控制系统的设计,能够简化系统构成、降低系统成本、增强系统性能、满足更多应用场合的需要。系统实现对电机的正转、反转、急停、加速、减速的控制,以及PWM的占空比在液晶上的实时显示。同时显示实时的电机转速。

2、设计思路及方案

采用三极管组成PWM信号的驱动系统,并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节,从而控制其输入信号波形等均作了详细的阐述。另外,本系统中使用了霍尔元件对直流电机的转速进行测量,经过处理后,将测量值送到液晶显示出来。电路图:

基于51单片机直流电机PWM调速设计_第1张图片

3、部分代码

#include 
#define uchar unsigned char
#define uint unsigned int 
void displaym();
sbit en=P2^5;		//1602  6管脚
sbit rs=P2^7;	 //1602端口	4管脚
sbit rw=P2^6;//lcd1602控制端口 5管脚
sbit num1=P1^0;						//占空比加1
sbit num2=P1^1;								   //占空比减一
sbit num3=P1^2;											   //正传
sbit num4=P1^3;													 //反转
sbit num5=P1^4;														   //开始停止切换

sbit out=P3^4;							 //PWM输出用于正传
sbit out1=P3^7;			//PWM输出用于反转

uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;




void delay(uint z)//延时1ms函数
{

 uint x,y;
 for(x=0;x=1)
		m--;
			displaym();					//设定占空比减一
	
	 }
  }
    if(num3==0)
  {
    delay(5);
	 if(num3==0)
	 {
	  zheng=1;		//正传标志置1
	  fan=0;	  // 反转标志置0
	
	 }
  }
      if(num4==0)
  {
    delay(5);
	 if(num4==0)
	 {
	  zheng=0;		 //正传标志置0
	  fan=1;	  // 反转标志置1
	
	 }
  }
      if(num5==0)
  {
    delay(5);
	 if(num5==0)
	 {
	 while(num5==0)	 ;
	  kai=1-kai;
	 }
  }
}
void display()
{
  write_com(0x82);
  zhuansu=zhuansu*30;	  //将两秒内的计数乘以30得到转每分

  if(zhuansu/10000!=0)
   write_data(zhuansu/10000+0x30);						  //如果转速的万位不为0	正常显示否则显示空格
   else
   write_data(' ');

  if(zhuansu/1000==0)
  write_data(' ');
  else 
  write_data(zhuansu%10000%1000+0x30);								//如果转速小于1000 千位为空格 否则正常显示
  
  if(zhuansu/100==0)
  write_data(' ');
  else
  write_data(zhuansu%10000%1000/100+0x30);					   //如果转速小于100 百位为空格 否则正常显示

    if(zhuansu/10==0)
  write_data(' ');
  else
  write_data(zhuansu%10000%1000%100/10+0x30);				  //如果转速小于10 十位为空格 否则正常显示

  write_data(zhuansu%10000%1000%100%10+0x30);
  write_com(0xd0);			  //如果没有这句,当中断内的显示函数执行完,就会在转速的位置显示占空比数据,导致乱码
}
void displaym()
{
 write_com(0xcb);
   if(m/200%10!=0)
  write_data(m/200%10+0x30);			   //如果占空比百位不为0则显示百位否则显示空格
  else 
  write_data(' ');
  
  if(m/200%10==0&&m/20%10==0)
  write_data(' ');
  else
  write_data(m/20%10+0x30);				 //如果占空比小于10 十位正常显示  否则显示空格
  
  write_data(m/2%10+0x30);				 //显示个位
}
void main()
{
    flag_1=0;
	m=100;							 //占空比为100
	zhuansu=0;					   //转速初值0
	flag=0;
	zheng=1;				  //初始化电机正转动
	fan=0;

    init();              //初始化

	while(1)
	{
	keyscan();				//键盘扫描程序


 
	  
	}

}
void int1()interrupt 2				//外部中断1脉冲技术记录电机的转速 电机转一圈zhuansu加一
{
  zhuansu++;
}
void int2()interrupt 3				  //定时器0显示转速
{
 
  TH0=0xdc;
  TL0=0x00;//定时10ms
  flag++;
  	
  if(flag==200)				   //计时到达2s
    {


	display();					//显示转速
	zhuansu=0;					  //转速置0
	flag=0;

	}
}
void int3()interrupt 1					 //产生PWM
{
  
  TH1=0xff;
  TL1=0x00;//定时100us
  
  	flag_1++;
	if(flag_1>199)
	flag_1=1;
	if(kai==1)		  //如果kai==1电机启动
	{
	if(zheng==1)				//电机正转
	{
	if(flag_1

完整资料:https://market.m.taobao.com/app/idleFish-F2e/widle-taobao-rax/page-detail?wh_weex=true&wx_navbar_transparent=true&id=614513458599&ut_sk=1.WUpxx7gpwUoDAMmnnrBIzAno_12431167_1585228024499.Copy.detail.614513458599.1828622527&forceFlush=1

你可能感兴趣的:(基于51单片机直流电机PWM调速设计)