📄 mcx314aml.c
字号:
//---------- 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 + -