3

我正在使用 Pointgrey Firefly MV(准确地说是 FFMV-03M2M/C),并且希望在每次快门启动时触发一些外部设备。根据数据表,该相机支持 IIDC 1.31,还提供四个可用作触发和/或频闪信号输出的 GPIO。如IIDC 标准第 4.11.3 节所述,应该可以使用 IIDC 配置这些选通信号输出。

我的应用程序是用 C++ 实现的,并使用libdc1394来访问和控制相机。到目前为止,一切都很好,但我无法配置频闪信号输出。据我了解 libdc 和 IIDC 应该可以按如下方式启用第一个输出(camera是指向有效的指针dc1394camera_t):

dc1394error_t err;
uint64_t strobe_offset = 0x200;
uint32_t strobe_settings = 0;

err = dc1394_get_strobe_register(camera, strobe_offset, &strobe_settings);
if (err == DC1394_SUCCESS) {
    /* Set bits 6 (strobe on) and 7 (active-high level)
       IIDC uses msb 0, so we need to shift by 25/24 instead of 6/7 */
    strobe_settings = strobe_settings | (1 << 25) | (1 << 24);

    err = dc1394_set_strobe_register(camera, strobe_offset, strobe_settings);

}

if (err != DC1394_SUCCESS) {
    log(LOG_ERROR, "Failed to set strobe.");
}

这不会产生任何错误,但也不会打开频闪信号输出(即使相机正在捕捉帧)。我还通过使用不同的偏移量(0x204、0x208 和 0x20C)尝试了所有其他输出,但无济于事。然后我检查了所有可用性查询字段,Strobe_CTRL_InqStrobe_[0123]_Inq它们都报告存在选通信号输出。但有趣的是,中的On/Off_Inq字段Strobe_[0123]_Inq告诉我无法打开或关闭输出,而Polarity_Inq告诉我可以更改极性设置(实际上我不能,因为您只能在选通信号输出为切换到)。我尝试使用 Pointgrey 提供的基于 Windows 的驱动程序实用程序配置输出,它可以正常工作。

有什么想法我可能做错了吗?或者这台相机在这方面不兼容IIDC?

更新:好的,我尝试了三种启用频闪输出的方法:使用我的原始代码,使用答案中建议的绝对偏移量 0x1300,并使用 PointGrey 寄存器参考手册中所写的偏移量 0x1110/0x1114。我还尝试设置延迟、持续时间和/或方向(即使不要将 PIO 与频闪输出混淆)。到目前为止,还没有寄存器和标志的组合起作用。也许这是 libdc1394 中的一个错误,或者 PointGrey 在他们的专有驱动程序中做了一些其他的魔法。现在我放弃了,将尝试找到一种不同的解决方案来触发外部设备。

4

1 回答 1

2

浏览(可访问,无法获得技术参考)相机文档,您似乎需要为 GPIO 设置方向,即它们是输入还是输出。文档描述了 0x11F8 处的 PIO_DIRECTION 寄存器,其中低有效位控制 IO 是输入 (0) 还是输出 (1)。也许你的问题是方向没有确定?

http://ptgrey.com/support/downloads/documents/TAN2005002_Output_strobe_signal_pulse.pdf

将相机注册图与标准进行比较,似乎相机应该支持这一点。我在 libdc1394 中找不到任何有关 get/set_strobe_register API 的文档。也许 get 或 set_register 使用相机记录的寄存器偏移会更好。您如何将 0x200 视为您的偏移量?

这个http://www.cs.unc.edu/Research/stc/FAQs/Cameras_Lenses/PtGrey/DcamRegisterRefManual.pdf记录了您尝试在 0x1300 访问的寄存器,所以也许有一些固定的已知偏移量适用于访问“strobe “登记?同样,也许使用 set_register 将允许直接访问所有相机寄存器,以便您可以使用记录的旧集。

另一件事是您需要为频闪设置延迟和计数。

于 2011-02-13T00:02:23.757 回答