程序控制的是两个4相步进马达,马达的换相时间控制没有使用硬件定时器。
#include <stdio.h> /*标准输入输出定义*/
#include <string.h>
#include <sys/ioctl.h> /*IO操作定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h> /*文件状态查询定义*/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
#include <netinet/in.h> /*网络接口*/
#include <sys/socket.h> /*网络通讯*/
#include <time.h>
#include <linux/timer.h>
#include <linux/param.h>
//#include <linux/sched.h>
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
#define MOTOR_ADDR 0x8000000
#define FeedStop 0x00 //进纸马达停止位
#define FeedHold 0x01 //进纸马达Hold位
#define FeedRun 0x03
#define CarriageHold 0x03 //字车马达Hold位
#define CarriageStop 0x02 //字车马达停止位
const unsigned char CarriagePhaseTable[4]={0xC0,0x40,0x00,0x80};
const unsigned char FeedPhaseTable[4]={0x08,0x00,0x04,0x0c};
#define NegTime 900
const unsigned int RushTime=6000-NegTime;
const unsigned int HoldTime=8000-NegTime;
const unsigned int FAccTime[14]={
7000-NegTime,3880-NegTime,2980-NegTime,2510-NegTime,
2210-NegTime,2000-NegTime,1840-NegTime,1710-NegTime,
1610-NegTime,1520-NegTime,1450-NegTime,1380-NegTime,
1330-NegTime,1280-NegTime
};
const unsigned int FDecTime[2]={1670-NegTime,2500-NegTime};
const unsigned int FConTime=1250-NegTime;
const unsigned int FLowTime=7000-NegTime;
unsigned int MoveStep; //移动步数
unsigned char SetStep; //设置步数
unsigned char FeedFlag; //进纸标志
unsigned char StepOver; //步数结束的标志
unsigned char Cc_Phase; //当前字车马达相位
unsigned char Cf_Phase; //当前进纸马达相位
static struct timer_list motor_timer;
static void handle_tm_irq(unsigned long);
static void init_motor_timer(struct timer_list *tmlist)
{
init_timer(tmlist);
tmlist->function=(void *)handle_tm_irq;
}
static void release_motor_timer(struct timer_list *tmlist)
{
del_timer(tmlist);
}
static void set_motor_timer(struct timer_list *tmlist, int delay)
{
del_timer(tmlist);
tmlist->expires=jiffies+delay;
add_timer(tmlist);
}
void delay_us(unsigned int usec)
{
struct timeval tv;
tv.tv_sec=0;
tv.tv_usec=usec;
select(0,NULL,NULL,NULL,&tv);
}
void FEED_CR(unsigned char phase)
{
BYTE bData;
bData=(*(volatile unsigned char *)MOTOR_ADDR) & 0x0f;
(*(volatile unsigned char *)MOTOR_ADDR) = (bData | (phase << 4));
}
void CarriageCR(unsigned char phase)
{
(*(volatile unsigned char *)MOTOR_ADDR) = phase;
}
void DecMoveStep(void)
{
if(MoveStep >= 0)
{
MoveStep--;
StepOver = 0;
}
else StepOver = 1;
}
void FeedDecMoveStep(void)
{
unsigned char FeedPressFlag;
MoveStep--;
if(MoveStep==0) StepOver=1;
}
/**************************************************/
//进纸马达停止
/**************************************************/
int Run_FStop(void)
{
FEED_CR(FeedPhaseTable[Cf_Phase] | FeedStop);
return 0;
}
/**************************************************/
//进纸马达Hold
/**************************************************/
int SetFHold_Run(void)
{
delay_us(HoldTime);
FEED_CR(FeedPhaseTable[Cf_Phase] | FeedHold);
return 0;
}
/**************************************************/
//进纸马达RASH
/**************************************************/
int SetFRush_Run(void)
{
delay_us(RushTime);
FEED_CR(FeedPhaseTable[Cf_Phase] | FeedRun);
return 0;
}
void FeedF(void)
{
if(Cf_Phase==3) Cf_Phase=0;
else Cf_Phase++;
FEED_CR(FeedPhaseTable[Cf_Phase] | FeedRun);
}
void FeedB(void)
{
if(Cf_Phase==0) Cf_Phase=3;
else Cf_Phase--;
FEED_CR(FeedPhaseTable[Cf_Phase] | FeedRun);
}
/**************************************************/
//进纸马达加速
/**************************************************/
int SetFAcc_Run(int c)
{
if(c>0)
{
MoveStep=c;
SetStep=c;
}
delay_us(FAccTime[SetStep-MoveStep]);
if(FeedFlag == 1)
FeedF();
else FeedB();
DecMoveStep();
return 0;
}
/**************************************************/
//进纸马达减速
/**************************************************/
int SetFDec_Run(int c)
{
if(c>0)
{
MoveStep=c;
SetStep=c;
}
delay_us(FDecTime[SetStep-MoveStep]);
if(FeedFlag == 1)
FeedF();
else FeedB();
DecMoveStep();
return 0;
}
/**************************************************/
//进纸马达恒速
/**************************************************/
int SetFCon_Run(int c)
{
if (c>0)
{
MoveStep=c;
}
delay_us(FConTime);
if(FeedFlag == 1)
FeedF();
else FeedB();
//DecMoveStep();
FeedDecMoveStep();
return 0;
}
/**************************************************/
//进纸马达低速
/**************************************************/
int SetLowFeed_Run(int c)
{
if (c>0)
{
MoveStep=c;
}
delay_us(FLowTime);
if(FeedFlag == 1)
FeedF();
else FeedB();
DecMoveStep();
return 0;
}
//---------------------------------------------------------------------
//进纸马达控制
//---------------------------------------------------------------------
/********************************************/
// 进纸马达初始化
/********************************************/
void InitialFeed(void)
{
unsigned char i;
SetFHold_Run();
SetFRush_Run();
FeedFlag = 1; //退纸4步
SetLowFeed_Run(4);
for(i=1;i<4;i++)
{
SetLowFeed_Run(0);
}
SetFRush_Run(); //进纸马达进入RUSH
SetFHold_Run();
SetFRush_Run();
FeedFlag = 0; //进纸4步
SetLowFeed_Run(4);
for(i=1;i<4;i++)
{
SetLowFeed_Run(0);
}
SetFRush_Run(); //进纸马达进入RUSH
SetFHold_Run();
Run_FStop();
}
void FeedNStep(int n)
{
unsigned char i;
FeedFlag = 1; //进纸
SetFHold_Run();
SetFRush_Run();
SetLowFeed_Run(n--);
while(n--)
{
SetLowFeed_Run(0);
}
SetFRush_Run(); //进纸马达进入RUSH
SetFHold_Run();
Run_FStop();
}
void BackNStep(int n)
{
unsigned char i;
FeedFlag = 0; //进纸
SetFHold_Run();
SetFRush_Run();
SetLowFeed_Run(n--);
while(n--)
{
SetLowFeed_Run(0);
}
SetFRush_Run(); //进纸马达进入RUSH
SetFHold_Run();
Run_FStop();
}
void LongFeed(int n)
{
unsigned char i;
FeedFlag = 1; //进纸
if(n >= 16)
{ //进纸马达大于24步
SetFHold_Run(); //进纸马达进入HOLD
SetFRush_Run(); //进纸马达进入RUSH
SetFAcc_Run(14); //加速进纸20步
for(i=1; i<14; i++)
{
SetFAcc_Run(0);
}
n-=16;
SetFCon_Run(n--);
while(n-- && StepOver==0)
{
SetFCon_Run(0);
}
SetFDec_Run(2); //一步
SetFDec_Run(0); //2步
SetFRush_Run(); //进纸马达进入RUSH
SetFHold_Run();
Run_FStop();
}
else
{
FeedNStep(n);
}
}
void LongBack(int n)
{
unsigned char i;
FeedFlag = 0; //进纸
if(n >= 16)
{ //进纸马达大于24步
SetFHold_Run(); //进纸马达进入HOLD
SetFRush_Run(); //进纸马达进入RUSH
SetFAcc_Run(14); //加速进纸20步
for(i=1; i<14; i++)
{
SetFAcc_Run(0);
}
n-=16;
SetFCon_Run(n--);
while(n-- && StepOver==0)
{
SetFCon_Run(0);
}
SetFDec_Run(2); //一步
SetFDec_Run(0); //2步
SetFRush_Run(); //进纸马达进入RUSH
SetFHold_Run();
Run_FStop();
}
else
{
BackNStep(n);
}
}
//---------------------------------------------------------------------
int main(void)
{
WORD i=0;
Cf_Phase=2;
InitialFeed();
delay_us(10000);
LongFeed(300);
LongBack(100);
return 0;
}