一﹑实验目的
1﹑掌握步进电动机控制系统的硬件设计方法。2﹑掌握步进电动机速度调节﹑方向控制技术。
3·进一步学习编制步进电动机驱动程序的软件设计方法。二﹑教学要求
1﹑编制程序,控制步进电动机的运转速度。2﹑编制程序,控制步进电动机的旋转方向。三﹑主要仪器设备
机电实验平台﹑步进电机,万用表﹑示波器,电脑四﹑实验内容
单片机电路如图所示:
从上图中可以看出,该电路是集成的,芯片的输入通过单片机 P1.O~P1.3分别连接到INA,INB,INC,IND,芯片的输出由J80端子引出。
将步进电机的A,A- ,B,B-分别接到J81端子上的OUTA,OUTB,OUTC,OUTD,将JP1的K1-K4连接到P1.4-P1.7编写一程序,将PO口接到J8脚的a,b,c,d,e,f,g,dp上,单片机P2分别连接到JP1的KEY1到KEY8·步进电机的初始速度根据实验自行确定。
编写程序完成以下内容:
1)按下K1,步进电机正转动
2)按下K2,电机停止。
3)按下K3,步进电机反转动。
4)按下K4,步进电机转速增加一个档位(每个档位是初始速度50%增加)。5)按下K5,步进电机转速降低一个档位(每个档位是初始速度50%减少) 。6)电机工作时,分别在显示器上显示步进电机的速度档位。
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit IN1_A=P1^0;
sbit IN2_B=P1^1;
sbit IN3_C=P1^2;
sbit IN4_D=P1^3;
sbit KEY1=P2^1;
sbit KEY2=P2^0;
sbit KEY3=P2^2;
sbit KEY4=P2^3;
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
// ×îС²»ÄÜСÓÚ1
#define STEPMOTOR_MAXSPEED 1
#define STEPMOTOR_MINSPEED 5
#define smg P3
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void step_motor_28BYJ48_send_pulse(u8 step,u8 dir)
{
u8 temp=step;
if(dir==0)
temp=7-step;
switch(temp)//8¸ö½ÚÅÄ¿ØÖÆ£ºA->AB->B->BC->C->CD->D->DA
{
case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//Í£Ö¹ÏàÐò
}
}
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode)key=1;
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//ÈÎÒâ°´¼ü°´ÏÂ
{
delay_10us(1000);//Ïû¶¶
key=0;
if(KEY1==0)
return KEY1_PRESS;
else if(KEY2==0)
return KEY2_PRESS;
else if(KEY3==0)
return KEY3_PRESS;
else if(KEY4==0)
return KEY4_PRESS;
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)
{
key=1;
}
return KEY_UNPRESS;
}
void main()
{
u8 key=0;
u8 dir=0;
u8 speed=STEPMOTOR_MINSPEED;
u8 step=0;
u8 code_smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
int i=0;
while(1)
{
key=key_scan(0);
if(key==KEY1_PRESS)
{
dir=!dir;
i=speed;
smg=~code_smg[i];
}
else if(key==KEY2_PRESS)
{
if(speed>STEPMOTOR_MAXSPEED)
speed-=1;
i=speed;
smg=~code_smg[i];
}
else if(key==KEY3_PRESS)/
{
if(speed<STEPMOTOR_MINSPEED)
speed+=1;
i=speed;
smg=~code_smg[i];
}
step_motor_28BYJ48_send_pulse(step++,dir);
if(step==8)step=0;
delay_ms(speed);
i=speed;
smg=~code_smg[i];
}
}