一﹑实验目的 1﹑掌握步进电机控制系统的硬件设计方法。﹑掌握步进电机速度调节﹑方向控制技术。 3·进一步学习编制步进电机驱动程序的软件设计方法。﹑教学要求 1﹑编程控制步进电机的运行速度。﹑编程控制步进电机的旋转方向。﹑主要仪器设备 机电实验平台﹑步进电机,万用表﹑示波器,电脑四﹑实验内容 如图所示:单片机电路:
从上图可以看出,通过单片机输入芯片的电路是集成的 P1.O~P1.3分别连接到INA,INB,INC,IND,芯片输出J80端子引出。
步进电机A,A- ,B,B-分别接到J81端子上的OUTA,OUTB,OUTC,OUTD,将JP1的K1-K4连接到P1.4-P1.写一个程序,将PO口接到J8脚的a,b,c,d,e,f,g,dp上,单片机P2分别连接到JP1的KEY1到KEY8·根据实验确定步进电机的初始速度。
完成以下内容:
1)按下K步进电机正在旋转
2)按下K2.停止电机。 3)按下K步进电机反转。 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 // ×?D?D?2??üD?óú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????ú??????£oA->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;//í£?1?1?àDò } } u8 key_scan(u8 mode) { static u8 key=1; if(mode)key=1; if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//è?òa°′?ü°′?? { 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]; } }