实测终端电阻对CAN通信的影响

一、CAN总线简单介绍

CAN 是 Controller Area Network 的缩写(简称为 CAN),是 ISO国际标准化的串行通信协议。

CAN总线特点:

1.多主控制系统柔软性速度快,距离远,支持距离最远可达10km;

2.具有错误检测、错误通知、错误恢复功能、故障封闭功能;

3.连接节点多。

数据传输原理实现

CAN通信只由两根线完成的,一条称为CAN_H(CAN High),一条称为CAN_L(CAN Low),共同构成一组差分信号线。整个过程是以差分信号的形式进行通讯的,即信号的逻辑 0 和逻辑 1 由两根差分信号线的电压差来表示。终端电阻(通常位120欧)为在高速CAN中防止信号反射和振铃现象,以差分信号形式传送,稳定性更好,因为即使环境问题导致CAN_High电压发送变化,则CAN_L也会发送同等变化,两者做差即可抵消由于这个环境引起的变化。

显/隐性电平: 在总线上通常逻辑1表示隐性。而0表示显性。总线上的逻辑0即差分电压差为2V左右(CAN_H=3.5V,CAN_L=1.5V),总线上的逻辑1即差分电压差为0V(CAN_H=2V,CAN_L=2V)。

8cebd8a122c24020baa54f77fc72881f.png

 STM32 中将CAN接口集成在芯片内,使用的时候再外接CAN收发器,常用的有TJA1050和vp230两种芯片。

二、实验验证终端电阻对CAN通信的影响

测试环境:

使用了6个节点的can设备(stm32f103最小系统板),为了便于直观观测每个节点上报情况,将每块小板子ID分别改为0X0001, 0X0002, 0X0003, 0X0004, 0X0005, 0X0006, 每个泄漏检测上报频率是2Hz,其中三个模块中can芯片是vp230,三个模块中can芯片是TJA1050,(vp230是3.3V供电,TJA1050是5V供电)和一根大概六米长的线缆,挂载这六个can子设备,通过can盒观察总线上的上报情况。

890b4b493a274fa59554df4ab89ccc0e.jpg

1.当焊接两个120Ω终端电阻时,回路电阻在60Ω,此时总线上个节点均正常;

883a2b56e6da4c04b52fba227ed92237.png

2.当焊接3个120Ω终端电阻时,回路电阻在40Ω,此时总线上会偶尔有一个或两个节点不上传信息,有可能过段时间会继续上传,或者下电再次上电的情况下,或许能够正常通信;

6097abaedeb047e8bbe03cced9b8be79.png

3.当焊接4、5个120Ω终端电阻时,回路电阻在30Ω和24Ω,同现象2,但问题出现的更频繁;

d0a2720377414f7e8122f21db995ba31.jpg

42ed8cc823654ad7a7fd3969993fab72.png

4.当焊接6个120Ω终端电阻时,回路电阻在20Ω,会有1-3个节点不再上传信息,此时下电再次重新上电,依旧存在部分节点不能正常通信;

5.当焊接7个120Ω终端电阻时(CAN盒上的终端电阻拨下),回路电阻在17Ω,但出现问题的节点会更多,或者彻底失去正常通信功能。

497f83dc3f0c48f3b4a19e405476b539.png

总结

终端电阻在60Ω至120Ω最佳,40Ω(三个120Ω并联)及以下,CAN通信已经收到影响。

 

 

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
memcpy函数是C语言中的一个内存拷贝函数,用于将指定长度的数据从源地址复制到目标地址。它的性能通常是非常高效的,因为它使用了底层的内存操作指令来执行拷贝操作。 由于memcpy是一个底层函数,其性能主要取决于底层硬件和操作系统的支持。在大多数情况下,memcpy的性能非常好,可以快速地将大块的内存数据进行拷贝。 然而,性能的具体表现还取决于以下几个因素: 1. 数据大小:memcpy在处理大块数据时通常比处理小块数据更高效。 2. 内存对齐:如果源地址和目标地址是按照特定的对齐方式进行对齐的,那么memcpy的性能可能会更好。 3. 编译器优化:一些编译器会对memcpy进行优化,以提高其性能。 为了实测memcpy的性能,可以编写一个测试程序来比较memcpy函数的执行时间与其他方法的执行时间。下面是一个示例代码,用于比较memcpy和循环拷贝的性能: ```c #include <stdio.h> #include <string.h> #include <time.h> #define SIZE 1000000 void test_memcpy(char* dest, char* src, size_t len) { memcpy(dest, src, len); } void test_loop(char* dest, char* src, size_t len) { for (size_t i = 0; i < len; i++) { dest[i] = src[i]; } } int main() { char src[SIZE]; char dest[SIZE]; clock_t start, end; double cpu_time_used; // 测试memcpy的性能 start = clock(); test_memcpy(dest, src, SIZE); end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("memcpy执行时间:%f秒\n", cpu_time_used); // 测试循环拷贝的性能 start = clock(); test_loop(dest, src, SIZE); end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("循环拷贝执行时间:%f秒\n", cpu_time_used); return 0; } ``` 通过运行上述代码,可以比较memcpy和循环拷贝的执行时间,从而评估memcpy的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值