?? 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 + -