文章目录
前言
HMC80x3A、HMC80x5A系列产品是恒凯科技经过长年研发,使用纯基本数字逻辑(或非门等)搭建起来的多轴运动控制产品,相对于其他运动控制芯片使用复杂的 ARM\DSP等CPU结构,HMC80x3A、HMC80x5A 系列产品结构更简单,可以非常方便的集成到 FPGA 芯片内或制成独立的大规模CMOS芯片。
HMC8045A控制四个运动轴,每轴可独立运行回原点、低速连续、高速连续(该模式可以调速)、直线加减速或者S型加减速运动,任意2-4轴直线插补运动,任意两轴之间圆弧插补,可以循环画圆动作,插补的一个轴实现高速高精度正弦波与余弦波运动, 多芯片之间可以同步启动或停止,实现多芯片之间多轴直线插补。每轴带独立的24位逻辑位置计数器,独立的24位正交编码器计数器。通用8位地址总线+8 位数据总线+读写控制线访问接口,C51、AVR、MSP430、STM32等各种系列单片机都可以简单通过 IO口即可访问运动控制芯片内部寄存器,只需简短的单片机控制指令即可实现复杂的直线、S 加减速运动、直线插补运动。
主要应用范围:自动化控制 智能制造 运动过程控制 小型桌面机器人控制。
第一章 绪论
1.1运动控制的背景及意义
运动控制起源于早期的伺服控制。简单地说,运动控制就是对机械运动部件的位置、速度等进行实时的控制管理,使其按照预期的运动轨迹和规定的运动参数进行运动。早期的运动控制技术主要是伴随着数控技术、机器人技术和工厂自动化技术的发展而发展的。早期的运动控制器实际上是可以独立运行的专用的控制器,往往无需另外的处理器和操作系统支持,可以独立完成运动控制功能、工艺技术要求的其他功能和人机交互功能。这类控制器可以成为独立运行的运动控制器。这类控制器主要针对专门的数控机械和其他自动化设备而设计,往往已根据应用行业的工艺要求设计了相关的功能,用户只需要按照其协议要求编写应用加工代码文件,利用RS232或者DNC方式传输到控制器,控制器即可完成相关的动作。这类控制器往往不能离开其特定的工艺要求而跨行业应用,控制器的开放性仅仅依赖于控制器的加工代码协议,用户不能根据应用要求而重组自己的运动控制系统。
第二章 准备资料
2.1主控模块— HMC8045A运动控制芯片
HMC8045A 控制四个运动轴,每轴带独立的24位逻辑位置计数器,独立的24位正交编码器计数器。同时拥有通用8位地址总线+8位数据总线+读写控制线访问接口。C51、AVR、MSP430、STM32等各种系列单片机都可以简单通过 IO 口即可访问运动控制芯片内部寄存器,只需简短的单片机控制指令即可实现复杂的直线、S加减速运动、直线插补运动。
2.1.1核心板引脚定义
2.1.2 框图:
2.1.3与CPU接口
2.1.4 读写时序
2.2开发环境—MDK5
MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。MDK5 向后兼容 MDK4 和 MDK3 等,以前的项目同样可以在 MDK5 上进行开发(但是头文件方面得全部自己添加), MDK5同时加强了针对 Cortex-M 微控制器开发的支持,并且对传统的开发模式和界面进行升级, MDK5 由两个部分组成: MDK Core 和 Software Packs。其中,Software Packs 可以独立于工具链进行新芯片支持和中间库的升级。其次,Keil C51支持C语言编程,相对于汇编语言编程,C语言编程在编写的难易程度上、可读性、可维护性上有明显无与伦比的优势,因此受到广大编程爱好者的喜爱。最后,Keil uVision5支持window系统大部分版本,有很强的移植性。如图为Keil uVision5的部分截图:
2.3 STM32F最小系统+按键电路
STM32F系列属于中低端的32位ARM微控制器,该系列芯片是意法半导体(ST)公司出品,其内核是Cortex-M3。该系列芯片按片内Flash的大小可分为三大类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。芯片集成定时器Timer,CAN,ADC,SPI,I2C,USB,UART等多种外设功能。
2.4 通用API功能函数
为了方便客户能简单的使用HMC8045A 运动控制芯片,我们提供了一系列的API功能函数。通用功能函数是在调用前面部分的接口函数实现的具体的运动功能操作, 一般不需要修改,也可以根据需要修改源码,调整功能。API功能函数包里已经包含常用的一些如控制某个运动轴做定长运动的DeltMov函数、控制任意两轴做定长直线插补运动的AXIS_Interpolation2等等。
第三章 移植API
如何设计一个完善的控制系统?本章将会对此作出详细介绍。
3.1 I/O
3.2 API函数功能简介
0) HMC_IO_init()------初始化HMC8045芯片所连接的单片机引脚,改函数需要根据用户实际接入单片机的引脚进行修改;示例:
void HMC_IO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13+GPIO_Pin_14+GPIO_Pin_15; //cs rd wr读写控制总线
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0x00ff; //addr 地址总线
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//地址总线一直是输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0x00ff; //data 数据总线
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //默认输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
1)HMC_outpb() ------------- 8位字节写函数,改函数需要根据用户实际接入单片机的引脚并结合HMC8045的读写时序进行修改,示例:
int HMC_outpb(int Device_Number,unsigned char address,unsigned char out_port)
{
/*
Device_Number 参数为片选,如果有多片芯片,自行添加片选程序
*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_WriteBit(GPIOB, GPIO_Pin_13, 1);//cs 1 片选线高电平
GPIO_WriteBit(GPIOB, GPIO_Pin_14, 1);//rd 1 读控制线高电平
GPIO_WriteBit(GPIOB, GPIO_Pin_15, 1);//wr 1 写控制线高电平
GPIO_WriteBit(GPIOB, GPIO_Pin_13, 0);//cs 0 片选线拉低
GPIO_InitStructure.GPIO_Pin = 0x00ff; //data out 数据总线由默认的输入模式改为输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_Write(GPIOD, address); //地址写出
GPIO_Write(GPIOE, out_port);//数据写出
GPIO_WriteBit(GPIOB, GPIO_Pin_15, 0);//wr 0 写控制线拉低
GPIO_WriteBit(GPIOB, GPIO_Pin_15, 1);//wr 1 写控制线拉高
GPIO_WriteBit(GPIOB, GPIO_Pin_13, 1);//cs 1 片选线拉高 结束
GPIO_InitStructure.GPIO_Pin = 0x00ff; //data in 数据总线改为默认的输入模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
return 0;
}
2)HMC_outpw()------------- 16位字节写函数,改函数需要根据用户实际接入单片机的引脚并结合HMC8045的读写时序进行修改,示例可以参考资料源码
3)HMC_outpLw()------------- 32位字节写函数,改函数需要根据用户实际接入单片机的引脚并结合HMC8045的读写时序进行修改,示例可以参考资料源码
4)HMC_inpb() ------------- 8位字节读函数,改函数需要根据用户实际接入单片机的引脚并结合HMC8045的读写时序进行修改,示例可以参考资料源码
5)HMC_inpw()------------ 16位字节读函数,改函数需要根据用户实际接入单片机的引脚并结合HMC8045的读写时序进行修改,示例可以参考资料源码
6)HMC_inpLw()------------ 32位字节读函数,改函数需要根据用户实际接入单片机的引脚并结合HMC8045的读写时序进行修改,示例可以参考资料源码
7)Set_Axs()------------使能某个运动轴
8)Read_Position()------------读取某个运动轴的逻辑位置与状态
9)Circular_Reset()------------复位圆弧插补设置
10)AxsStop()------------强制停止某个运动轴输出
11)DeltMov()------------控制某个运动轴做定长运动
12)FL_ContinueMov()----------控制某个运动轴做低速连续运动
13)FH_ContinueMov()----------控制某个运动轴做高速连续运动
14)AXIS_Interpolation2()----------控制任意两轴做定长直线插补运动
15)AXIS_Interpolation3()----------控制任意三轴做定长直线插补运动
16)Set_Encorder()----------设定编码器工作模式
17)Read_Encorder()----------读取编码器计数器值
3.3 各个运动功能移植教程
3.3.1 直线定长运动
int DeltMov(int dev,unsigned int Axs,unsigned int curve,unsigned int Dir,unsigned char Outmod,unsigned int Vo,unsigned int Vt,unsigned int Length,unsigned int StartDec,unsigned int Acctime,unsigned int Dectime,unsigned int SD_EN,unsigned int WaitSYNC)
【函数功能】curve为曲线类型、Vo为初始速度、Vt为运行速度、加速率 RACC、减速率 RDEC、减速点位置 RDP、运行长度 RMV启动定长运动模式,系统将从初始速度启动按直线或者S型曲线加速到高速运行速度, 以运行速度运行到输出脉冲个数大于等于减速点位置时开始减速,减速到初始速度,如果输出脉冲等于指定运行长度Length时停止运动。
1)Dev:32位有符号整型参数,设备号,第一个设备号为0, 后一个设备后加1。
2)Axs:32位无符号整型数据,指定要操作的运动轴号, 0为X运动轴,1 为Y运动轴,2为 Z 运动轴,3为U运动轴。
3)curve:32位无符号整型数据,选择加减速曲线类型, 0—直线加减速, 1—S 曲线加减速
4)Dir:32位无符号整型数据。指定运动方向,0为正向运动,1为负向运动。
5)Outmod:32位无符号整型数据。指定脉冲输出规格,参考2-5-1说明。
6)Vo:32位无符号整型数据。设定初始速度,单位是脉冲/秒,即PPS,可以设定范围 0.1PPS—9.8MPPS。
7)Vt:32位无符号整型数据。设定运行速度,应当大于初始速度,单位是脉冲/秒,即PPS,可以设定范围 0.1PPS—9.8MPPS。
8)Length: 32位无符号整型数据。设定运动距离,即脉冲个数,范围 0x000001—0xffffffff,如果运动距离较小时,系统将自动降低运行速度,防止三角运动。
9)StartDec:32位无符号整型数据。设定开始减速位置,范围 0—Length,当设定为 0,则系统自动设定减速位置,并且函数返回值将返回改位置值;当设定不为0,当系统加速完成后,运行距离大于等于设定减速位置开始减速, 如果设定的位置值小于系统自动设定的值,则减速完成后继续以低速运行一段距离才完成运动距离并停止,如果设定位置大于系统自动设定的值,则减速未达到初始速度即已经完成运动距离,并停止运行。
10)Acctime:32位无符号整型数据。设定加速时间,单位mS,范围1—10000。
11)Dectime:32位无符号整型数据。设定减速时间,单位 mS,范围1—10000
12)SD_EN: 32 位无符号整型数据。设定手动输入信号SD有效时是否减速到低速运行,0—不减速,1—减速。
13)WaitSYNC: 32 位无符号整型数据。设定立即启动或者等待同步信号CSTA有效后再启动, 0—立即启动该轴,1—仅仅设定该轴参数,不启动,当同步信号CSTA有效后启动,注意使用该同步功能时,必须初始化设置该轴时使能 CSTA 触发有效。
函数返回值:正常返回减速位置值,大于0;
如果返回值为-1,则系统出现通信失败,需要先关闭设备再次重新打开设备;
如果返回值是-2,则表示产生了三角运动,但是正常输出。
当实际设置寄存器时,首先应当确定运动距离 RMV,根据实际情况选择直线加减速运动模式或者S曲线加减速运动模式,确定初始运行Vo和运行速度Vt,根据最高运行速度计算时钟分频系数RDIV, 然后由RVo、RVt、RDIV的值计算出RACC和RDEC的值来达到预期的加速时间和减速时间,最后计算出RDP的位置。
初始速度 Vo[pps]=RVo× 基准时钟频率/(RDIV+1) /65536; 基准时钟频率默认为 19.6608MHz.
运行速度 Vt[pps]=RVt× 基准时钟频率/(RDIV+1) /65536; 基准时钟频率默认为 19.6608MHz.
直线加减速运动模式:
加速时间[s]=(RVt-RVo) × (RACC+1) /基准时钟频率; 基准时钟频率默认为 19.6608MHz
减速时间[s]=(RVt-RVo) × (RDEC+1) /基准时钟频率; 基准时钟频率默认为 19.6608MHz
S曲线加减速运动模式:
加速时间[s]=(RVt-RVo) × (RACC+1) × 2/基准时钟频率; 基准时钟频率默认为 19.6608MHz
减速时间[s]=(RVt-RVo) × (RDEC+1) × 2/基准时钟频率; 基准时钟频率默认为 19.6608MHz
当以高速运行速度过程中如果SD信号由OFF->ON状态转换,并且启动了SD手动减速使能,则立即启动减速过程,减速到低速运行模式,直到运行完指定长度或者遇到极限位置停止。
另外每轴各自独立带以下配置寄存器。其中X 轴配置寄存器起始地址为20(十进制);Y轴配置寄存器起始地址为50(十进制);Z轴配置寄存器起始地址为80(十进制);U轴配置寄存器起始地址为110(十进制);每轴寄存器排列顺序一致,因此重复设置各轴寄存器时,只需改变偏移地址,重复写入即可。
直线加速:当系统启动时,系统将从初始速度启动,以恒定的加速度使系统加速到运行速度。当系统的速度到达运行速度时,加速度突然为零,此时电机带有很大的惯性使得机械结构不免产生强烈的碰撞。
S曲线加速:当系统启动时,系统将从初始速度启动,以非恒定的加速度(先越来越大,然后恒定,当要达到运行速度时,加速度越来越小,直至为零)使系统加速到运行速度。此时电机很好的消除了加速度带来的惯性,使得机械结构不会产生强烈的碰撞,以至于损坏结构。
【操作步骤】
1)延时200-300ms(由于HMC8045A 是使用纯基本数字逻辑(或非门等)搭建起来的多轴运动控制产品,所以需要短暂的时间去复位)
2)运动控制芯片初始化【HMC_IO_init()】
3)使能某个运动轴【如Set_Axs(0,2,1,1,1,1)----------(第一个设备,Z 运动轴,使能该轴,允许CSTA启动该轴,允许CSTP停止该轴,允许 CSD 减速该轴)】
4)发送控制指令使某个运动轴做定长运动【DeltMov(0,2,1,0,0,1000,2000,6000,0,40,20,0,0)---------(第一个设备,Z 运动轴,S曲线加减速,正向运动,初始速度1000,运行速度2000,发送脉冲个数6000,自动设定减速位置,加速时间40mS,减速时间20mS,手动输入信号SD有效时不减速到低速运行,立即启动该轴)】
【例子】
[gpio.c]
#include "gpio.h"
void Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB1,2,4
}
[main.c]
#include "sys.h"
#include "delay.h"
#include "gpio.h"
#include "hmc80x5_api.h"
#define WK_DOW GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) //WK_DOW按键K3
#define WK_DOW1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2) //WK_DOW1按键K4
#define WK_DOWP2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4) //WK_DOWP2按键K5
int main(void)
{
int flage=0;
delay_init(); //延时函数初始化
Gpio_Init();
delay_ms(250);
HMC_IO_init(); // 运动控制芯片接口初始化
Set_Axs(0,2,1,1,1,1);
while(1)
{
if(WK_DOW==0)flage=1; //K3
if(WK_DOW1==0)flage=2; //K4
if(WK_DOWP2==0)flage=3; //K5
switch (flage)
{
case 1:
DeltMov(0,2,1,0,0,100,1000,10000,0,50,50,0,0);
break;
case 2:
AxsStop(0,2);
break;
case 3:
DeltMov(0,2,1,1,0,100,1000,10000,0,50,50,0,0);
break;
default:
break;
}flage=0;
}
}
3.3.2 低、高速连续运行
低速连续运行
Int FL_ContinueMov(int dev,unsigned int Axs,unsigned int Dir,unsigned char Outmod,unsigned int Vo,unsigned int Vt)
【函数功能】以设定的初始速度 Vo 连续运行,直到调用软件写入AxsStop函数时停止运行,或者运行到极限位置停止。
1)Dev: 32位有符号整型参数,设备号,第一个设备号为0,后一个设备后加1。
2)Axs: 32位无符号整型数据,指定要操作的运动轴号,0为X运动轴,1为Y运动轴,2为Z 运动轴,3为U运动轴。
3)Dir: 32位无符号整型数据。 指定运动方向, 0 为正向运动, 1 为负向运动。
4)Outmod: 32位无符号整型数据。 指定脉冲输出规格, 参考 2-5-1 说明
5)Vo: 32位无符号整型数据。设定初始速度,单位是脉冲/秒,PPS,可以设定范围 0.1PPS—9.8MPPS。
6)Vt: 32位无符号整型数据。设定运行速度,应当大于初始速度,单位是脉冲/秒,即PPS,可以设定范围0.1PPS—9.8MPPS。
函数返回值: 0 操作成功
-1 操作失败
高速连续运行
int FH_ContinueMov(int dev,unsigned int Axs,unsigned int Dir,unsigned char Outmod,unsigned int Vo,unsigned int Vt,unsigned int SD_EN)
【函数功能】以设定的运行速度Vt连续运行,直到写入停止位STOP停止运行,或者运行到极限位置停止;如果过程中SD由OFF->ON状态转换,并且启动了SD手动减速使能,则立即转为以初始速度Vo速度连续运行,直到写入AxsStop函数时停止运行,或者运行到极限位置停止。这个过程中可以随时通过改变 FH 的值来改变运行速度,可以实现连续运转调速功能(特别提示: 调速不能太快, 定速运动不启用加减速过程, 速度差很大时需要分多步调速)。
1)Dev: 32位有符号整型参数,设备号,第一个设备号为0,后一个设备后加1。
2)Axs: 32位无符号整型数据,指定要操作的运动轴号,0为X运动轴,1为Y运动轴,2为Z运动轴,3为U运动轴。
3)Dir: 32位无符号整型数据。指定运动方向,0为正向运动,1为负向运动。
4)Outmod: 32位无符号整型数据。指定脉冲输出规格,参考 2-5-1 说明
5)Vo: 32位无符号整型数据。设定初始速度,单位是脉冲/秒,即 PPS,可以设定范围0.1PPS—9.8MPPS。
6)Vt: 32位无符号整型数据。设定运行速度,应当大于初始速度,单位是脉冲/秒,即PPS,可以设定范围 0.1PPS—9.8MPPS。
7)SD_EN: 32位无符号整型数据。设定手动输入信号SD有效时是否减速到低速运行,0—不减速, 1—减速
函数返回值: 0 操作成功
-1 操作失败。
【操作步骤】
1)延时200-300ms(由于HMC8045A 是使用纯基本数字逻辑(或非门等)搭建起来的多轴运动控制产品,所以需要短暂的时间去复位)
2)运动控制芯片初始化【HMC_IO_init()】
3)使能某个运动轴【如Set_Axs(0,2,1,1,1,1)----------(第一个设备,Z 运动轴,使能该轴,允许 CSTA 启动该轴,允许 CSTP 停止该轴,允许 CSD 减速该轴)】
4)发送控制指令使某个运动轴做连续运动【如FL_ContinueMov(0,2,0,0,1000,2000)---------(第一个设备,Z 运动轴,正向运动,脉冲输出规格,初始速度1000,运行速度2000)】
【FH_ContinueMov(0,2,0,0,2000,4000,1)---------(第一个设备,Z 运动轴,正向运动,脉冲输出规格,初始速度2000,运行速度4000,设定手动输入信号 SD 有效时减速到低速运行)】
【例子】
[gpio.c]
#include "gpio.h"
void Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4; //KEY0-KEY2 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB1,2,4
}
[main.c]
#include "sys.h"
#include "delay.h"
#include "gpio.h"
#include "hmc80x5_api.h"
#define WK_DOW GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) //WK_DOW按键K3
#define WK_DOW1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2) //WK_DOW1按键K4
#define WK_DOWP2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4) //WK_DOWP2按键K5
int main(void)
{
int flage=0;
delay_init(); //延时函数初始化
Gpio_Init();
delay_ms(250);
HMC_IO_init(); // 运动控制芯片接口初始化
Set_Axs(0,2,1,1,1,1);
while(1)
{
if(WK_DOW==0)flage=1; //K3
if(WK_DOW1==0)flage=2; //K4
if(WK_DOWP2==0)flage=3; //K5
switch (flage)
{
case 1:
FL_ContinueMov(0,2,0,0,1000,2000);
break;
case 2:
AxsStop(0,2);
break;
case 3:
FH_ContinueMov(0,2,0,0,2000,4000,1);
break;
default:
break;
}flage=0;
}
}
3.3.3 控制任两轴做定长直线插补运动
int AXIS_Interpolation2(int dev,unsigned int Axs1,unsigned int Axs2,unsigned int curve,unsigned int Dir1,unsigned int Dir2,unsigned char Outmod,unsigned int Vo,unsigned int Vt,unsigned int Length1,unsigned int Length2,unsigned int StartDec, unsigned int Acctime,unsigned int Dectime,unsigned int SD_EN,unsigned int WaitSYNC)
**【函数功能】**指定第dev号设备的Axs1轴和Axs2轴,以curve为加减速类型,以Vo为初速度,以Vt为运行速度。分别使得Axs1轴以Dir1方向输出Length1个脉冲,Axs2轴以Dir2方向输出Length2个脉冲。
1)Dev: 32位有符号整型参数,设备号,第一个设备号为0,后一个设备后加1。
2)Axs1: 32位无符号整型数据,指定要操作的第一个插补轴,0为X运动轴,1为Y运动轴,2为Z运动轴,3为U运动轴。
3)Axs2: 32位无符号整型数据,指定要操作的第二个插补轴,0为X运动轴,1为Y运动轴,2为Z运动轴, 3 为U运动轴。
4)curve: 32位无符号整型数据,选择加减速曲线类型, 0—直线加减速,1—S曲线加减速
5)Dir1: 32位无符号整型数据。指定第一个插补轴运动方向,0为正向运动,1为负向运动。
6)Dir2: 32位无符号整型数据。指定第二个插补轴运动方向,0为正向运动,1为负向运动。
7)Outmod: 32位无符号整型数据。指定脉冲输出规格, 参考 2-5-1 说明。
8)Vo: 32位无符号整型数据。设定初始速度,单位是脉冲/秒, 即 PPS, 可以设定范围 0.1PPS—9.8MPPS。
9)Vt: 32位无符号整型数据。设定运行速度,应当大于初始速度,单位是脉冲/秒,即PPS,可以设定范围 0.1PPS—9.8MPPS。
10)Length1: 32位无符号整型数据。设定第一个插补轴运动距离,即脉冲个数, 范围0x000001—0xffffffff,如果运动距离较小时,系统将自动降低运行速度,防止三角运动。
11)Length2: 32位无符号整型数据。设定第二个插补轴运动距离,即脉冲个数,范围0x000001—0xffffffff,如果运动距离较小时,系统将自动降低运行速度,防止三角运动。
12)StartDec: 32位无符号整型数据。设定开始减速位置,范围0—Length,当设定为0,则系统自动设定减速位置,并且函数返回值将返回改位置值;当设定不为0,当系统加速完成后,运行距离大于等于设定减速位置开始减速,如果设定的位置值小于系统自动设定的值, 则减速完成后继续以低速运行一段距离才完成运动距离并停止,如果设定位置大于系统自动设定的值,则减速未达到初始速度即已经完成运动距离,并停止运行。(特别提示:减速位置按最长轴计算,如果设定为0,系统自动按照最长的轴计算。
13)Acctime: 32位无符号整型数据。设定加速时间,单位mS,范围 1—10000。
14)Dectime: 32位无符号整型数据。设定减速时间,单位mS,范围 1—10000。
15)SD_EN: 32位无符号整型数据。设定手动输入信号SD有效时是否减速到低速运行, 0—不减速, 1—减速。
16)WaitSYNC: 32位无符号整型数据。设定立即启动或者等待同步信号CSTA 有效后再启动,0—立即启动该轴,1—仅仅设定该轴参数,不启动,当同步信号CSTA有效后启动,注意使用该同步功能时,必须初始化设置该轴时使能CSTA触发有效。
函数返回值: 大于0 正常返回减速位置值
-1 系统出现通信失败, 需要先关闭设备再次重新打开设备
-2 表示产生了三角运动, 但是正常输出
【操作步骤】
1)延时200-300ms(由于HMC8045A 是使用纯基本数字逻辑(或非门等)搭建起来的多轴运动控制产品,所以需要短暂的时间去复位)
2)运动控制芯片初始化【HMC_IO_init()】
3)使能某两个运动轴【如Set_Axs(0,0,1,1,1,1);Set_Axs(0,1,1,1,1,1);】
4)发送控制指令使某两个运动轴做直线插补运动【如AXIS_Interpolation2(0,0,1,1,1,1,0,2000,3000,6000,7000,0,50,50,1,0)---------(第一个设备,X运动轴,Y运动轴,S曲线加减速,X运动轴正向运动,Y运动轴正向运动,脉冲输出规格,初始速度2000,运行速度3000,X运动轴输出脉冲个数6000,Y运动轴输出脉冲个数7000,系统自动设定减速位置,加速时间50mS,减速时间50mS,手动输入信号SD有效时减速到低速运行,立即启动)】
【例子】
[gpio.c]
#include "gpio.h"
void Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4; //KEY0-KEY2 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB1,2,4
}
[main.c]
#include "sys.h"
#include "delay.h"
#include "gpio.h"
#include "hmc80x5_api.h"
#define WK_DOW GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) //WK_DOW按键K3
#define WK_DOW1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2) //WK_DOW1按键K4
#define WK_DOWP2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4) //WK_DOWP2按键K5
int main(void)
{
int flage=0;
delay_init(); //延时函数初始化
Gpio_Init();
delay_ms(250);
HMC_IO_init(); // 运动控制芯片接口初始化
Set_Axs(0,0,1,1,1,1);
Set_Axs(0,1,1,1,1,1);
while(1)
{
if(WK_DOW==0)flage=1; //K3
if(WK_DOW1==0)flage=2; //K4
if(WK_DOWP2==0)flage=3; //K5
switch (flage)
{
case 1:
AXIS_Interpolation2(0,0,1,1,1,1,0,2000,3000,6000,7000,0,50,50,1,0); break;
case 2:
AxsStop(0,0); AxsStop(0,1);
break;
case 3:
AXIS_Interpolation2(0,0,1,1,0,0,0,2000,3000,6000,7000,0,50,50,1,0);
break;
default:
break;
}flage=0;
}
}
3.3.4 控制任三轴做定长直线插补运动
int AXIS_Interpolation3(int dev,unsigned int Axs1,unsigned int Axs2,unsigned int Axs3,unsigned int curve,unsigned int Dir1,unsigned int Dir2,unsigned int Dir3, unsigned char Outmod,unsigned int Vo,unsigned int Vt,unsigned int Length1,unsigned int Length2,unsigned int Length3,unsigned int StartDec, unsigned int Acctime,unsigned int Dectime,unsigned int SD_EN,unsigned int WaitSYNC)
【函数功能】指定第dev号设备的Axs1轴和Axs2轴和Axs3轴,以curve为加减速类型,以Vo为初速度,以Vt为运行速度。分别使得Axs1轴以Dir1方向输出Length1个脉冲,Axs2轴以Dir2方向输出Length2个脉冲,Axs3轴以Dir3向输出Length3个脉冲。
1)Dev: 32位有符号整型参数,设备号,第一个设备号为 0,后一个设备后加 1、
2)Axs1: 32位无符号整型数据,指定要操作的第一个插补轴,0为 X 运动轴,1为Y运动轴,2为Z运动轴,3为U运动轴。
3)Axs2: 32位无符号整型数据,指定要操作的第二个插补轴,0 为X运动轴,1为Y运动轴,2为 Z运动轴,3为U运动轴。
4)Axs3: 32位无符号整型数据,指定要操作的第三个插补轴,0为 X 运动轴,1为Y运动轴,2为Z运动轴,3为U运动轴。
5)curve: 32位无符号整型数据,选择加减速曲线类型,0—直线加减速,1—S曲线加减速
6)Dir1: 32位无符号整型数据。指定第一个插补轴运动方向,0为正向运动,1为负向运动。
7)Dir2: 32位无符号整型数据。指定第二个插补轴运动方向,0为正向运动,1为负向运动。
8)Dir3: 32位无符号整型数据。指定第三个插补轴运动方向,0为正向运动,1为负向运动。
9)Outmod: 32位无符号整型数据。指定脉冲输出规格,参考 2-5-1 说明。
10)Vo: 32位无符号整型数据。设定初始速度,单位是脉冲/秒,即 PPS,可以设定范围 0.1PPS—9.8MPPS。
11)Vt: 32位无符号整型数据。设定运行速度,应当大于初始速度,单位是脉冲/秒,即 PPS,可以设定范围0.1PPS—9.8MPPS。
12)Length1: 32位无符号整型数据。设定第一个插补轴运动距离,即脉冲个数,范围0x000001—0xffffffff,如果运动距离较小时,系统将自动降低运行速度,防止三角运动。
13)Length2: 32位无符号整型数据。设定第二个插补轴运动距离,即脉冲个数,范围0x000001—0xffffffff,如果运动距离较小时,系统将自动降低运行速度,防止三角运动。
14)Length3: 32位无符号整型数据。设定第三个插补轴运动距离,即脉冲个数,范围0x000001—0xffffffff,如果运动距离较小时,系统将自动降低运行速度,防止三角运动。
15)StartDec: 32位无符号整型数据。设定开始减速位置,范围 0—Length,当设定为0,则系统自动设定减速位置,并且函数返回值将返回改位置值;当设定不为0,当系统加速完成后,运行距离大于等于设定减速位置开始减速,如果设定的位置值小于系统自动设定的值,则减速完成后继续以低速运行一段距离才完成运动距离并停止,如果设定位置大于系统自动设定的值,则减速未达到初始速度即已经完成运动距离,并停止运行。 (特别提示:减速位置按最长轴计算,如果设定为 0,系统自动按照最长的轴计算最佳减速位置,如果不为 0,用户必须自己按照最长的一个运动轴计算设定减速点位置)。
16)Acctime: 32位无符号整型数据。设定加速时间,单位mS,范围1—10000。
17)Dectime: 32位无符号整型数据。设定减速时间,单位mS,范围1—10000。
18)SD_EN: 32位无符号整型数据。设定手动输入信号SD有效时是否减速到低速运行,0—不减速,1—减速。
19)WaitSYNC: 32位无符号整型数据。设定立即启动或者等待同步信号 CSTA 有效后再启动,0—立即启动该轴,1—仅仅设定该轴参数,不启动,当同步信号CSTA有效后启动,注意使用该同步功能时,必须初始化设置该轴时使能 CSTA 触发有效。
函数返回值:大于0 正常返回减速位置值
-1 系统出现通信失败,需要先关闭设备再次重新打开设备
-2 表示产生了三角运动,但是正常输出
【操作步骤】
1)延时200-300ms(由于HMC8045A 是使用纯基本数字逻辑(或非门等)搭建起来的多轴运动控制产品,所以需要短暂的时间去复位)
2)运动控制芯片初始化【HMC_IO_init()】
3)使能某三个运动轴【如Set_Axs(0,0,1,1,1,1);Set_Axs(0,1,1,1,1,1);Set_Axs(0,2,1,1,1,1);】
4)发送控制指令使某三个运动轴做直线插补运动【如AXIS_Interpolation3(0,0,1,2,0,1,1,1,0,2000,3000,6000,7000,6000,0,50,50,1,0)---------(第一个设备,X运动轴,Y运动轴,Z运动轴,S曲线加减速,X运动轴正向运动,Y运动轴正向运动,脉冲输出规格,初始速度2000,运行速度3000,X运动轴输出脉冲个数6000,Y运动轴输出脉冲个数6000,Z运动轴输出脉冲个数7000,系统自动设定减速位置,加速时间50mS,减速时间50mS,手动输入信号SD有效时减速到低速运行,立即启动)】
【例子】
[gpio.c]
#include "gpio.h"
void Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4; //KEY0-KEY2 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB1,2,4
}
[main.c]
#include "sys.h"
#include "delay.h"
#include "gpio.h"
#include "hmc80x5_api.h"
#define WK_DOW GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) //WK_DOW按键K3
#define WK_DOW1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2) //WK_DOW1按键K4
#define WK_DOWP2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4) //WK_DOWP2按键K5
int main(void)
{
int flage=0;
delay_init(); //延时函数初始化
Gpio_Init();
delay_ms(250);
HMC_IO_init(); // 运动控制芯片接口初始化
Set_Axs(0,0,1,1,1,1);
Set_Axs(0,1,1,1,1,1);
Set_Axs(0,2,1,1,1,1);
while(1)
{
if(WK_DOW==0)flage=1; //K3
if(WK_DOW1==0)flage=2; //K4
if(WK_DOWP2==0)flage=3; //K5
switch (flage)
{
case 1:
AXIS_Interpolation3(0,0,1,2,1,0,0,0,0,2000,3000,6000,7000,6000,0,50,50,1,0); break;
case 2:
AxsStop(0,0);AxsStop(0,1);AxsStop(0,2);
break;
case 3:
AXIS_Interpolation3(0,0,1,2,0,1,1,1,0,2000,3000,6000,7000,6000,0,50,50,1,0);
break;
default:
break;
}flage=0;
}
}
3.3.5 编码器计脉冲数
int Set_Encorder(int dev,int Axs,int mod,int z_reset_en, int z_dir,int set8000,int enable)
【函数功能】设置编码工作模式,并启动或停止编码器计数。
1)Dev: 32位有符号整型参数,子设备号,由系统自动分配,第一个插上电脑的采集设备号为 0,第二个为1,以此类推。
2)Axs: 32位有符号整型参数,选择要设置的计数器,0—对应X轴计数器,1—对应Y轴计数器,2—对应Z轴计数器,3—对应U轴计数器。
3)Mod: 32位有符号整型参数,工作模式,0—不计数器(计数值不清零),1—编码器1x计数模式,2–编码器2x计数模式,3–编码器4x计数模式。
4)z_reset_en: 32位有符号整型参数,编码器Z信号复位使能,0—Z信号出现高电平时计数器不复位,1–Z信号出现高电平时计数器复位为0x00000000或者0x800000,由set8000确定。
5)z_dir: 32位有符号整型参数,设置Z信号复位电平,0—高电平复位,1—低电平复位,如果启用Z线复位功能后,该参数要根据实际编码器的Z输出电平状态来确定。
6)set8000: 32位有符号整型参数,确定Z信号复位时计数器的复位值, 0—复位为0x00000000, 1–复位为0x800000。
7)enable: 3位有符号整型参数,计数器工作使能,0—计数器不工作,并且计数值复位为 0x00000000;1—计数器正常工作。
函数返回值: 0
unsigned long int Read_Encorder(unsigned char dev,unsigned char Axs)
【函数功能】读取第dev号设备的Axs轴的编码器计数器的值。
1)dev:32位有符号整型参数,子设备号,由系统自动分配,第一个插上电脑的采集设备号为0,第二个为1以此类推。
2)Axs:32位有符号整型参数,选择要设置的计数器,0—对应X轴计数器,1—对应Y轴计数器,2—对应Z轴计数器,3—对应U轴计数器。
函数返回值:32 位无符号整型数据,返回要读取的轴的编码器的计数器值。
【操作步骤】
1)延时200-300ms(由于HMC8045A 是使用纯基本数字逻辑(或非门等)搭建起来的多轴运动控制产品,所以需要短暂的时间去复位)
2)运动控制芯片初始化【HMC_IO_init()】
3)使能某个运动轴【如Set_Axs(0,3,1,1,1,1)】
4)禁止使能编码器,使得编码器复位【Set_Encorder(0,3,3,0,0,1,0)------(第一个设备,U 轴计数器,编码器4x计数模式,Z信号出现高电平时计数器不复位,复位为 0x800000,计数器不工作)】
5)使能编码器【Set_Encorder(0,3,3,0,0,1,1)------(第一个设备,U 轴计数器,编码器4x计数模式,Z信号出现高电平时计数器不复位,复位为 0x800000,计数器工作)】
6)发送控制指令使某个运动轴的编码器计数【Read_Encorder(0,3)------(第一个设备,U 轴计数器)】
【例子】
[gpio.c]
#include "gpio.h"
void Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4;//KEY0-KEY2
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB1,2,4
}
[main.c]
#include "sys.h"
#include "delay.h"
#include "gpio.h"
#include "hmc80x5_api.h"
#include "usart.h"
#define WK_DOW GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) //WK_DOW按键K3
#define WK_DOW1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2) //WK_DOW1按键K4
#define WK_DOWP2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4) //WK_DOWP2按键K5
int main(void)
{
int flage,temp=0;
delay_init(); //延时函数初始化
Gpio_Init();
uart_init(115200);
delay_ms(250);
HMC_IO_init(); // 运动控制芯片接口初始化
Set_Axs(0,3,0,0,0,0);
Set_Axs(0,3,1,1,1,1);
Set_Encorder(0,3,3,0,0,1,0);
Set_Encorder(0,3,3,0,0,1,1);
printf("\n U轴初始化\r\n\n");
while(1)
{
if(WK_DOW==0)
{
temp=Read_Encorder(0,3);
printf("\nU轴当前值 = 0x%04X \r\n", temp);
}
}
}
3.3.6 搜索原点
int MovToOrg(int dev,unsigned int Axs,unsigned int Dir,unsigned INT Outmod,unsigned int Speed)
【函数功能】指定某一个运动轴及其运动方向、脉冲输出模式、运动速度开始搜索原点位置。无论正、负方向搜索,当ORG出现低电平时,逻辑位置计数器值置为0x000000,正交编码器计数器则根据自身设定复位到0x000000或 0x800000,运动轴立即停止。
1)Dev: 32位有符号整型参数,设备号,第一个设备号为0,后一个设备后加1。
2)Axs: 32位无符号整型数据,指定要操作的运动轴号,0 为X运动轴,1为Y运动轴,2为Z运动轴,3为U运动轴。
3)Dir: 32位无符号整型数据。指定运动方向,0为正向运动,1为负向运动。
4)Outmod: 32位无符号整型数据。指定脉冲输出规格,参考 2-5-1说明。
5)Speed: 32位无符号整型数据。设定搜索速度,单位是脉冲/秒, 即PPS, 可以设定范围0.1PPS—9.8MPPS,
函数返回值: 0 操作成功
-1 失败
【注意】实际使用时,为了准确搜索原点,并且稳定停止在原点位置,搜索速度应该设定为低速,缓慢搜索原点。
int Read_Position(int dev,unsigned int Axs,unsigned int* Pos,unsigned char* RunState,unsigned char* IOState,unsigned char* CEMG)
【函数功能】同时读取一个运动轴的逻辑位置、运动状态、本轴极限位置状态和公共 CEMG 状态
1)Dev: 32 位有符号整型参数, 设备号, 第一个设备号为 0, 后一个设备后加 1
2)Axs: 32 位无符号整型数据, 指定要操作的运动轴号, 0 为 X 运动轴, 1 为 Y 运动轴, 2 为 Z 运动轴, 3为 U 运动轴。
3)Pos: 32 位无符号整型数据类型指针, 指向一个 32 位无符号整型变量, 用于返回该轴当前逻辑位置。
4)RunState:8 位无符号整型数据类型指针, 指向一个 8 位无符号整型变量, 用于返回该轴当前运动状态。
5)IOState:8 位无符号整型数据类型指针, 指向一个 8 位无符号整型变量, 用于返回该轴各个极限位置的状态, 如果某个极限开关输入低电平则对应数值位为 1, 如果输入为高电平或悬空则对应数值位为 0。
6)CEMG:8 位无符号整型数据类型指针, 指向一个 8 位无符号整型变量, 用于返回公共急停输入 CEMG 状态,0—表示急停输入端正常输入低电平, 所有运动轴可以正常工作; 1—表示急停输入端是高电平或者悬空,所有运动轴停止运行
函数返回值: 0 操作成功
-1 失败
**【注意】**使用Read_Position函数时,必须先定义“unsigned long int Pos;unsigned char RunState;unsigned char IOState;unsigned char SyncIO;”这些变量,以方便后期调用。
【操作步骤】
1)延时200-300ms(由于HMC8045A 是使用纯基本数字逻辑(或非门等)搭建起来的多轴运动控制产品,所以需要短暂的时间去复位)
2)运动控制芯片初始化【HMC_IO_init()】
3)使能某个运动轴【如Set_Axs(0,2,1,1,1,1)】
调用搜索原点原点函数【如MovToOrg(0,2,0,0,500)------(第一个设备,Z 运动轴,正向运动,脉冲输出规格,搜索速度500脉冲/秒)】
4)在步进电机运动期间可以调用读取位置函数查看当前位置【如Read_Position(0, 2,&Pos,&RunState,&IOState,&SyncIO)------(第一个设备,Z 运动轴,当前逻辑位置,当前运动状态,各个极限位置的状态,公共急停输入 CEMG 状态)】
【例子】
[gpio.c]
#include "gpio.h"
void Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4;//KEY0-KEY2
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB1,2,4
}
[main.c]
#include "sys.h"
#include "delay.h"
#include "gpio.h"
#include "hmc80x5_api.h"
#include "usart.h"
#define WK_DOW GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) //WK_DOW按键K3
#define WK_DOW1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2) //WK_DOW1按键K4
#define WK_DOWP2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4) //WK_DOWP2按键K5
int main(void)
{
int flage,t,len,i=0;
unsigned int Pos;unsigned char RunState;unsigned char IOState;unsigned char SyncIO;
uart_init(115200);
delay_init(); //延时函数初始化
Gpio_Init();
delay_ms(250);
HMC_IO_init(); // 运动控制芯片接口初始化
Set_Axs(0,2,1,1,1,1);
printf("\n Z轴初始化\r\n\n");
while(1)
{
if(WK_DOW==0)flage=1; //K3
if(WK_DOW1==0)flage=2; //K4
if(WK_DOWP2==0)flage=3; //K5
switch (flage)
{
case 1:
MovToOrg(0,2,0,0,500);
break;
case 2:
AxsStop(0,2);
break;
case 3:
Read_Position(0,2,&Pos,&RunState,&IOState,&SyncIO);
printf("\nZ轴当前值 = 0x%04X \r\n", Pos);
break;
default:
break;
}flage=0;
}
}