📄 steppermotorlib.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 + -