1、原理
飞拍,也叫高速比较输出,指的是电机运动过程中,当编码器或者脉冲到达指定位置时,运动控制卡自动输出一个脉冲信号,触发相机拍照。通过这种方法,实时性可以达到1us以内,而且不受运动速度快慢影响,精度非常高。
如果运动控制卡没有该功能,上位机只能通过查询IO信号变化来确定编码器值,实时性不够,误差较大。
2、具体代码
这里以博派智能的ETH_GAS系列网口运动控制卡为例说明,该运动控制卡有2-16路步进/伺服控制接口,每路接口都有编码器/脉冲/方向/报警/使能等信号,支持自动回零/点位/直线/圆弧插补/PT运动等功能,支持高速硬件捕获、比较输出/飞拍、PSO。高端款PMC系列甚至支持RTCP五轴联动,Delta/Scara/6轴机器人算法。
飞拍/高速比较输出相关函数一览表
|-----------------------|-----------------------|
| API | 说明 |
| MC_CmpPluse | 设置比较器输出IO立即输出指定电平或者脉冲 |
| MC_CmpBufSetChannel | 设置比较缓冲区对应输出通道 |
| MC_CmpBufData | 向比较器缓冲区发送比较数据 |
| MC_CmpBufSts | 获取比较器缓冲区状态 |
| MC_CmpBufStop | 停止比较器缓冲区 |
| MC_CmpRpt | 设置比较器缓冲区等比输出 |
| MC_CmpSetTriggerCount | 设置比较器缓冲区触发计数初值 |
| MC_CmpGetTriggerCount | 获取比较器缓冲区触发计数初值 |
参数详细说明:
|-----------------|---------------------------------------------------------------|
| int MC_CmpPluse(short nChannelMask, short nPluseType1, short nPluseType2, short nTime1,short nTime2, short nTimeFlag1, short nTimeFlag2) ||
| nChannel | bit0表示通道1,bit1表示通道2 |
| nPluseType1 | 通道1输出类型,0低电平1高电平2脉冲 |
| nPluseType2 | 通道2输出类型,0低电平1高电平2脉冲 |
| nTime1 | 通道1脉冲持续时间 |
| nTime2 | 通道2脉冲持续时间 |
| nTimeFlag1 | 比较器1的脉冲时间单位,0:us,1:ms |
| nTimeFlag2 | 比较器2的脉冲时间单位,0:us,1:ms |
| int MC_CmpBufSetChannel(short nBuf1ChannelNum,short nBuf2ChannelNum); ||
| nBuf1ChannelNum | 比较缓冲区1对应输出通道号,默认为通道1,可设置为1或者2 |
| nBuf2ChannelNum | 比较缓冲区2对应输出通道号,默认为通道2,可设置为1或者2 |
| int MC_CmpBufData(short nCmpEncodeNum, short nPluseType, short nStartLevel, short nTime, long *pBuf1, short nBufLen1, long *pBuf2, short nBufLen2,short nAbsPosFlag=0) ||
| nCmpEncodeNum | 轴号 |
| nPluseType | 2 表示输出脉冲,1表示反转电平。 |
| nStartLevel | 按位设置比较器输出的初始电平,bit0比较器11,bit1比较器2; 0:表示初始为低电平; 1:表示初始为高电平 |
| nTime | 输出脉冲时,该参数用来设定脉冲输出宽度,取值范围:[1, 65535],单位:us,输出电平时,该参数无效 |
| pBuf1 | 比较器1数据缓冲区,位置值为相对当前位置的距离 |
| nBufLen1 | 比较器1数据缓冲区长度,0~128 |
| pBuf2 | 比较器2数据缓冲区,位置值为相对当前位置的距离 |
| nBufLen2 | 比较器2数据缓冲区长度,0~128 |
| nAbsPosFlag | 0:相对当前位置1:绝对位置 |
| int MC_CmpBufSts(short *pStatus,unsigned short *pCount1,unsigned short *pCount2) ||
| pStatus | 按位指示比较器状态bit0代表比较器1,bit1代表比较器2 0代表板卡比较缓冲区数据已空,1代表板卡比较缓冲区数据未完成 |
| pCount1 | 比较器1板卡缓冲区剩余待比较数据 |
| pCount2 | 比较器2板卡缓冲区剩余待比较数据 |
| int MC_CmpBufStop(short nChannel) ||
| nChannel | bit0代表通道1,bit1代表通道2 |
| int MC_CmpRpt(short nCmpEncodeNum,short nChannel,long lStartPos, long lRptTime, long lInterval, short nTime,short nPluseType,short nAbsPosFlag) ||
| nCmpEncodeNum | 编码器通道 |
| nChannel | bit0代表比较缓冲区1,bit1代表比较缓冲区2 |
| lStartPos | 起始位置,单位:脉冲 |
| lRptTime | 重复次数 |
| lInterval | 位置间隔,单位:脉冲 |
| nTime | 脉冲输出时,脉冲持续时间,单位us |
| nPluseType | 通道输出类型,0低电平1高电平2脉冲 |
| nAbsPosFlag | 0:相对当前位置1:绝对位置 |
| int MC_CmpSetTriggerCount(unsigned long lTriggerCount1,unsigned long lTriggerCount2) ||
| lTriggerCount1 | 比较器1触发计数初值 |
| lTriggerCount2 | 比较器2触发计数初值 |
| int MC_CmpGetTriggerCount(unsigned long* plTriggerCount1,unsigned long* plTriggerCount2) ||
| plTriggerCount1 | 比较器1触发计数值 |
| plTriggerCount2 | 比较器2触发计数值 |
例程代码:
int iRes = 0;
//下面代码控制比较输出端口输出高电平(手动测试用)。
//第1个参数为1代表通道1
//第2个参数为1,代表立即输出高电平
//第3个参数预留,固定为1,无意义
//第4个参数代表脉冲时间,这里因为是输出高电平,并非脉冲,所以无意义
//第5个参数为预留,跟第4个参数相同即可
//第6个参数为时间单位,0代表微秒,1代表毫秒(这里因为是输出高电平,所以参数6无意义)
//第7个参数为预留,与第6个参数相同即可
iRes = MC_CmpPluse(1,1,1,100,100,0,0);
//下面代码控制比较输出端口输出低电平(手动测试用)。
//第1个参数为1代表通道1
//第2个参数为0,代表立即输出低电平
//第3个参数预留,固定为1,无意义
//第4个参数代表脉冲时间,这里因为是输出高电平,并非脉冲,所以无意义
//第5个参数为预留,跟第4个参数相同即可
//第6个参数为时间单位,0代表微秒,1代表毫秒(这里因为是输出高电平,所以参数6无意义)
//第7个参数为预留,与第6个参数相同即可
iRes = MC_CmpPluse(1,0,1,100,100,0,0);
//下面代码控制比较输出端口输出一个200ms的脉冲(手动测试用)。
//第1个参数为1代表通道1
//第2个参数为0,代表立即输出低电平
//第3个参数预留,固定为1,无意义
//第4个参数代表脉冲时间,这里因为是输出高电平,并非脉冲,所以无意义
//第5个参数为预留,跟第4个参数相同即可
//第6个参数为时间单位,0代表微秒,1代表毫秒
//第7个参数为预留,与第6个参数相同即可
iRes = MC_CmpPluse(1,2,1,200,200,1,1);
//下面代码控制比较输出端口1在相对轴3当前位置为10000、20000、30000、40000、50000时分表输出一个持续时间为10ms的脉冲(自动流程用)。
int iRes = 0;
//定义一个长度为5的数组,存储待比较数据点,如果只有一个位置要比较,就把数组长度设为1
long lBufData[5] = {10000,20000,30000,40000,50000};
//第1个参数为3代表使用轴3的编码器位置进行比较
//第2个参数为2代表输出类型为脉冲(1代表反转电平,2代表脉冲)
//第3个参数为0代表初始电平为低电平(1代表初始电平为高电平)
//第4个参数为10代表脉冲持续时间为10微秒或者10毫秒(取决于最后一个参数)
//第5个参数代表待比较数据点存放指针
//第6个参数为5代表待比较数据长度为5个数据点
//第7个参数固定为NULL
//第8个参数固定为0
//第9个参数为0代表坐标点为相对坐标(1代表绝对坐标)
//第10个参数为1代表时间单位为毫秒(0代表时间单位为微秒)
iRes = MC_CmpBufData(3,2,0,10,&lBufData[0],5,NULL,0,0,1);
博派智能ETH_GAS系列4轴运动控制卡接线示意图(8轴和16轴篇幅限制没有放上来)

博派智能ETH_GAS系列4轴运动控制卡应用示意图(8轴和16轴篇幅限制没有放上来)
