五、单片机之步进电机控制综合应用设计

本文介绍了如何使用单片机AT89C52控制步进电机,包括步进电机的工作原理、输入输出电路设计、以及在Proteus和Keil软件中的应用。详细讲解了顺时针、逆时针转动和停止的控制程序。
摘要由CSDN通过智能技术生成

目录

前言

一、步进电机原理

1、步进电机

2、输入电路

3、输出电路

二、单片机原理图绘制

1、所需元件名称

2、绘制原理图

三、编写程序

总结

前言

今天我们来学习单片机AT89C52控制步进电机转动,。期间我们用到的软件有proteus和keil两个软件,欢迎大家提问已经寻找错误,请大家点个关注和收藏,后续还会更新。


一、步进电机原理

1、步进电机

步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,又称脉冲电机。步进电机是通过脉冲信号来进行控制,每输入一个脉冲信号,步进电机前进一步。步进电机旋转的步距角,是在电机结构的基础上等比例控制产生的,如果控制电路的细分控制不变,那么步进旋转的步距角在理论上是一个固定角度。在实际工作中,电机旋转的步距角会有微小的差别,主要是由于电机结构上的固定有误差产生的,而且这种误差不会积累。常见的有基本步距角为1.8°两相步进电机和基本步距角为1.2°的三相步进电机,此外,其它基本步距角的步进电机,分别是0.72°,0.9°,1.5°,3.6°,3.75°。

步进电机的总极数越大,加工精度的要求就越高。通常工业用混合型步进电机的步距角是1.8度,也就是200极。

总的来说,步进电机的运转控制方便精确,同时静音、低振动、低热量和低能耗等等都是步进电机的优势。随着步进电机的进一步发展, 传感器技术的不断提高和设计改进,步进电机的技术水平也将随之提高。同时,随着工业自动化的发展趋势,步进电机在日常生活中的应用将会越来越广泛。

2、输入电路

本实验设置三个按钮,分别控制步进电机的顺时针转动、逆时针转动以及停转。

3、输出电路

数码管与LED灯共同显示现在步进电机进行的状态。

二、单片机原理图绘制

1、所需元件名称

proteus原理图中名称对应:

AT89C52——52单片机芯片;

BUTTON——按钮(复位按键);

CAP——无极性电容;

CAP-ELEC——电解电容;

CAP-POL——极性电容;

CRYSTAL——晶振

RES——电阻;

74LS138——3线-8线译码器;

74HC573——锁存器;

LED-BIBY——发光二极管;

MOTOR-STEPPER——六线制步进电机;

RESPACK-7——七脚电阻排;

ULN2003A——达林顿阵列芯片;

7SEG-MPX2-CA-BLUE——共阳极数码管显示器;

以上就是我们这次设计需要用到的所有元器件,接下来我们就需要创建新工程,然后在右面添加元器件进行绘制。

2、绘制原理图

首先是绘制最小系统,将AT89C52、复位电路、时钟电路绘制出来。

开始绘制输入电路

然后咱们继续绘制输出电路(其中包括数码管、LED灯显示以及步进电机的连接)

最后进行对原理图功能的备注、整理等最后的收尾工作。

至此,咱们的原理图就绘制完成,接下来咱们可以根据绘制的原理图开始编写程序。

三、编写程序

编辑对步进电机进行控制的数组

unsigned char straight[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//顺时针
unsigned char reverse[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//逆时针

输出电路

void forward(void)//正转函数
{
   unsigned char t;
	for(t=0;t<8;t++)
	{
	MOTOR=straight[t];//MOTOR宏定义为步进电机对应I/O口
		delay(10000);
	}
}
void reversal(void)//反转函数
{
   unsigned char t;
	for(t=0;t<8;t++)
	{
	MOTOR=reverse[t];
		delay(10000);
	}
}
void stop(void)//停止函数
{
   MOTOR=0x00;
}

输入电路(在主函数中进行检测按钮的按下)

void main()
{
   unsigned char t=0;
   while(1)
	{
	  P2=0xf7;
	  P1=gsmg_code[0];//gsmg_code[]为数码管显示数组
	  switch(P3)
		{
			case 0xfe:
				    while(P3==0XFF)
					 {
                        forward();
					    P2=0xf4;
						P1=gsmg_code[1];
					 }break;
			case 0xfb:
				    while(P3==0XFF)
					 {
                         reversal();
						 P2=0xf2;
						 P1=gsmg_code[2];
                     }break;
					    
			case 0xf7:
				    while(P3==0XFF)
					 {
                         stop();
					     P2=0xf7;
					     P1=gsmg_code[0];
                     }break;
		 }
	}
}

至此,程序编写完成。

代码效果:

根据以上步骤,咱们就可以得到想要的实验效果啦!


总结

以上就是咱们的实验步骤,在实验中咱们需要注意对步进电机的控制,以及2位共阳极数码管的显示。通过porteus和keil对步进电机进行了简单的设计。希望对你有帮助,后续我还会持续更新,帮忙点赞收藏,欢迎大家来看。

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
一次控制两个电机#include #define GPIO_MOTOR P1 sbit K1=P3^6; sbit K2=P3^5; sbit K3=P3^4; sbit K4=P3^3; unsigned char code ZHENG1 [8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //正转顺序编码 unsigned char code FAN1 [8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //反转顺序编码 unsigned char code ZHENG2 [8]={0x1f,0x3f,0x2f,0x6f,0x4f,0xcf,0x8f,0x9f}; //正转顺序编码 unsigned char code FAN2 [8]={0x9f,0x8f,0xcf,0x4f,0x6f,0x2f,0x3f,0x1f}; //反转顺序编码 char Motor1_Step,Motor2_Step,Speed,Speed2; void Delay(unsigned int t); void Motor1_zheng(); void Motor1_fan(); void Motor2_zheng(); void Motor2_fan(); void main() { unsigned int i; Motor1_Step=1; Motor2_Step=3; Speed=10; Speed2=40; while(1) { while(K1==0) { for(i=0;i<10;i++) { Motor1_zheng(); } } while(K2==0) { for(i=0;i<10;i++) { Motor1_fan(); } } while(K3==0) { for(i=0;i<10;i++) { Motor2_zheng(); } } while(K4==0) { for(i=0;i<10;i++) { Motor2_fan(); } } } } void Motor1_fan() { unsigned int i; for(i=0;i<8;i++) { //GPIO_MOTOR = FFW[i]&0x1f; //取数据 GPIO_MOTOR = FAN1[i]; Delay(Speed); //调节转速 } } void Motor1_zheng() { unsigned int i; for(i=0;i<8;i++) { //GPIO_MOTOR = FFZ[i]&0x1f; GPIO_MOTOR = ZHENG1[i]; Delay(Speed); //调节转速 } } void Motor2_fan() { unsigned int i; if(Motor1_Step==0) { for(i=0;i<8;i++) { //GPIO_MOTOR = FFW2[i]&0xf1; //取数据 GPIO_MOTOR = FAN2[i]; Delay(Speed2); //调节转速 } } Motor1_Step=1; } void Motor2_zheng() { unsigned int i; if(Motor1_Step==1) { for(i=0;i<8;i++) { //GPIO_MOTOR = FFZ2[i]&0xf1; GPIO_MOTOR = ZHENG2[i]; Delay(Speed2); //调节转速 } } Motor1_Step=0; } void Delay(unsigned int t) { unsigned int k; while(t--) { for(k=0; k<80; k++) { } } }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值