基于C51的步进电机控制器设计
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
设计任务
控制器有三种运转模式:连续模式、点动模式、行程模式。四位数码管,从左到右,第一位显示模式,第二位显示方向,三四位显示速度或行程。各模式间采用<模式>键切换。
(1)连续模式:可以用+、—键增减速,FWR、REV键调整正反方向,<启/停>键启动或停止电机连续运转。
(2)点动模式:FWR为正转、REV为反转,按键不松开,电机一直运转。
(3)行程模式:可以用+、—键设置一个行程,<启/停>键启动电机运转,步进电机自动先加速,再匀速,最后减速停止走完整个行程。
提示:以下是本篇文章正文内容,下面案例可供参考
一、步进电机是什么
本次使用的是五线四项步进电机28BYJ-48,八拍工作。L298N中VCC接5V,可正常工作。由于这款步进电机本身有1:64的减速比,所以程序装载后速度较慢,想加速在改变参数后电机本身会出现堵转、丢步等现象。
对步进电机工作原理不是很了解的同学可以百度一下哈,不过不用过于深究这个问题,接好线之后上手做就完事了,奥利给~
二、程序设计
1.流程图
大概是流程图吧,可能画的不太规范。
2.定时器中断调速程序
代码如下(示例):
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define MotorData P0 //步进电机控制接口定义
sbit plus=P2^0; //独立按键接口定义
sbit minus=P2^1;
sbit FWR=P2^2;
sbit REV=P2^3;
sbit start=P2^4;
sbit stop=P2^5;
sbit modelTranslat=P2^7;
sbit DI1=P1^0; //数码管接口定义
sbit DI2=P1^1;
sbit DI3=P1^2;
sbit DI4=P1^3;
sbit DIO=P1^4;
sbit RCK=P1^5;
sbit SCLK=P1^6;
uchar phasecw[8] = {
0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//正转导通相序
uchar DIG_CODE[11] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//数码管段选 以0起始
uint modelFlag=0,directionFlag=0,speedNnumber=5,stepNnumber=0,
stepTrue=0,startFlag=0xff,order=0;
//定时器中断 时间初始化 相序标记赋值
void Time0() interrupt 1 {
uint speedTrue=2000*(10-speedNnumber);
TH0=(65536-speedTrue)/256;
TL0=(65536-speedTrue)%256;
if(order==7){
order=-1;
}
order+=1;
}
//小延时
void delay(uint i){
while(i--);
}
//ms延时函数
void Delay_xms(uint x){
uint i,j;
for(i=0;i<x;i++){
for(j=0;j<112;j++);
}
}
//拆分并将待显示数据送达数码管 段选
void transitData(uchar display_data){
uint i;
SCLK=0;
RCK=0;
for(i=0;i<8;i++){
SCLK=0;
if((display_data<<i)&0x80){
DIO=1;
}
else DIO=0;
SCLK=1;
}
RCK=1;
}
//分模式对显示数据位选 调用段选 延时消隐
void Dislay(){
if(modelFlag==0){
DI1=1;DI2=0;DI3=0;DI4=0;
transitData(DIG_CODE[modelFlag]);
delay(1);
transitData(DIG_CODE[10]);
DI1=0;DI2=1;DI3=0;DI4=0;
transitData(DIG_CODE[directionFlag]);
delay(1);
transitData(DIG_CODE[10]);
DI1=0;DI2=0;DI3=1;DI4=0;
transitData(DIG_CODE[0]);
delay(1);
transitData(DIG_CODE[10]);
DI1=0;DI2=0;DI3=0;DI4=1;
transitData(DIG_CODE[speedNnumber]);
delay(1);
transitData(DIG_CODE[10]);
}
if(modelFlag==1){
DI1=1;DI2=0;DI3=0;DI4=0;
transitData(DIG_CODE[modelFlag]);
delay(1);
transitData(DIG_CODE[10]);
DI1=0;DI2=1;DI3=0;DI4=0