📄 dianji_s.c
字号:
////////////////////////////////////////////////////////////////////
//文件名:dianji.c
//功能描述:从单片机上旋转机构驱动模块
////////////////////////////////////////////////////////////////////
#include "reg52.h"
#include "dianji_s.h"
#include "timer0_s.h"
#define uchar unsigned char
#define uint unsigned int
sbit ROUND_MID=P3^4; //旋转机构中点检测端
sbit ROUND_CE=P3^5; //步进电机驱动芯片控制端
sbit ROUND_A=P3^7;
sbit ROUND_B=P3^6;
//////////////////////////////////////////////////////////////////
data int degree=0; //需要转到的角度
data int nowdegree=0; //目前所处角度
bdata bit temp_mid;//暂存ROUND_MID,用来校正角度值
//////////////////////////////////////////////////////////////////
//局部函数声明
void round_step1(void); //顺时针旋转一步
void round_step2(void); //逆时针旋转一步
///////////////////////////////////////////////////////////////////////
//旋转步进电机驱动
void driver_dianji(void)
{
static bdata bit flag_close=0;
//以下几行使步进电机驱动芯片的CE端占空比为50%
if(flag_close)
{
flag_close=0;
ROUND_CE=1;
return;
}
else
{
flag_close=1;
}
//以下部分没8ms执行一次
if(nowdegree==degree)
{
ROUND_CE=1; //转到指定角度则关闭电机
return ;
}
ROUND_CE=0; //未转到指定位置则打开电机
if(nowdegree>degree) //需要逆时针旋转
{
round_step1();
nowdegree--;
//角度校正
if((!temp_mid)&&ROUND_MID)nowdegree=DEGREE_MID;
else if(temp_mid&&(!ROUND_MID))nowdegree=DEGREE_MID+4;
}
else //需要顺时针旋转
{
round_step2();
nowdegree++;
//角度校正
if(temp_mid&&(!ROUND_MID))nowdegree=DEGREE_MID;
else if((!temp_mid)&&ROUND_MID)nowdegree=DEGREE_MID+4;
}
}
data uchar flag_round;//步进电机状态标识
///////////////////////////////////////////////////////////////////
//顺时针转一步1/520圈
void round_step1(void)
{
switch(flag_round)
{
case 0:
ROUND_A=0;
ROUND_B=0;
break;
case 1:
ROUND_A=1;
ROUND_B=0;
break;
case 2:
ROUND_A=1;
ROUND_B=1;
break;
case 3:
ROUND_A=0;
ROUND_B=1;
break;
}
flag_round++;
flag_round&=0x03;
}
//////////////////////////////////////////////////////////////////
//逆时针转一步
void round_step2(void)
{
switch(flag_round)
{
case 0:
ROUND_A=0;
ROUND_B=0;
break;
case 1:
ROUND_A=0;
ROUND_B=1;
break;
case 2:
ROUND_A=1;
ROUND_B=1;
break;
case 3:
ROUND_A=1;
ROUND_B=0;
break;
}
flag_round++;
flag_round&=0x03;
}
////////////////////////////////////////////////////////////////////
//初始化电机,达到同步并找到0度角
void initdianji(void)
{
temp_mid=ROUND_MID;
setdegree(4); //使步进电机进入同步状态
delay_ms(200);
setdegree(0);
delay_ms(200);
setdegree(40); //先在小范围内寻找原点
while(getnowdegree()!=40)
{
if(ROUND_MID)
{
setdegree(0);
return;
}
}
delay_ms(200);
setdegree(-260); //逆时针旋转以校正原点
while(getnowdegree()!=(-260))
{
if(ROUND_MID)
{
setdegree(0);
return;
}
}
delay_ms(200);
setdegree(260);
while(getnowdegree()!=260) //顺时针旋转以校正原点
{
if(ROUND_MID)
{
setdegree(0);
return;
}
}
}
///////////////////////////////////////////////////////////////////////
//旋转到指定的角度-300~300
//单位为步数
//传感器转一圈需要520步
void setdegree(int dg)
{
if(dg<(-400))return;
else if(dg>400)return;
else
{
degree=dg;
}
}
///////////////////////////////////////////////////////////////////
//将转动机构转到指定的角度后返回
void roundto(int dg)
{
if(dg<(-400))return;
if(dg>400)return;
degree=dg;
while(nowdegree!=degree);
}
//////////////////////////////////////////////////////////////////
//返回当前的角度值
int getnowdegree(void)
{
return nowdegree;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -