一种基于高精度定时器的多传感器同步信号产生方法 |
|||||||
申请号 | CN202111388780.8 | 申请日 | 2021-11-22 | 公开(公告)号 | CN114047688B | 公开(公告)日 | 2022-11-22 |
申请人 | 河北优控新能源科技有限公司; | 发明人 | 廖明; 李景强; 吴晨晓; 张龙; | ||||
摘要 | 本 发明 提供了一种基于高 精度 定时器 的多 传感器 同步 信号 产生方法,在PPS IN的驱动程序中添加高精度定时器的初始化函数,在初始化函数中设置定时器的中断处理函数;在中断处理函数中设置定时器的开始函数;设置PPS_OUT_HZ和HIGH_TIME两个全局变量;当PPS IN的信号到来时,中断处理函数通过开始函数与高精度计时器实现高电平持续时间和低电平持续时间的计时,并进行高低电平切换,完成一个周期电平变化;循环PPS_OUT_HZ‑1次步骤S5、当时间进行到下一秒,中断处理函数重新启动高精度定时器,重新进行高低电平的循环;或当有PPS IN的信号重新到来时,中断处理函数重新开启新的高精度定时器。本发明在PPS IN的中断处理函数中去开启高精度定时器,防止PPS IN和PPS OUT信号之间的时间误差。 | ||||||
权利要求 | 1.一种基于高精度定时器的多传感器同步信号产生方法,PPS OUT进一步触发外部传感器设备,其特征在于,具体步骤如下: |
||||||
说明书全文 | 一种基于高精度定时器的多传感器同步信号产生方法技术领域背景技术[0002] PPS是pulse per second的缩写,称为秒脉冲。是GPS模组输出的信号用于linux设备的精准授时。 [0003] PPS IN信号指的是linux设备上PPS信号的输入,当设备通过外接GPS模组的GPRMC定位信息和PPS信号精准授时后,PPS IN信号就会和当前linux设备的时间精准吻合。 [0004] PPS OUT信号是linux设备产生的,常用于同步触发设备外部传感器或当做PPS信号,同步其他设备时间。 [0005] 一般情况下,linux设备通过高精度定时器来产生PPS OUT信号,缺点是产生的PPS OUT信号起始时间不确定,和PPS IN信号有误差,当linux设备系统时间改变时,误差也会改 变。如果用来同步触发外部传感器,那么传感器产生的数据信息也会产生时间上的误差,会 对设备产生较大影响。另一个缺点是,因为高精度定时器也有微量误差,当linux设备长时 间运行时,高精度定时器的误差会不断累加,当设备运行一段时间后,PPS OUT信号同步触 发的外部传感器数据会有较大误差。 发明内容[0007] 有鉴于此,本发明旨在提出一种基于高精度定时器的多传感器同步信号产生方法,以解决PPS OUT信号起始时间不确定,造成PPS IN信号有误差,且高精度定时器也有微 量误差,随时间推移误差不断累加,使外部传感器数据产生加大误差。 [0008] 为达到上述目的,本发明的技术方案是这样实现的: [0009] 本申请提出一种基于高精度定时器的多传感器同步信号产生方法,PPS OUT进一步触发外部传感器设备,具体步骤如下: [0010] S1、在PPS IN的驱动程序中添加定时器的初始化函数,在初始化函数中设置定时器的中断处理函数并设置系统时间的变化模式; [0011] S2、在中断处理函数中设置定时器的开始函数,所述开始函数用于立即计时和设定计时时间; [0014] S5、当PPS IN的信号到来时,中断处理函数通过开始函数和定时器配合实现高电平持续时间和低电平持续时间的计时,并进行高低电平切换,完成一个周期电平变化; [0015] S6、循环PPS_OUT_HZ‑1次步骤S5; [0016] S7、当时间进行到下一秒,中断处理函数重新启动定时器,重新进行高低电平切换的循环; [0017] 或当有PPS IN的信号重新到来时,中断处理函数重新开启新的定时器。 [0018] 进一步的,设置系统时间的变化模式为相对系统时间的变化模式。 [0019] 进一步的,步骤S4中,修改PPS_OUT_HZ和HIGH_TIME两个变量方法: [0020] S41、PPS IN的驱动程序生成设备节点/dev/pps0; [0021] S42、应用程序通过open函数打开设备节点/dev/pps0,获取文件描述符调fd; [0022] S43、调用ioctl函数通过文件描述符fd去传递PPS_OUT_HZ和HIGH_TIME全局变量。 [0023] 进一步的,步骤S43中,调用ioctl函数通过文件描述符fd去传递PPS_OUT_HZ和HIGH_TIME全局变量方法为: [0024] S431、ioctl函数设置的参数包括文件描述符fd、标识符cmd、修改\获取变量arg; [0025] S432、设置标识符cmd,所述标识符cmd包括PPSGEN_GPIO_SET_HZ、PPSGEN_GPIO_GET_HZ; [0026] S433、对应不同的标识符cmd,执行不同的arg,当cmd参数为PPSGEN_GPIO_SET_HZ时,arg参数表示设置PPS_OUT_HZ和HIGH_TIME的值,当cmd参数为PPSGEN_GPIO_GET_HZ,arg 参数表示从PPS IN驱动程序中获取当前PPS_OUT_HZ和HIGH_TIME的值。 [0027] 进一步的,步骤S5中,中断处理函数通过开始函数和定时器配合实现高电平持续时间和低电平持续时间的计时,并进行高低电平切换具体方法为: [0028] 当PPS IN的信号到来时,立即响应中断,中断处理函数中将PPS OUT引脚设置为高电平,调用开始函数开始计时,并定时时间为高电平持续时间为HIGH_TIME;当定时器内部 自动计时时间与开始函数设置的高电平持续时间一致时,中断处理函数将PPS OUT引脚高 电平切换为低电平;定时器的中断处理函数通过PPS_OUT_HZ和HIGH_TIME两个变量来计算 控制PPS OUT引脚低电平持续时间,完成一个周期电平变化。 [0029] 进一步的,低电平持续时间计算公式为:1000/PPS_OUT_HZ‑HIGH_TIME。 [0030] 进一步的,所述定时器为高精度定时器,高精度定时器为高分辨率kernel定时器,用于超时或周期性定时器使用,为ns级定时器。 [0032] (1)本发明所述的开始函数保证定时器的起始时间和PPS IN信号的时间保持一致;在PPS IN的中断处理函数中去开启高精度定时器,防止PPS IN和PPS OUT信号之间的时 间误差。 [0034] 构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中: 具体实施方式[0036] 需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。 [0037] 在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对 本发明的限制。此外,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”等的特征可以明示或者隐含地包括一个或者更多个该特征。在本发明的描述中,除非另有说明,“多个” 的含义是两个或两个以上。 [0038] 在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以通过具体情况理解上述术语 在本发明中的具体含义。 [0039] 下面将参考附图并结合实施例来详细说明本发明。 [0040] 如图1所示,本申请提出一种基于高精度定时器的多传感器同步信号产生方法,PPS OUT进一步触发外部传感器设备,具体步骤如下: [0041] S1、在PPS IN的驱动程序中添加定时器的初始化函数,在初始化函数中设置定时器的中断处理函数并设置系统时间的变化模式; [0042] S2、在中断处理函数中设置定时器的开始函数,所述开始函数用于立即计时和设定计时时间; [0043] S3、在PPS IN的驱动程序中添加用于指定PPS OUT的频率PPS_OUT_HZ和用于指定高电平持续时间HIGH_TIME的两个全局变量; [0044] S4、根据外部传感器设备参数修改PPS_OUT_HZ和HIGH_TIME两个变量; [0045] S5、当PPS IN的信号到来时,中断处理函数通过开始函数和定时器配合实现高电平持续时间和低电平持续时间的计时,并进行高低电平切换,完成一个周期电平变化; [0046] S6、循环PPS_OUT_HZ‑1次步骤S5; [0047] S7、当时间进行到下一秒,中断处理函数重新启动定时器,重新进行高低电平切换的循环; [0048] 或当有PPS IN的信号重新到来时,中断处理函数重新开启新的定时器。 [0049] 所述定时器可选用高精度定时器,所述高精度定时器为高分辨率kernel定时器,用于超时或周期性定时器使用,为ns级定时器。 [0050] 步骤S6中,循环PPS_OUT_HZ‑1次步骤S5,是由于PPS_OUT_HZ为PS OUT的频率,即1S内有多少个高低电平周期,因此高低电平周期个数与PPS_OUT_HZ值相同。 [0051] 所述开始函数用于保证高精度定时器的起始时间和PPS IN信号的时间保持一致;PPS OUT的引脚高低电平变化同步触发外部传感器。 [0052] 在PPS IN的GPIO中断处理函数中去开启定时器,防止PPS IN和PPS OUT信号之间的时间误差。 [0053] 每秒在PPS IN的GPIO中断处理函数中去重启开启高精度定时器,防止了设备长时间运行,高精度定时器的误差累加。 [0054] 设置系统时间的变化模式为相对系统时间的变化模式。 [0055] 系统时间变化模式分为绝对系统时间HRTIMER_MODE_ABS和相对系统时间HRTIMER_MODE_REL两种,如果设置为绝对系统时间HRTIMER_MODE_ABS,当系统时间发生变 化时,会对高精度定时器的定时时间产生影响,导致内核崩溃,设置为相对系统时间 HRTIMER_MODE_REL,系统时间改变不会对定时器的高精度定时器产生影响,高精度定时器 可正常运行。 [0056] 步骤S4中,修改PPS_OUT_HZ和HIGH_TIME两个变量方法: [0057] S41、PPS IN的驱动程序生成设备节点/dev/pps0; [0058] S42、应用程序通过open函数打开设备节点/dev/pps0,获取文件描述符调fd; [0059] S43、调用ioctl函数通过文件描述符fd去传递PPS_OUT_HZ和HIGH_TIME全局变量。 [0060] 步骤S43中,调用ioctl函数通过文件描述符fd去传递PPS_OUT_HZ和HIGH_TIME全局变量方法为: [0061] S431、ioctl函数设置的参数包括文件描述符fd、标识符cmd、修改\获取变量arg; [0062] S432、设置标识符cmd,所述标识符cmd包括PPSGEN_GPIO_SET_HZ、PPSGEN_GPIO_GET_HZ; [0063] S433、对应不同的标识符cmd,执行不同的arg,当cmd参数为PPSGEN_GPIO_SET_HZ时,arg参数表示设置PPS_OUT_HZ和HIGH_TIME的值,当cmd参数为PPSGEN_GPIO_GET_HZ,arg 参数表示从PPS IN驱动程序中获取当前PPS_OUT_HZ和HIGH_TIME的值。 [0064] 步骤S5中,中断处理函数通过开始函数与计时器实现高电平持续时间和低电平持续时间的计时,并进行高低电平切换具体方法为: [0065] 当PPS IN的信号到来时,立即响应中断,中断处理函数中将PPS OUT引脚设置为高电平,调用开始函数开始计时,并定时时间为高电平持续时间为HIGH_TIME;当高精度定时 器内部自动计时时间与开始函数设置的高电平持续时间一致时,中断处理函数将PPS OUT 引脚高电平切换为低电平;高精度定时器的中断处理函数通过PPS_OUT_HZ和HIGH_TIME两 个变量来计算控制PPS OUT引脚低电平持续时间,完成一个周期电平变化。 [0066] 低电平持续时间计算公式为:1000/PPS_OUT_HZ‑HIGH_TIME。 [0067] 以摄像头为例,假设linux设备外接2路摄像头,每个摄像头需要20HZ的PPS信号触发摄像头拍照,要求高电平时间为20ms,这种情况下,就可以通过PPS_OUT_HZ和HIGH_TIME 两个变量来设置所需要的的PPS OUT信号,PPS_OUT_HZ为20HZ,HIGH_TIME为20ms。 [0068] 一个持续高电平和一个持续低电平即为一个周期,比如方波。PPS_OUT_HZ变量指的是产生的PPS OUT信号的频率,频率是指在1s时间内有多少个周期,比如PPS_OUT_HZ值为 20HZ,则一个周期时间为1000ms/20=50ms,HIGH_TIME值表示高电平持续时间,比如HIGH_ TIME为20ms,则一个周期表示20ms的高电平时间和30ms的低电平时间,20HZ表示1s内会有 20个周期的信号产生。 [0069] 通过HIGH_TIME的值去操作PPS OUT相关的高低电平。 [0070] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。 |