打印头马达控制代码

来源:互联网 发布:淘宝下架什么意思 编辑:程序博客网 时间:2024/04/27 14:25
程序控制的是两个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_ADDR0x8000000#define FeedStop        0x00//进纸马达停止位#define FeedHold        0x01//进纸马达Hold位#define FeedRun0x03#define CarriageHold0x03//字车马达Hold位#define CarriageStop0x02//字车马达停止位const unsigned char CarriagePhaseTable[4]={0xC0,0x40,0x00,0x80};const unsigned char FeedPhaseTable[4]={0x08,0x00,0x04,0x0c};#define NegTime900const 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;}elseStepOver = 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;elseCf_Phase++;FEED_CR(FeedPhaseTable[Cf_Phase] | FeedRun);}void FeedB(void){if(Cf_Phase==0) Cf_Phase=3;elseCf_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();//进纸马达进入RUSHSetFHold_Run();SetFRush_Run();FeedFlag = 0;//进纸4步SetLowFeed_Run(4);for(i=1;i<4;i++){SetLowFeed_Run(0);}SetFRush_Run();//进纸马达进入RUSHSetFHold_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();//进纸马达进入RUSHSetFHold_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();//进纸马达进入RUSHSetFHold_Run();Run_FStop();}void LongFeed(int n){unsigned char i;FeedFlag = 1;//进纸if(n >= 16){//进纸马达大于24步SetFHold_Run();//进纸马达进入HOLD   SetFRush_Run();//进纸马达进入RUSHSetFAcc_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();//进纸马达进入RUSHSetFHold_Run();Run_FStop();}else{FeedNStep(n);}}void LongBack(int n){unsigned char i;FeedFlag = 0;//进纸if(n >= 16){//进纸马达大于24步SetFHold_Run();//进纸马达进入HOLD   SetFRush_Run();//进纸马达进入RUSHSetFAcc_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();//进纸马达进入RUSHSetFHold_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;}
   
原创粉丝点击