<sub id="znbjl"><var id="znbjl"><output id="znbjl"></output></var></sub>
      <sub id="znbjl"><var id="znbjl"><ins id="znbjl"></ins></var></sub>
        <sub id="znbjl"></sub>

      <address id="znbjl"><dfn id="znbjl"></dfn></address>

            <address id="znbjl"><dfn id="znbjl"></dfn></address>

            <thead id="znbjl"><var id="znbjl"><ins id="znbjl"></ins></var></thead>

            空燃比分析仪,horiba尾气分析仪,CAN总线分析仪,CAN数据记录仪

            广州智维电子科技有限公司

            Guangzhou Triv Electronic Technologies Co.LTD

            行业应用
            APPLICATION

            目前位置: 首页 > 行业应用 > Kvaser分析仪

            2022-10-10

            如何使用外部触发器输入和输出引脚作为数字I/O?

            作者:triv    点击:167

            在一些情况下,你可能需要检测数字信号,或者需要在特定状况出现时发送数字信号。这对于可设置为通过外部信号触发的设备是可以做到的。本文分享测试过程。

            本文中提到的功能已在下列产品上进行了测试:


            ?Kvaser Memorator Pro 5xHS  

            ?Kvaser Memorator Pro 2xHS v2   


            ?Kvaser的Windows驱动程序 V5.35

            ?Kvaser CANlib SDK V5.35


            测试前的准备

            图片

            本次测试中,要使用触发器引脚进行测试,使用的是Kvaser Memorator Pro。

            你不需要GPS/Arduino测试板,但信号发生器在测试时非常便捷。如果你想看到不同信号之间的关联,示波器也是很好的选择。


            为什么使用Memorator触发器I/O引脚?

            图片

            在一些情况下,你可能需要检测数字信号,或者需要在特定状况出现时发送数字信号。Memorator不可能取代PLC或高级I/O部件,但在某些情况下,一个数字通道就足够了。


            摘自产品的使用说明

            图片

            Kvaser Memorator Pro 2xHS v2可设置为通过外部信号触发,还可配置为在下降沿和上升沿上触发。


            Kvaser Memorator Pro 2xHS v2可设置为通过外部触发器输出引脚,发送外部脉冲。


            在通道CAN1上有一个触发器输入,在通道CAN2上有一个触发器输出。两者都是5V逻辑,可使用TTL电平。它们的目的是规定当一个特定事件发生时,执行一个具体类型的操作。


            当Kvaser推出 Kvaser DIN Rail SE400S-X10,及其附加??槭?,包括支持在Kvaser Memorator Pro v2设备上处理I/O引脚。我们现在可以直接控制Kvaser Memorator Pro设备上的数字输入和输出。


            可使用CAN1上的触发器输入和CAN2上的触发器输出,作为通过CANLib或t脚本控制的数字I/O。


            在本文中将展示如何进行此操作,以及我们可以通过I/O引脚获得的一些信息。


            将使用Kvaser t脚本演示,但也可以使用CANlib。使用CANLib的步骤与使用t脚本基本相同。



            1.

            信号发生器和测试设置

            为了能够显示数字信号的表现,必须有一个信号发生器以生成数字信号。将使用示波器显示CAN帧和数字信号之间的关系。


            使用一台小型Arduino电脑,它连接到一个GPS??楹鸵桓鯩CP2515??椋–AN控制器)。


            图片

            GPS生成1PPS(每秒1个脉冲)信号[绿线]。该信号连接到Arduino上的一个数字输入和我的示波器。


            每次GPS发送1PPS信号时,Arduino都会产生35毫秒长的脉冲[红线]。此脉冲被发送至Memorator Pro上的触发输入。同时,Arduino向CAN总线[蓝线]发送一个 “0x201 报文”。


            Memorator还可控制CAN2[橙色线]上的触发输出。它连接到Arduino,Arduino有一个内置上拉电阻器。


            所有上述信号都连接到一个差分USB示波器。


            图片


            如图所示,GPS[绿色]使用3.3V逻辑,Arduino生成5V负脉冲[红色]。


            图片


            如果我们仔细观察,会发现当1PPS[绿色]变高时,触发[红色]将在大约16 μs后变低。大约140 μs后,我们可以看到Arduino通过MCP2515发出一个CAN报文[蓝色]。它的ID为0x201 (dec 513)。


            本文没有有列出在Arduino上运行的程序。如有需要,请发送邮件至lgfr@kvaser.com。


            2.

            通过t脚本使用触发引脚

            (你可在附录A –“Test_Memorator_Trigger_V100.t” 中找到t脚本)


            首先,我们需要一些常量和变量:


            variables {

              int status = 0;


              // Memorator Pro

              const int MAX_CHANNELS = 2;

              const int DIGITAL_IN   = 0;

              const int DIGITAL_OUT  = 1;


              CanMessage Test_msg202;

              CanMessage Test_msg203;

            }


            我们定义初始化过程(滑动查看代码):


            on start {

              int ch;

              printf("[START]n");


              Test_msg202.id=0x202;//Dummy msg 202

              Test_msg202.dlc=0;

              Test_msg202.flags=0;

              Test_msg202.data="x11x22x33x44x55x66x77x88";


              Test_msg203.id=0x203;//Dummy msg 203 

              Test_msg203.dlc=1;

              Test_msg203.flags=0;

              Test_msg203.data="x11x22x33x44x55x66x77x88";



              status = kvIoPinSetInfo(0,kvIO_INFO_SET_DI_LOW_HIGH_FILTER,3000);

              status = kvIoPinSetInfo(0,kvIO_INFO_SET_DI_HIGH_LOW_FILTER,3000);


              status = kvIoConfirmConfig();

              if (status != 0) {

            printf("kvIoConfirmConfig failed: %dn", status);

             }

              for (ch=0;ch < MAX_CHANNELS; ch++) {

            canBusOff(ch);

            canSetCommunicationMode(ch, canMODE_CAN);

            canSetBitrate(ch, canBITRATE_250K);

            canSetBusOutputControl(ch, canDRIVER_NORMAL);

            canBusOn(ch);

              }

            }


            不要忘记清理步骤:


            on stop {

              int ch;

              printf("[STOP]n");

              for (ch=0;ch < MAX_CHANNELS; ch++) {

            canBusOff(ch);

              }

            }


            让我们连接Memorator,并为测试总线启动t脚本,看看会发生什么。


            图片


            1PPS[绿色]每秒升高一次,

            Arduino检测到它并降低触发[红色](大约需要35毫秒)。

            Arduino还在CAN总线上发送 “报文201”。


            可以理解,似乎没有什么特别的现象发生,因为我们只让Memorator连接总线,而我们还没做什么。


            但代码中有一行很重要:

            status = kvIoConfirmConfig();


            在调用任何I/O函数之前,必须先调用此行。


            让我们添加一个 ON CANMESSAGE 钩子:


            on CanMessage <0> 0x201 

            {  

            canWrite(Test_msg202);

            }

            图片


            这个钩子的目的是显示Memorator在运行。当它看到一个 “201” 报文时,发送一个 “202” 报文。你可以在上图中看到这是第二个蓝色标记。


            添加一些数字IO:


            on CanMessage <0> 0x201

            {

              status = kvIoPinSetDigital(DIGITAL_OUT, 0);  

              canWrite(Test_msg202);

              status = kvIoPinSetDigital(DIGITAL_OUT, 1);  

            }

            图片


            使用命令“kvIoPinSetDigital(DIGITAL_OUT, 0); ”,我们现在可以控制CAN2通道上的数字输出引脚。在上图中,我们可以看到,当发送 “202” 报文时,CAN2上的数字输出变低。


            添加一个检测触发器的事件:


            on IoEventkvIO_EVENT_FALLING_EDGE {

              status = kvIoPinSetDigital(DIGITAL_OUT, 0);  

              canWrite(1,Test_msg203);

              status = kvIoPinSetDigital(DIGITAL_OUT, 1);  

            }


            这是一个新事件,IoEvent。它可以检测到下降沿。请注意,触发输入始终被定义为激活低电平。


            图片


            每当Memorator检测到一个下降数字输入时,它将发送一个 “203报文”。我还添加了激活数字输出的说明。

            在上图中,我们在约7毫秒后看到 “203报文”。(我已关闭了 “202报文”)。


            7毫秒的响应时间是典型的响应时间吗?


            让我们查看一下。


            Memorator能多快检测到触发器?

            图片


            当测试IoEvent时,很容易看到它在14到21毫秒内检测到触发器。它似乎在以预定义的模式运行。让我们测量一小时内的延迟:


            图片


            在上图中,叠加了一个多小时的测量结果,我们可以看到延迟在3毫秒和11毫米之间均匀分布。


            根据规范,触发脉冲必须为30 毫秒或更长(防抖检查),因此3到11毫秒的延迟时间对于所有正常操作都完全可以。

            3.

            总结


            添加对Memorator的数字I/O通道的读和写支持 (TRIG IN 和 TRIG OUT) 非常简单。我们只需要五个新步骤和一个新钩子:


            kvIoPinSetInfo();

            kvIoGetNumberOfPins();

            kvIoConfirmConfig();

            kvIoPinSetDigital();

            kvIoPinGetDigital();


            在IoEventkvIO_EVENT_FALLING_EDGE

            数字IO的延迟约为3到11毫秒。

            数字IO也可以通过CANlib控制;命令相同,只是CANlib不支持钩子。


            4.

            附录A Test_Trigger_V100.t

            variables {

              int status = 0;


              // Memorator Pro 2xHS

              const int MAX_CHANNELS = 2;

              const int DIGITAL_IN   = 0;

              const int DIGITAL_OUT  = 1;


              CanMessage Test_msg202;

              CanMessage Test_msg203;

            }


            on start {

              int ch;

              printf("[START]n");


              //Dummy msg 202  

              Test_msg202.id=0x202;

              Test_msg202.dlc=0;

              Test_msg202.flags=0;

              Test_msg202.data="x11x22x33x44x55x66x77x88";


              //Dummy msg 203  

              Test_msg203.id=0x203;

              Test_msg203.dlc=0;

              Test_msg203.flags=0;

              Test_msg203.data="x11x22x33x44x55x66x77x88";


              int pinCount = 0;

              status = kvIoGetNumberOfPins(&pinCount);


              status = kvIoPinSetInfo(0,kvIO_INFO_SET_DI_LOW_HIGH_FILTER,3000 );

              status = kvIoPinSetInfo(0,kvIO_INFO_SET_DI_HIGH_LOW_FILTER,3000  );


              status = kvIoConfirmConfig();


              if (status != 0) {

                printf("kvIoConfirmConfig failed: %dn", status);

             }


              for (ch=0;ch < MAX_CHANNELS; ch++) {

                canBusOff(ch);

                canSetCommunicationMode(ch, canMODE_CAN); 

                canSetBitrate(ch, canBITRATE_250K);

                canSetBusOutputControl(ch, canDRIVER_NORMAL);

                canBusOn(ch);

              }


              int value = 0;


              status = kvIoPinGetDigital(DIGITAL_IN, &value);


              status = kvIoPinSetDigital(DIGITAL_OUT, 1);  

            }


            on stop {

              int ch;

              printf("[STOP]n");

              for (ch=0;ch < MAX_CHANNELS; ch++) {

                canBusOff(ch);

              }

              status = kvIoPinSetDigital(DIGITAL_OUT, 1);

              if (status == 0) {

                printf("Restored digital outn");

              } else {

                printf("FAILED: %dn", status);

              }

            }


            on IoEventkvIO_EVENT_FALLING_EDGE

            {

              status = kvIoPinSetDigital(DIGITAL_OUT, 0);  

              canWrite(0,Test_msg203);

              status = kvIoPinSetDigital(DIGITAL_OUT, 1);  

            }

            5.

            附录B GPS信号发生器

            图片

            返回列表

            专业玩彩