📄 main.c
字号:
//****************************************************************************
//文件名:main.c
//描述: 步进电机驱动主函数,使用C8051F330。
//版本:1.0 2005-11-11
//****************************************************************************
//头文件引用区
#include "c8051f330.h"
//#define SPEEACC 10 // 步进电机加减速系数
// 如果想要加减速系数可调,改成 unsigned int iSpeedAcc
//#define SPEEDMAX 16000 // 步进电机最高转速 = 2*8*200*最高转速
// 如果想要最高转速可调,改成 unsigned int iSpeedMax
#define SPEEDMIN 80 // 步进电机启动转速 = 2*8*200*启动转速
// 如果想要启动转速可调,改成 unsigned int iSpeedMin
#define SYSCLK 22118400 // 晶体频率
#define MAXSTEP 1000000 // 最大运行步数
//函数声明区
extern void Init_Device(void); // 初始化函数
//全局变量定义区
sbit nZero = P1^0; // 步进电机驱动器零点标志
sbit nOver = P1^1; // 步进电机驱动器溢出标志
sbit nRST = P1^4; // 步进电机驱动器芯片复位控制
sbit nEN = P1^5; // 步进电机驱动器工作允许
sbit DIR = P1^6; // 步进电机驱动器运行方向
sbit LOCK = P1^7; // 步进电机驱动器待机锁定控制
sbit STEP = P0^6; // 步进电机驱动器步进脉冲
sbit SEL = P0^7; // 读入地址控制
bit bComm; // 接收到一包正确的命令标志
bit bRun; // 电机运行状态,1 = 运行;0 = 停止
unsigned char Addres; // 本机地址
unsigned long lSpeed; // 电机当前速度
unsigned long lPedometer; // 电机当前剩余运行步数
unsigned long lStepPal; // 电机当前坐标步数
unsigned long lEncodPal; // 编码器当前坐标步数
unsigned long lMeteDat; // 测量结果
unsigned int iSpeedMax = 16000; // 步进电机最高转速 = 2*8*200*最高转速
unsigned int iSpeedAcc = 10; // 步进电机加减速系数
unsigned int iSpeedwn; // 完成减速需要的脉冲个数
//unsigned int iSpeedwn = iSpeedMax/iSpeedAcc;// 完成减速需要的脉冲个数
bdata unsigned char MotoState;
sbit bStZoro = MotoState^0; // 零点状态标志
sbit bStDir = MotoState^1; // 方向状态标志
sbit bStRun = MotoState^2; // 运行状态标志
sbit bStEn = MotoState^3; // 加电状态标志
sbit bStLock = MotoState^4; // 保持状态标志
sbit bStOver = MotoState^5; // 超界状态标志
sbit bStMete = MotoState^6; // 测量状态标志
sbit bStBak = MotoState^7; // 状态标志
//****************************************************************************
// 步进电机减速控制函数
// 用于控制步进电机的减速
//****************************************************************************
void SpeedDown(void)
{
if(lSpeed > SPEEDMIN)lSpeed -= iSpeedAcc;
}
//****************************************************************************
// 步进电机加速控制函数
// 用于控制步进电机的加速
//****************************************************************************
void SpeedUp(void)
{
lSpeed += iSpeedAcc;
}
//****************************************************************************
// 步进电机停机控制函数
// 用于控制步进电机的停机
//****************************************************************************
void ShutDown(void)
{
TMR2CN = 0; // 关闭定时器2
bRun = 0; // 清除运行标志
lPedometer = 0; // 清除步进电机剩余运行步数
LOCK = 1; // 进入电机锁定状态
}
//****************************************************************************
// 步进电机运行控制函数
// 用于控制步进电机的驱动及加减速
//****************************************************************************
void TurnMoto(unsigned long lStep,bit bDir)
{
nEN = 0; // 步进电机加电
LOCK = 0; // 进入电机工作状态
bRun = 1; // 置运行标志
TMR2RLH = 0xa0; // 设置计数器
lPedometer = lStep; // 设置步进数
DIR = bDir; // 设置运动方向
TMR2CN = 0x04; // 启动定时器
}
//****************************************************************************
// T2中断函数
// 用于产生步进电机驱动时钟
// 两个中断完成一个步进脉冲
//****************************************************************************
void t2_ISR() interrupt 5
{
unsigned long f;
unsigned t;
TF2H=0; // 清除中断标志
f = SYSCLK/12/lSpeed; // 计算脉冲频率
t = f;
t = 0x10000 - t;
TMR2RLH = t>>8; // 设置计数器
TMR2RLL = t;
lPedometer--; // 当前剩余运行步数-1
STEP = !STEP; // 置步进脉冲
if(DIR)lStepPal++; // 记录步进电机当前坐标
else lStepPal--;
if(lPedometer < iSpeedwn) SpeedDown(); // 如果(剩余脉冲数)小于(完成减速需要的脉冲个数)转减速处理
else if(lSpeed < iSpeedMax) SpeedUp() ; // 如果未达到最高速度转加速处理
}
//****************************************************************************
// T0中断函数
// 用于产生系统时钟
// 时钟 = (22.1184E6/12)/2/(TH0*256+TL0)
//****************************************************************************
unsigned int iTime0; // 软件定时器0,用于接收中断判断包头
unsigned int iTime1; // 软件定时器1
unsigned int iTime2; // 软件定时器2
unsigned int iTime3; // 软件定时器3,用于接收与回应之间的时间控制
void t0_ISR() interrupt 1 // 1mS的时间基准
{
TF0=0;
if(iTime0)
{
iTime0--;
}
if(iTime1)
{
iTime1--;
}
if(iTime2)
{
iTime2--;
}
if(iTime3)
{
iTime3--;
}
bStZoro = nZero; // 处理状态标志
bStEn = nEN;
bStLock = LOCK;
}
//****************************************************************************
// 读本机地址函数
// 返回本机地址
//****************************************************************************
unsigned char ReadAdd(void)
{
unsigned char i,q;
P1 = 0xFF;
SEL = 1;
for(i=0;i<200;i++);
q = P1;
q ^= 0xFF;
q >>= 4;
SEL = 0;
return(q);
}
//****************************************************************************
// 串口中断函数
// 用于接收串口数据
// 波特率
//****************************************************************************
unsigned char BufRev[16],BufTev[16];
unsigned char NBufRev,NBufTev;
unsigned char CntRev,CntTev,Crc;
void uart0_ISR() interrupt 4 // 发送接收
{
if(RI0)
{
if(iTime0==0) NBufRev = 0;
iTime0=30;
RI0= 0;
BufRev[NBufRev] = SBUF0;
if(NBufRev==0) NBufRev++;
else if(NBufRev==1)
{
if(BufRev[NBufRev]==0xe7)
{
NBufRev++;
Crc = 0;
}
else NBufRev = 0;
}
else if(NBufRev > 1)
{
Crc += BufRev[NBufRev];
NBufRev++;
}
else if(NBufRev == 8)
{
if(Crc == BufRev[NBufRev]) bComm = 1;
bComm = 1;
NBufRev = 0;
}
else NBufRev = 0;
iTime3 = 25;
}
if(TI0)
{
TI0 = 0;
if(CntTev)
{
SBUF0 = BufTev[NBufTev];
CntTev--;
}
}
}
//****************************************************************************
// 步进电机回零处理函数
// 用于步进电机发生的回零处理
//****************************************************************************
void StepZero(void)
{
EA = 0;
lStepPal = 0; // 电机当前坐标步数清零
lEncodPal = 0; // 电机当前坐标步数清零
if(!DIR) ShutDown(); // 如果电机反转则停机
EA = 1;
}
//****************************************************************************
// 步进电机解锁命令函数
// 用于步进电机的解锁
//****************************************************************************
void StepUnlock(void)
{
nEN = 1;
LOCK = 1;
}
//****************************************************************************
// 步进电机测量函数
// 用于步进电机的位置测量
// 返回从当前位置回到零点的运行步数
//****************************************************************************
unsigned long StepMeterage(void)
{
unsigned long lq0;
nEN = 0;
LOCK = 0;
while(bRun) if(nZero)
{
EA = 0;
lq0 = MAXSTEP - lStepPal;
lEncodPal = 0; // 电机当前坐标步数清零
if(!DIR) ShutDown(); // 如果电机反转则停机
EA = 1;
}
LOCK = 1;
return(lq0);
}
//****************************************************************************
// 步进电机参数设置函数
// 用于步进电机的最高速度及加减速系数设置
//****************************************************************************
void SetUpDown()
{
unsigned int iq0;
iq0 = BufRev[4];
iq0 <<= 8;
iq0 += BufRev[5];
iSpeedwn = iSpeedMax/iSpeedAcc;
}
//****************************************************************************
// 给430提供:回零、当前坐标、限位保护状态
// 接受430的命令有:到给定的坐标、回零、解锁、测量、加减速设置
//****************************************************************************
void main(void)
{
unsigned char i;
Init_Device();
P0 = 0xFF;
P1 = 0xFF;
iSpeedwn = iSpeedMax/iSpeedAcc;
Addres = ReadAdd();
nRST = 0;
for(i=0;i<200;i++);
SEL = 0;
DIR = 0;
nRST = 1;
nEN = 0;
LOCK = 1;
while(1)
{
TurnMoto(100000, 1);
while(bRun);
TurnMoto(100000, 0);
while(bRun);
continue;
if(bRun)
{
if(nZero) StepZero();
}
else if((bStBak)&&(iTime3==0))
{
bStBak = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -