博派智能-运动控制技术-高速飞拍

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轴篇幅限制没有放上来)

相关推荐
皮卡 | 皮卡 | 丘尊2 小时前
相机相关代码
数码相机
市象2 小时前
风浪越大,影石越稳
科技·数码相机·消费·摄影·数码·影石
天外飞雨2 小时前
基于Scout mini底盘搭载多传感器可运行项目
数码相机
格林威3 小时前
工业相机图像采集处理:从 RAW 数据到 AI 可读图像,附海康相机 C++实战代码
开发语言·c++·人工智能·数码相机·计算机视觉·c#·工业相机
皮卡 | 皮卡 | 丘尊3 小时前
海康相机畸变矫正裁剪
数码相机
轻口味3 小时前
HarmonyOS 6 原生高性能相机框架:GPUImage (libgpuimagelib) 深度架构解析与实战全纪录
数码相机·架构·harmonyos
LittroInno3 小时前
AI 云台相机如何实现 3 公里远距离目标跟踪?从检测到跟踪的技术全解析
人工智能·数码相机·目标跟踪
皮卡 | 皮卡 | 丘尊3 小时前
相机相关问题
数码相机
皮卡 | 皮卡 | 丘尊3 小时前
关于相机和坐标的问题
人工智能·数码相机·计算机视觉