单片机51---步进电机的设计(4相5线步进电机的驱动控制)

单片机51—步进电机的设计

禁止作为商用,仅供学习交流。

0.本文主要内容

本文主要介绍了为实现步进电机的控制,先在电脑编写程序,仿真成功后,在进行实物的制作,最终独立自主的完成51单片机的编程,硬件电路的设计,画原理图,画PCB板,购买电子元器件,PCB板的焊接和检测,实物的展示等工作。
个人的观点,这个设计的现实意义不大,因为步进电机真正特点是利用脉冲信号去控制步进电机转动的角度。主要用于房间空调器分体系列室内机导风板、暖风器导风板、移动空调、壁炉更洁宝和各种智能气阀(燃气热水器、燃气灶等)。转动的速度很慢不占优势。(为什么我做了呢?因为这是一个课程设计。哈哈)

1.主要功能

本设计可采用STC89C51/52、AT89S51/52或AT89C51/52单片机作为主控制器;
(1)按键功能:
• 按键1:正转
• 按键2:反转
• 按键3:速度加
• 按键4:速度减
• 按键5:暂停/开始
(2)LED使用:五个红色LED,一个为电源指示,四个指示电机的转速。

2.Proteus软件仿真

(1)硬件电路
在这里插入图片描述
四位数码管为共阴极的。
4相5线步进电机28YBJ-48 28BYJ48不熟悉,你可以不用管,你只要知道对它输送一定的脉冲波形他就可以转动就行了。
uchar code turn[ ]={0x02,0x06,0x04,0x0c,0x80,0x09,0x01,0x03};//正转脉冲顺序
uchar code durn[ ]={0x03,0x01,0x09,0x80,0x0c,0x04,0x06,0x02};//反转脉冲顺序
仿真文件在文末连接
(2)软件程序

/* Main.c file generated by New Project wizard
 *
 * Created:   周日 9月 19 2021
 * Processor: AT89C51
 * Compiler:  Keil for 8051
 */
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define out P2
uchar code turn[ ]={0x02,0x06,0x04,0x0c,0x80,0x09,0x01,0x03};
uchar code durn[ ]={0x03,0x01,0x09,0x80,0x0c,0x04,0x06,0x02};
uchar code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值
uchar i; //脉冲的第几个状态
uint dang=0;//挡位
uint fang;//转向
uint ci=0;//中断出发次数
uint dan;//备份挡位
uint fan;//备份转向
uchar gao;
uchar di;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
void delayms(uint j)
{
    uchar a;
    for(;j>0;j--)//0.5ms
    {
        a=250;
        while(--a);
	a=249;
        while(--a);	
     }
}

void xuan( )
{
     P1=0Xff;
   if(P1!=0xff)//读取按键是否按下
	{
		delayms(100);//延时10ms进行消抖
		if(P1!=0xff)//再次检测键盘是否按下
		{	
                     switch(~P1)   
                     {
                        //case(0x00):fang=1;break;
                        case(0x01):if(i<8) {i++;} else{i=0;} out=turn[i];fang=1;delayms(50);break;   
                        case(0x02):if(i<8) {i++;} else{i=0;} out=durn[i];fang=0;delayms(50);break;
		        case(0x04):dang++;break;
		        case(0x08):dang--;if(dang>15){dang=0;};break;
                      } 
                 }
	   }
}
void DigDisplay()
{
        uint j;
	for(j=0;j<4;j++)
	{
		switch(j)	 //位选,选择点亮的数码管,
		{
		  case(0):P34=0;P0=~smgduan[fang];break;	 
		  case(1):P35=0;P0=0x40;break;
		  case(2):P36=0;P0=~smgduan[dang/10%10];break;
		  case(3):P37=0;P0=~smgduan[dang%10];break;						
		}
	delayms(1); //间隔一段时间扫描	
	P0=0x00;//消隐	
	P3=0xff;
	}
}
void dang_wei()
{
switch(dang)
	{
	        case(0):ET1=0;break;
		case(1):ET1=1;gao=0x88,di=0x00;break;
		case(2):ET1=1;gao=0x90,di=0x00;break;
		case(3):ET1=1;gao=0x98,di=0x00;break;
		case(4):ET1=1;gao=0xa0,di=0x00;break;
		case(5):ET1=1;gao=0xa8,di=0x00;break;
		case(6):ET1=1;gao=0xb0,di=0x00;break;
	        case(7):ET1=1;gao=0xb8,di=0x00;break;
		case(8):ET1=1;gao=0xc0,di=0x00;break;
		case(9):ET1=1;gao=0xc8,di=0x00;break;
		case(10):ET1=1;gao=0xd0,di=0x00;break;
		case(11):ET1=1;gao=0xd8,di=0x00;break;
		case(12):ET1=1;gao=0xe0,di=0x00;break;
		case(13):ET1=1;gao=0xe8,di=0x00;break;
		case(14):ET1=1;gao=0xf0,di=0x00;break;
		case(15):ET1=1;gao=0xf8,di=0x00;break;
		case(16):ET1=1;gao=0xfa,di=0x00;break;
	}
}   

void main (void)
{
          EA=1;
	  EX0=1;
	  IT0=1;
	  TMOD=0x10;
	  TR1=1;
	  TH1=0xfc;
	  TL1=0x00;
    while(1)
    {
     xuan( );
    
     if(dang<=0)
      {
	 dang=0;
      }
     if(dang>16)
      {
	 dang=16;
      }
       dang_wei();
      DigDisplay();
    }   
}

void int0() interrupt 0 using 1
{   
	 EX0=0;
   if(ci==0)//第一次按下,暂停。
   {
	         dan=dang;
		 fan=fang;
		 dang=0;
		 ci++;
	 }
   else//第二次按下,继续。
   {
	    dang=dan;
		  fang=fan;
		  ci=0;
	 }
   EX0=1;	 
}
void time1(void) interrupt 3 using 0
{
	 TH1=gao;
	 TL1=di;
	 if(fang==1)
	 {
	   out=turn[i];
	 }
	 else
	 {
	   out=durn[i];
	 }
	 i++;
	 if(i>8)
	 {i=0;}
}


这里的编程并不是很巧妙,而是采用列举法,出现一个挡位值,列举对应情况的条件,16个挡位,对应16种情况,这样真的很笨,是可以改进的。
软件仿真成功后,接下来做实物。
我用的画PCB软件是Altium Designer Summer 09。

3.原理图

在这里插入图片描述
原理图上每个元器件都需要有封装,所谓的封装,简约版本就是显示元器件在PCB板引脚属性(引脚的个数,引脚的大小,是贴片安装还是直插安装等)和元器件的大小范围,这个可以自己画。
豪华板就是3D封装,会显示元器件的3D模型。需要注意PCB板制作出来是否能用,关键看引脚属性,并不是看3D封装是否好看。
原理图放在在文末连接。

4.PCB板的制作

(1)初级版本
在这里插入图片描述
(2)升级版本
在这里插入图片描述
升级版本PCB板上注释了电阻的阻值,发光二级管和极性电容的正负极,上拉电阻的VCC注释需要注意,按照PCB板的注释即可。51单片机引脚可以独立驱动数码管,上拉电阻可以不要,但是还要重新改变原理图,PCB重新布线。我时间有限就没有改,也能用。
对于学生来说淘宝上PCB打板费用还是比较贵的。下面是几个免费pcb制作网站。给初学者带来一定的支持。
捷多邦 每天有一次免费制版的机会,需要在固定时间去领。
捷配 注册后每月有两个免费卷,连续三个月未下实付订单的账号,将取消免费打样券领取资质。只能白嫖6次。
嘉立创 需要在电脑下载app,注册后注册后每月有两个免费机会,无需领卷。
以上免费的条件:单层/两层板必须是10cm*10cm以内的。都是包邮的不要钱的。
注意焊接完成后,不要立即接上电源,而是要看PCB板焊接时是否短路。用万用表中欧姆表(兆欧表)测升级版本PCB板中P4(排针)0V–5V之间的阻值,如果显示为0欧姆,恭喜您,您焊废了,连上电源就短路了。(我就焊坏了一个,当然并不是焊错了,而是电阻阻值选的不合适)。如果显示为多少多少兆欧姆,你就可以安心接上电源了。

5.元器件购买清单

我的原件封装有的是自己画的,并不规范,生成的BOM表不可用,所以要自己一个一个去通过元器件的封装尺寸去淘宝购买元器件。我的消息比较闭塞,如果有什么好的办法,可以告诉我,谢谢。注意一定要注意规格!!!,市场上一个原件有不同的规格(形状尺寸不同,极性不同,封装不同),这里的元器件都是直插式的,因为条件有限。。。
在这里插入图片描述

6.实物展示

(1)四次制作的PCB板
在这里插入图片描述
(2)焊接成品
在这里插入图片描述
(3)运行演示
在这里插入图片描述

再一次强调,焊接的时候一定按照PCB板的注释焊接,一定要细心。
这是一个压缩包文件,里面含有许多东西,有图有真相,嘻嘻。
在这里插入图片描述
在这里插入图片描述

文件包

版权声明:本文为CSDN博主「云齐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43372433/article/details/120982251

单片机51—步进电机的设计

禁止作为商用,仅供学习交流。

0.本文主要内容

本文主要介绍了为实现步进电机的控制,先在电脑编写程序,仿真成功后,在进行实物的制作,最终独立自主的完成51单片机的编程,硬件电路的设计,画原理图,画PCB板,购买电子元器件,PCB板的焊接和检测,实物的展示等工作。
个人的观点,这个设计的现实意义不大,因为步进电机真正特点是利用脉冲信号去控制步进电机转动的角度。主要用于房间空调器分体系列室内机导风板、暖风器导风板、移动空调、壁炉更洁宝和各种智能气阀(燃气热水器、燃气灶等)。转动的速度很慢不占优势。(为什么我做了呢?因为这是一个课程设计。哈哈)

1.主要功能

本设计可采用STC89C51/52、AT89S51/52或AT89C51/52单片机作为主控制器;
(1)按键功能:
• 按键1:正转
• 按键2:反转
• 按键3:速度加
• 按键4:速度减
• 按键5:暂停/开始
(2)LED使用:五个红色LED,一个为电源指示,四个指示电机的转速。

2.Proteus软件仿真

(1)硬件电路
在这里插入图片描述
四位数码管为共阴极的。
4相5线步进电机28YBJ-48 28BYJ48不熟悉,你可以不用管,你只要知道对它输送一定的脉冲波形他就可以转动就行了。
uchar code turn[ ]={0x02,0x06,0x04,0x0c,0x80,0x09,0x01,0x03};//正转脉冲顺序
uchar code durn[ ]={0x03,0x01,0x09,0x80,0x0c,0x04,0x06,0x02};//反转脉冲顺序
仿真文件在文末连接
(2)软件程序

/* Main.c file generated by New Project wizard
 *
 * Created:   周日 9月 19 2021
 * Processor: AT89C51
 * Compiler:  Keil for 8051
 */
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define out P2
uchar code turn[ ]={0x02,0x06,0x04,0x0c,0x80,0x09,0x01,0x03};
uchar code durn[ ]={0x03,0x01,0x09,0x80,0x0c,0x04,0x06,0x02};
uchar code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值
uchar i; //脉冲的第几个状态
uint dang=0;//挡位
uint fang;//转向
uint ci=0;//中断出发次数
uint dan;//备份挡位
uint fan;//备份转向
uchar gao;
uchar di;
sbit P34=P3^4;
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
void delayms(uint j)
{
    uchar a;
    for(;j>0;j--)//0.5ms
    {
        a=250;
        while(--a);
	a=249;
        while(--a);	
     }
}

void xuan( )
{
     P1=0Xff;
   if(P1!=0xff)//读取按键是否按下
	{
		delayms(100);//延时10ms进行消抖
		if(P1!=0xff)//再次检测键盘是否按下
		{	
                     switch(~P1)   
                     {
                        //case(0x00):fang=1;break;
                        case(0x01):if(i<8) {i++;} else{i=0;} out=turn[i];fang=1;delayms(50);break;   
                        case(0x02):if(i<8) {i++;} else{i=0;} out=durn[i];fang=0;delayms(50);break;
		        case(0x04):dang++;break;
		        case(0x08):dang--;if(dang>15){dang=0;};break;
                      } 
                 }
	   }
}
void DigDisplay()
{
        uint j;
	for(j=0;j<4;j++)
	{
		switch(j)	 //位选,选择点亮的数码管,
		{
		  case(0):P34=0;P0=~smgduan[fang];break;	 
		  case(1):P35=0;P0=0x40;break;
		  case(2):P36=0;P0=~smgduan[dang/10%10];break;
		  case(3):P37=0;P0=~smgduan[dang%10];break;						
		}
	delayms(1); //间隔一段时间扫描	
	P0=0x00;//消隐	
	P3=0xff;
	}
}
void dang_wei()
{
switch(dang)
	{
	        case(0):ET1=0;break;
		case(1):ET1=1;gao=0x88,di=0x00;break;
		case(2):ET1=1;gao=0x90,di=0x00;break;
		case(3):ET1=1;gao=0x98,di=0x00;break;
		case(4):ET1=1;gao=0xa0,di=0x00;break;
		case(5):ET1=1;gao=0xa8,di=0x00;break;
		case(6):ET1=1;gao=0xb0,di=0x00;break;
	        case(7):ET1=1;gao=0xb8,di=0x00;break;
		case(8):ET1=1;gao=0xc0,di=0x00;break;
		case(9):ET1=1;gao=0xc8,di=0x00;break;
		case(10):ET1=1;gao=0xd0,di=0x00;break;
		case(11):ET1=1;gao=0xd8,di=0x00;break;
		case(12):ET1=1;gao=0xe0,di=0x00;break;
		case(13):ET1=1;gao=0xe8,di=0x00;break;
		case(14):ET1=1;gao=0xf0,di=0x00;break;
		case(15):ET1=1;gao=0xf8,di=0x00;break;
		case(16):ET1=1;gao=0xfa,di=0x00;break;
	}
}   

void main (void)
{
          EA=1;
	  EX0=1;
	  IT0=1;
	  TMOD=0x10;
	  TR1=1;
	  TH1=0xfc;
	  TL1=0x00;
    while(1)
    {
     xuan( );
    
     if(dang<=0)
      {
	 dang=0;
      }
     if(dang>16)
      {
	 dang=16;
      }
       dang_wei();
      DigDisplay();
    }   
}

void int0() interrupt 0 using 1
{   
	 EX0=0;
   if(ci==0)//第一次按下,暂停。
   {
	         dan=dang;
		 fan=fang;
		 dang=0;
		 ci++;
	 }
   else//第二次按下,继续。
   {
	    dang=dan;
		  fang=fan;
		  ci=0;
	 }
   EX0=1;	 
}
void time1(void) interrupt 3 using 0
{
	 TH1=gao;
	 TL1=di;
	 if(fang==1)
	 {
	   out=turn[i];
	 }
	 else
	 {
	   out=durn[i];
	 }
	 i++;
	 if(i>8)
	 {i=0;}
}


这里的编程并不是很巧妙,而是采用列举法,出现一个挡位值,列举对应情况的条件,16个挡位,对应16种情况,这样真的很笨,是可以改进的。
软件仿真成功后,接下来做实物。
我用的画PCB软件是Altium Designer Summer 09。

3.原理图

在这里插入图片描述
原理图上每个元器件都需要有封装,所谓的封装,简约版本就是显示元器件在PCB板引脚属性(引脚的个数,引脚的大小,是贴片安装还是直插安装等)和元器件的大小范围,这个可以自己画。
豪华板就是3D封装,会显示元器件的3D模型。需要注意PCB板制作出来是否能用,关键看引脚属性,并不是看3D封装是否好看。
原理图放在在文末连接。

4.PCB板的制作

(1)初级版本
在这里插入图片描述
(2)升级版本
在这里插入图片描述
升级版本PCB板上注释了电阻的阻值,发光二级管和极性电容的正负极,上拉电阻的VCC注释需要注意,按照PCB板的注释即可。51单片机引脚可以独立驱动数码管,上拉电阻可以不要,但是还要重新改变原理图,PCB重新布线。我时间有限就没有改,也能用。
对于学生来说淘宝上PCB打板费用还是比较贵的。下面是几个免费pcb制作网站。给初学者带来一定的支持。
捷多邦 每天有一次免费制版的机会,需要在固定时间去领。
捷配 注册后每月有两个免费卷,连续三个月未下实付订单的账号,将取消免费打样券领取资质。只能白嫖6次。
嘉立创 需要在电脑下载app,注册后注册后每月有两个免费机会,无需领卷。
以上免费的条件:单层/两层板必须是10cm*10cm以内的。都是包邮的不要钱的。
注意焊接完成后,不要立即接上电源,而是要看PCB板焊接时是否短路。用万用表中欧姆表(兆欧表)测升级版本PCB板中P4(排针)0V–5V之间的阻值,如果显示为0欧姆,恭喜您,您焊废了,连上电源就短路了。(我就焊坏了一个,当然并不是焊错了,而是电阻阻值选的不合适)。如果显示为多少多少兆欧姆,你就可以安心接上电源了。

5.元器件购买清单

我的原件封装有的是自己画的,并不规范,生成的BOM表不可用,所以要自己一个一个去通过元器件的封装尺寸去淘宝购买元器件。我的消息比较闭塞,如果有什么好的办法,可以告诉我,谢谢。注意一定要注意规格!!!,市场上一个原件有不同的规格(形状尺寸不同,极性不同,封装不同),这里的元器件都是直插式的,因为条件有限。。。
在这里插入图片描述

6.实物展示

(1)四次制作的PCB板
在这里插入图片描述
(2)焊接成品
在这里插入图片描述
(3)运行演示
在这里插入图片描述

再一次强调,焊接的时候一定按照PCB板的注释焊接,一定要细心。
这是一个压缩包文件,里面含有许多东西,有图有真相,嘻嘻。
在这里插入图片描述
在这里插入图片描述

文件包

版权声明:本文为CSDN博主「云齐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43372433/article/details/120982251

生成海报
点赞 0

云齐

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

智能车竞赛-英飞凌TC264核心板-开源

英飞凌TC264核心板分析 全国大学生智能汽车竞赛转眼间已进行到第十七届,在参加此次比赛的组别也在积极准备,都在为7月份的车赛取得优异成绩而努力奋斗着。前一段时间,组委会也将部分组别比赛规则公示。作为

智能车竞赛-英飞凌TC264核心板-开源

英飞凌TC264核心板分析 全国大学生智能汽车竞赛转眼间已进行到第十七届,在参加此次比赛的组别也在积极准备,都在为7月份的车赛取得优异成绩而努力奋斗着。前一段时间,组委会也将部分组别比赛规则公示。作为