⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcx314aml.c

📁 mcx314 library function
💻 C
📖 第 1 页 / 共 2 页
字号:
//----------  MCX314As 演示程序 -----////      注意://      1. 原点搜索功能( homesrch())被注释了。如果要执行//        取消注释,重新编译。////      2. X,Y轴的DRIVE/DCC输出信号,被模式设定成DCC输出状态,//         不能作为DRIVE状态输出。#include <mes2.h>#include <regdef.h>#define	outpw(port, data) (*(volatile unsigned short *)(port)) = data#define	inpw(port) (*(volatile unsigned short *)(port))// ----- mcx314as 寄存器地址定义 -----#define		adr	0x600000  			// 基地址#define		wr0 	0x0			//命令寄存器#define		wr1 	0x2			//模式寄存器1#define		wr2 	0x4			//模式寄存器2#define		wr3 	0x6			//模式寄存器3#define		wr4 	0x8			//OUTPUT寄存器#define		wr5 	0xa			//插补模式寄存器#define		wr6 	0xc			//低位写数据寄存器#define		wr7 	0xe			//高位写数据寄存器#define		rr0 	0x0			//主状态寄存器#define		rr1 	0x2			//状态寄存器1#define		rr2 	0x4			//状态寄存器2#define		rr3 	0x6			//状态寄存器3#define		rr4 	0x8			//INPUT寄存器1#define		rr5 	0xa			//INPUT寄存器2#define		rr6 	0xc			//低位读数据寄存器#define		rr7 	0xe			//高位读数据寄存器#define		bp1p 	0x4			//BP第1轴+方向数据寄存器#define		bp1m 	0x6			//BP第1轴-方向数据寄存器#define		bp2p 	0x8			//BP第2轴+方向数据寄存器#define		bp2m 	0xa			//BP第2轴-方向数据寄存器#define		bp3p 	0xc			//BP第3轴+方向数据寄存器#define		bp3m 	0xe			//BP第3轴-方向数据寄存器//   wreg1(轴指定,数据) --------------------- 写寄存器1设定void wreg1(int axis,int wdata)	{	outpw(adr+wr0, (axis << 8) + 0xf);	//轴指定	outpw(adr+wr1, wdata);	}//   wreg2(轴指定,数据) --------------------- 写寄存器2设定void wreg2(int axis,int wdata)	{	outpw(adr+wr0, (axis << 8) + 0xf);	//轴指定	outpw(adr+wr2, wdata);	}//   wreg3(轴指定,数据) --------------------- 写寄存器3设定void wreg3(int axis,int wdata)	{	outpw(adr+wr0, (axis << 8) + 0xf);	//轴指定	outpw(adr+wr3, wdata);	}//   command(轴指定,命令码)	--------------- 命令写入void command(int axis,int cmd)	{	outpw(adr+wr0, (axis << 8) + cmd);	}//   range(轴指定,数据) --------------------- range(R)设定void range(int axis,long wdata)	{	outpw(adr+wr7, (wdata >> 16) & 0xffff);	outpw(adr+wr6, wdata & 0xffff);	outpw(adr+wr0, (axis << 8) + 0x00);	}//   acac(轴指定,数据) ---------------------- 加速度増加率(K)设定void acac(int axis,int wdata)	{	outpw(adr+wr6, wdata);	outpw(adr+wr0, (axis << 8) + 0x01);	}//   dcac(轴指定,数据) ---------------------- 减速度増加率(L)设定void dcac(int axis,int wdata)	{	outpw(adr+wr6, wdata);	outpw(adr+wr0, (axis << 8) + 0x0e);	}//   acc(轴指定,数据) ----------------------- 加速度(A)设定void acc(int axis,int wdata)	{	outpw(adr+wr6, wdata);	outpw(adr+wr0, (axis << 8) + 0x02);	}//   dec(轴指定,数据) ----------------------- 减速度(D)设定void dec(int axis,int wdata)	{	outpw(adr+wr6, wdata);	outpw(adr+wr0, (axis << 8) + 0x03);	}//   startv(轴指定,数据) -------------------- 初速度(SV)设定void startv(int axis,int wdata)	{	outpw(adr+wr6, wdata);	outpw(adr+wr0, (axis << 8) + 0x04);	}//   speed(轴指定,数据) --------------------- DRIVE速度(V)设定void speed(int axis,int wdata)	{	outpw(adr+wr6, wdata);	outpw(adr+wr0, (axis << 8) + 0x05);	}//   pulse(轴指定,数据) --------------------- 输出脉冲数/終点(P)设定void pulse(int axis,long wdata)	{	outpw(adr+wr7, (wdata >> 16) & 0xffff);	outpw(adr+wr6, wdata & 0xffff);	outpw(adr+wr0, (axis << 8) + 0x06);	}//   decp(轴指定,数据) ---------------------- 手动减速点(DP)设定void decp(int axis,long wdata)	{	outpw(adr+wr7, (wdata >> 16) & 0xffff);	outpw(adr+wr6, wdata & 0xffff);	outpw(adr+wr0, (axis << 8) + 0x07);	}//   center(轴指定,数据) -------------------- 圆弧中心点(C)设定void center(int axis,long wdata)	{	outpw(adr+wr7, (wdata >> 16) & 0xffff);	outpw(adr+wr6, wdata & 0xffff);	outpw(adr+wr0, (axis << 8) + 0x08);	}//   lp(轴指定,数据) ------------------------ 理论位置计数器(LP)设定void lp(int axis,long wdata)	{	outpw(adr+wr7, (wdata >> 16) & 0xffff);	outpw(adr+wr6, wdata & 0xffff);	outpw(adr+wr0, (axis << 8) + 0x09);	}//   ep(轴指定,数据) ------------------------ 实际位置计数器(EP)设定void ep(int axis,long wdata)	{	outpw(adr+wr7, (wdata >> 16) & 0xffff);	outpw(adr+wr6, wdata & 0xffff);	outpw(adr+wr0, (axis << 8) + 0x0a);	}//   compp(轴指定,数据) --------------------- COMP+(CP)设定void compp(int axis,long wdata)	{	outpw(adr+wr7, (wdata >> 16) & 0xffff);	outpw(adr+wr6, wdata & 0xffff);	outpw(adr+wr0, (axis << 8) + 0x0b);	}//   compm(轴指定,数据) --------------------- COMP-(CM)设定void compm(int axis,long wdata)	{	outpw(adr+wr7, (wdata >> 16) & 0xffff);	outpw(adr+wr6, wdata & 0xffff);	outpw(adr+wr0, (axis << 8) + 0x0c);	}//   accofst(轴指定,数据) ------------------- 加速计数器偏移量(AO)设定void accofst(int axis,long wdata)	{	outpw(adr+wr7, (wdata >> 16) & 0xffff);	outpw(adr+wr6, wdata & 0xffff);	outpw(adr+wr0, (axis << 8) + 0x0d);	}//   hsspeed(轴指定,数据) ------------------- 原点检出速度(HV)设定void hsspeed(int axis,int wdata)	{	outpw(adr+wr6, wdata);	outpw(adr+wr0, (axis << 8) + 0x61);	}//   expmode(轴指定,数据) ------------------- 扩张模式(EM)设定void expmode(int axis,int em6data,int em7data)	{	outpw(adr+wr6, em6data);	outpw(adr+wr7, em7data);	outpw(adr+wr0, (axis << 8) + 0x60);	}//   syncmode(轴指定,数据) ------------------ 同步动作模式(SM)设定void syncmode(int axis,int sm6data,int sm7data)	{	outpw(adr+wr6, sm6data);	outpw(adr+wr7, sm7data);	outpw(adr+wr0, (axis << 8) + 0x64);	}//   readlp(轴指定) --------------------------- 理论位置计数器値(LP)读出long readlp(int axis)	{	long a;long d6;long d7;	outpw(adr+wr0, (axis << 8) + 0x10);	d6 = inpw(adr+rr6);d7 = inpw(adr+rr7);	a = d6 + (d7 << 16);	return(a);	}//   readep(轴指定) --------------------------- 实际位置计数器値(EP)读出long readep(int axis)	{	long a;long d6;long d7;	outpw(adr+wr0, (axis << 8) + 0x11);	d6 = inpw(adr+rr6);d7 = inpw(adr+rr7);	a = d6 + (d7 << 16);	return(a);	}//   waitaxis(轴指定) ----------------------------- 等待DRIVE结束void waitaxis(int axis)	{	while(inpw(adr+rr0) & axis);	}															//   next_wait() ------------------------------ 等待连续插补的次期数据集合void next_wait(void)								{	while((inpw(adr+rr0) & 0x0200) == 0x0);	}//   bp_wait() -------------------------------- 等待BP插补次数据集合void bp_wait(void)									{	while((inpw(adr+rr0) & 0x6000) == 0x6000);	}//   homesrch() ------------------------------- 全轴?原点搜索////      ------ X轴 原点搜索 ---------------------------------//      Step1  -方向20,000pps原点近傍(IN0)信号高速搜索//      Step2  -方向500pps   原点    (IN1)信号低速搜索//      Step3  -方向500pps   Z相    (IN2)信号低速搜索//             Z相检出時、偏差计数器CLEAR输出//      Step4  +方向20,000pps3500脉冲 偏移量高速移动////      ------ Y轴 原点搜索 ---------------------------------//      Step1  -方向20,000pps原点近傍(IN0)信号高速搜索//      Step2  -方向500pps   原点    (IN1)信号低速搜索//      Step3  -方向500pps   Z相    (IN2)信号低速搜索//             Z相检出時、偏差计数器CLEAR输出//      Step4  +方向20,000pps700脉冲 偏移量高速移动////      ------ Z轴 原点搜索 ---------------------------------//      Step1  高速搜索:无//      Step2  +方向400pps   原点    (IN1)信号低速搜索//      Step3  Z相搜索:无//      Step4  -方向400pps20脉冲 偏移量移动////      ------ U轴 原点搜索 ---------------------------------//      Step1  高速搜索:无//      Step2  -方向300pps   原点    (IN1)信号低速搜索//      Step3  Z相搜索:无//      Step4  偏移量移动:无//void homesrch(void)	{						// X,Y轴 原点搜索的参数设定						// (模式设定参照main的初期设定)	speed(0x3,2000);			// Step1,4 高速速度: 20000pps	hsspeed(0x3,50);			// Step2,3 低速速度: 500pps	pulse(0x1,3500);			// X轴偏移量:3500脉冲	pulse(0x2,700);				// Y轴偏移量:700脉冲							// Z轴 原点搜索的参数设定	speed(0x4,40);				// Step4 移动速度:   400pps	hsspeed(0x4,40);			// Step2 搜索速度: 400pps	pulse(0x4,20);				// 偏移量:20脉冲						// U轴 原点搜索的参数设定	hsspeed(0x8,30);			// Step2 搜索速度: 300pps	command(0xf,0x62);			// 全轴 自动原点出し実行	waitaxis(0xf);				// 等待全轴 结束	if(inpw(adr+rr0) & 0x0010)		// 错误表示		{		printf("X-axis Home Search Error \n");		}	if(inpw(adr+rr0) & 0x0020)		{		printf("Y-axis Home Search Error \n");		}	if(inpw(adr+rr0) & 0x0040)		{		printf("Z-axis Home Search Error \n");		}	if(inpw(adr+rr0) & 0x0080)		{		printf("U-axis Home Search Error \n");		}	}		int main(void)	{	int  count;	outpw(adr+wr0, 0x8000);	for(count = 0; count < 2; ++count);	command(0x3,0xf);			//------ X,Y轴 模式设定 ---------	outpw(adr+wr1, 0x0000);			//模式寄存器1                                                //D15~8: 0 所有中断禁止                                                //D7: 0 IN3信号:无效                                                //D6: 0 IN3信号理论:Low动作                                                //D5: 0 IN2信号:无效                                                //D4: 0 IN2信号理论:Low动作                                                //D3: 0 IN1信号:无效                                                //D2: 0 IN1信号理论:Low动作                                                //D1: 0 IN0信号:无效                                                //D0: 0 IN0信号理论:Low动作	outpw(adr+wr2, 0xe000);			//模式寄存器2                                                //D15:1 INPOS输入:有効                                                //D14:1 INPOS输入理论:Hi动作                                                //D13:1 ALARM输入:有効                                                //D12:0 ALARM输入理论:Low动作                                                //D11:0                                                 //D10:0 编码器输入分周:1/1                                                //D9: 0 编码器输入方式:2相脉冲                                                //D8: 0 驱动脉冲方向理论:                                                //D7: 0 驱动脉冲理论:正理论                                                //D6: 0 驱动脉冲方式:2脉冲                                                //D5: 0 COMP対象:理论位置计数器                                                //D4: 0 -极限理论:Low动作                                                //D3: 0 +极限理论:Low动作                                                //D2: 0 极限停止模式:减速停止

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -