⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 steppermotorlib.c

📁 用C语言编写的步进电机的驱动程序
💻 C
字号:
//Steppermotorlib,h
# ifndef _STEPPERMOTOR_H_
# define _STEPPERMOTOR_H_
 
# undef uchar                             /*取消uchar和uint的宏定义*/
# undef uint                                    
# define uchar unsigned char              /*重新宏定义uchar和uint*/
# define uint unsigned int                

# define MAX_SPEED 20                     /*定义最大速度为20*/ 
typedef void(*StepSequence)(uchar x);     /*定义步进电机时序控制函数指针为一个类型*/
typedef enum{                             /*定义步进电机状态*/     
	ROTATE,
	STILL
}State;
 
typedef enum{                              /*定义步进电机控制命令*/
	START,
	STOP,
	SETPARA
}ControlCmd;

typedef enum{                              /*定义步进电机控制方向*/
	CLOCKWISE,
	COUNTERCLOCKWISE
}Direction;

void StepperMotorInit(Stepsequence mydq,State state,uint speed,Direction dir); /*步进电机库函数初始化函数*/
void RotateThread(void);                    /*步进电机运行主线程*/
void RotateControl(ControlCmd cmd,uint speed,Direction dir);/*步进电机控制接口函数*/

# endif /*_STEPPERMOTOR_H_*/
//Steppermotorlib.c
# include "StepperMotorlib.h"                /*包含步进电机头文件*/
 
uchar speedConvert[MAX_SPEED];               /*速度与延时时间转换数组*/  
State g_state=STILL;                         /*步进电机默认状态为停止运转*/
Direction g_dir=CLOCKWISE;                   /*步进电机默认旋转方向为顺时针*/
uint g_speed=10;                             /*步进电机默认速度为10个单位*/  
StepSequence sq;                             /*定义步进电机时序控制函数指针变量*/  
static void UnitDelay(uint num);             /*定义内部延时函数*/   

void StepperMotorInit(StepSequence mysq,State state,uint speed,Direction dir) ;
{
	uchar i;
	for(i=0;i<MAX_SPEED;i++){                 /*速度转换为延时周期*/
		speedConvert[i]=MAX_SPEED-1;          /*速度越大延时周期越小*/ 
	}
	sq=mysq;                                  /*控制时序函数初始化*/  
	g_state=state;                            /*运行状态变量初始化*/   
	g_speed=speed;                            /*转速变量初始化*/
	g_dir=dir;                                /*方向变量初始化*/ 
}
void RotateThread(void)
{
	static uchar index =0;
	while(g_state==ROTATE){                    /*如果目前为运转状态*/ 
		if(g_dir){                             /*如果为顺时针运动*/   
			sq(index&0&07);                    /*每次输出一个控制信号*/
			if(++index>=8){                    /*如果一个控制周期完成*/
				index=0;
			}                        
		}else{                                 /*如果为逆时针运动*/                  
		     sq(index&0&07);                   /*每次输出一个控制信号*/
		     if(--index==0){                   /*如果一个控制周期完成*/
		     	index=7;
		     }
		}
		UnitDelay(g_speed);                    /*步进电机控制时序延时周期*/
	}
}
void RotateControl(ControlCmd cmd,uint speed,Direction dir)
{
	swith(cmd)                                  /*解析命令*/
	{
		case START:g_state=ROTATE;break;        /*如果需要启动电机*/     
		case STOP:g_state=STILL;break;          /*如果需要停止电机*/ 
		case SETPARA:g_speed=speed;g_dir=dir;break;/*如果需要控制电机方向或周期*/
		default:break;
	}
}
ststic void UnitDelay(uint num)
{
	unsigned int i,j;
	if(num>MAX_SPEED){                           /*如果延时周期大于最大速度的延时周期*/
		num=MAX_SPEED;                           /*如果延时周期等于最大速度的延时周期*/ 
	}else if(num==0){                            /*如果延时周期等于0*/
	       num=1;                                /*延时周期设置为1*/ 
	}
	for(i=0;i<speedConvert[num-1];i++){          /*根据设定速度转化来的延时周期做延时*/  
		for(j=0;j<100;j++);                      /*基准延时周期*/
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -