基于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
  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值