打印头马达控制代码

本文介绍了一种控制两个4相步进电机的程序设计方法,包括加速、减速、恒速等运动控制逻辑,并实现了进纸和字车马达的具体控制流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序控制的是两个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;	

}

	

	
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值