CAN波特率设置时的参数计算
- 格式:pdf
- 大小:66.98 KB
- 文档页数:3
can通讯波特率计算
在CAN总线通信中,波特率决定了数据传输的速度和可靠性。
CAN 总线的标准波特率为1Mbps,但实际应用中通常使用较低的波特率(如250kbps或500kbps)以提高抗干扰性能。
计算CAN通信中的波特率需要考虑以下几个因素:
1. 时钟源频率:CAN控制器的时钟源频率通常为16MHz或20MHz。
2. 分频系数:波特率发生器通过分频来产生所需的波特率。
分
频系数为时钟源频率除以所需的波特率。
3. 采样点数:CAN总线通信中采用了采样点技术来确保数据传
输的可靠性。
采样点数为每个位的采样次数。
在CAN2.0B协议中,采用了三种采样点数:75%、87.5%和100%。
根据以上计算公式可知,波特率=时钟源频率/(分频系数*采样
点数)。
例如,如果时钟源频率为16MHz,分频系数为8,采样点数为87.5%,则所得到的波特率为125kbps。
在实际应用中,为了提高通信的可靠性,我们可以通过修改采样点数来调整波特率。
同时,由于CAN总线是一种多主机共享的总线结构,不同的节点之间需要使用相同的波特率才能保证正常通信。
因此,在设计CAN总线系统时,需要仔细考虑波特率的选择和设置。
- 1 -。
500K/S的计算CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=1;每一位的Tq数目= 1 (固定SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16 如果CAN时钟是8 MHz : (8M / 1 ) / 16 = 500K其中:1 为分频系数16 为每一位的Tq数目为了设置为100K, 把分频系数改为5即可, BS1 BS2 不变每一位的Tq数目= 1 (固定) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是8 MHz : (8M / 5 ) / 16 = 100K如果想得到1M 的波特率,CAN时钟仍然是8 MHz的情况下,分频系数不变应该改变BS1 BS2CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;每一位的Tq数目= 1 (固定) + 5 (BS1) + 2 (BS2) = 8如果CAN时钟是8 MHz : (8M / 1 ) / 8 = 1000K另外尽可能的把采样点设置为CiA 推荐的值:75% when 波特率> 800K80% when 波特率> 500K87.5% when 波特率<= 500K所以对于100K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于500K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于1000K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+5) / (1+5+2) = 75%个人见解, 仅供参考。
一般设置CAN_SJW = 1,总结程序发现!!!can时钟是RCC_APB1PeriphClock(APB1从APB2而来,分频系数不同,导致APB1不同,mini版中一般是APB2为72Mhz,APB1是36MHz),你要注意CAN时钟频率CAN波特率=RCC_APB1PeriphClock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler ;另外尽可能的把采样点设置为CiA 推荐的值:75% when 波特率> 800K80% when 波特率> 500K87.5% when 波特率<= 500K所以对于100K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%CAN波特率计算—网友总结STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用.bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少. 我们先看看下图,看看APB1总线时钟:APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的,然后再看看有了APB1的时钟后,如何算CAN的总线速率, 先看下图:有了上边的这个图,基本就清楚了.总线时钟MHz (3+TS1+TS2)*(BRP+1)===================================================下面是我的计算:CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;(lyp发现大部分都是设置这个SJW为1tq,导致一些人把这个当做一个系数,这是错误的,因为这个公式里的1tq是固定的同步段(SYNC_SEG),与SJW无关!!!)CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;CAN_InitStructure.CAN_Prescaler = 4;//2nominal bit time(3+5+1)tq=9tq关于分频系数查看system_stm32f10x.c下面的static void SetSysClockTo72(void) 函数/* HCLK = SYSCLK *//* PCLK2 = HCLK *//* PCLK1 = HCLK/2 */所以can时钟72MHZ/2/4=9 Mhz????????============================================================================================= void CAN_Configuration(void){CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;/* CAN register init */CAN_DeInit();CAN_StructInit(&CAN_InitStructure);/* CAN cell init */CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;CAN_InitStructure.CAN_NART=DISABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;CAN_InitStructure.CAN_Prescaler=200;CAN_Init(&CAN_InitStructure);/* CAN filter init */CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMa sk;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);}注意//#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */拨特率10K,公式:72MHZ/2/200/(1+9+8)=0.01,即10K,和SJA1000测试通过================================================120欧姆电阻要加上!!!哦确实是CAN->BTR = (u32)((u32)CAN_InitStruct->CAN_Mode << 30) | ((u32)CAN_InitStruct->CAN_SJW << 24) |((u32)CAN_InitStruct->CAN_BS1 << 16) |((u32)CAN_InitStruct->CAN_BS2 << 20) |((u32)CAN_InitStruct->CAN_Prescaler - 1);总结一下Fpclk=36M 时can波特率为250k 的配置为/* CAN cell init */CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;CAN_InitStructure.CAN_NART=DISABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=9;CAN_Init(&CAN_InitStructure); 250k======================================的:将can总线波特率设置为250k在官方的can例程上给出了100k 查询和500k 中断方式的例子分别设置如下:CAN_Polling:/* CAN cell init */CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;CAN_InitStructure.CAN_NART=DISABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=5;CAN_Init(&CAN_InitStructure); 100k/* CAN cell init */ CAN_InterruptCAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;CAN_InitStructure.CAN_NART=DISABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=1;CAN_Init(&CAN_InitStructure); //500k一般设置CAN_SJW = 1,总结程序发现!!!can时钟是RCC_APB1PeriphClock(APB1从APB2而来,分频系数不同,导致APB1不同,mini版中一般是APB2为72Mhz,APB1是36MHz),你要注意CAN时钟频率CAN波特率=RCC_APB1PeriphClock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler; 如果CAN时钟为8M,CAN_SJW = 1,CAN_BS1 = 8,CAN_BS2 =7,CAN_Prescaler = 2那么波特率就是=8M/(1+8+7)/2=250K=========================================得到500Kb/s的波特率CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=1;每一位的Tq数目= 1 (固定SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是8 MHz : (8M / 1 ) / 16 = 500K其中:1 为分频系数16 为每一位的Tq数目为了设置为100K, 把分频系数改为5即可, BS1 BS2 不变每一位的Tq数目= 1 (固定) + 8 (BS1) + 7 (BS2) = 16如果CAN时钟是8 MHz : (8M / 5 ) / 16 = 100K如果想得到1M 的波特率,CAN时钟仍然是8 MHz的情况下,分频系数不变应该改变BS1 BS2CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;每一位的Tq数目= 1 (固定) + 5 (BS1) + 2 (BS2) = 8如果CAN时钟是8 MHz : (8M / 1 ) / 8 = 1000K另外尽可能的把采样点设置为CiA 推荐的值:75% when 波特率> 800K80% when 波特率> 500K87.5% when 波特率<= 500K所以对于100K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=5;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于500K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于1000K 的波特率(假定使用8MHz 时钟)可以修改该BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+5) / (1+5+2) = 75%个人见解, 仅供参考。
STM32_CAN波特率计算在STM32中,可以使用以下公式来计算CAN总线的波特率:波特率 = APB1_CLK / (prescaler * (sjw + bs1 + bs2 + 1))其中,APB1_CLK 是STM32的外设时钟频率,可以通过RCC_ClocksTypeDef 结构体获取。
prescaler 是一个16位的数,取值范围是1-1024、sjw (同步跳转宽度)、bs1 (位段1长度) 和 bs2 (位段2长度) 取值范围为0-15通常,CAN总线的波特率设置取决于硬件限制和所需的通信速度。
下面是一些常见的波特率计算示例:1. 125 kbps:APB1_CLK = 72 MHz,prescaler = 6,sjw = 1,bs1 = 11,bs2 = 42. 250 kbps:APB1_CLK = 72 MHz,prescaler = 3,sjw = 1,bs1 = 11,bs2 = 43. 500 kbps:APB1_CLK = 72 MHz,prescaler = 3,sjw = 1,bs1 = 7,bs2 = 4 4. 1 Mbps:APB1_CLK = 72 MHz,prescaler = 3,sjw = 1,bs1 = 3,bs2 = 4需要注意的是,上述示例中的波特率计算公式假设CAN_BS2=1,可以根据实际需要进行调整。
在实际应用中,还需要根据硬件布线、传输距离和抗干扰能力等因素对波特率进行调整和优化。
同时,还应考虑位定时误差和失败重传等问题,以确保可靠的通信。
因此,在使用STM32_CAN时,建议参考ST提供的相关文档和应用注释,根据实际需求进行波特率计算和配置。
CAN波特率设置时的参数计算CAN(Controller Area Network)总线最早由德国 BOSCH公司提出,主要用于汽车内部测量与控制中心之间的数据通信。
由于其良好的性能,在世界范围内广泛应用于其他领域当中,如工业自动化、汽车电子、楼宇建筑、电梯网络、电力通讯和安防消防等诸多领域,并取逐渐成为这些行业的主要通讯手段。
Can控制器器只需要进行少量的设置就可以进行通信,其中较难设置的部分就是通信波特率的计算。
CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。
实际上,CAN总线的波特率是一个范围。
假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置)。
CAN波特率设置时需要计算几个参数,这些参数共同决定波特率大小,由于计算比较复杂,希望有一个简易步骤,本人经过研究,找到一个简易办法,现贴出来分享,不对的地方请留言指正。
需要说明的是,本人使用的can控制器是AT89C51CC03单片机中的can首先,确定一下各项参数的取值范围:参数范围编程值说明BRP [1..64] 0-63 定义时间量子(时间份额)的长度tqSync_Seg 1 tq 固定长度,总线输入与系统时钟同步Prog_Seg [1..8]tq 0-7 补偿物理延时时间Phase_Seg1 [1..8]tq 0-7 可通过同步暂时延长Phase_Seg2 [1..8]tq 0-7 可通过同步暂时缩短TSJW [1..4]tq 0-3 不能比任何一相位缓冲段长以上是参数的取值范围,编程值是实际往寄存器里写的值,为实际取值减1。
下面说一下步骤:1、首先计算CAN时钟和波特率的比值;2、根据比值确定预分频器的分频值BRP,计算时间量子的数目,这个数值范围是8-25;3、将时间量子数减1(去掉Sync_Seg)后在Prog_Seg Phase_Seg1 Phase_Seg2三个参数中分配;4、Prog_Seg和整个线路的时延有关,一般不太好确定,可以按下面的原则进行分配:Prog_Seg<=Phase_Seg1<=Phase_Seg2 ;Phase_Seg1=Phase_Seg2 或者 Phase_Seg1+1=Phase_Seg2;5、SJW取Phase_Seg1和4中小的那个。
can通讯波特率计算can通讯是一种常用的工业领域通讯协议,而波特率则是can通讯中的一个重要参数。
波特率是指单位时间内传输的数据量,通常以比特/秒为单位表示。
在can通讯中,波特率的计算方法如下:1. 首先确定can总线的工作频率,通常为16MHz。
2. 根据需要传输的数据量和通讯距离等因素,选择合适的波特率。
can通讯支持多种波特率,例如125kbps、250kbps、500kbps、1Mbps等。
3. 根据所选波特率,计算出一个时间量化周期Tq。
以125kbps 为例,Tq=1/125000=8us。
4. 确定传输的数据位数,通常为8位。
则一个can数据帧由一个起始位、一个ID、一个控制位、8个数据位、一个CRC、一个ACK 和一个结束位组成,共计33位。
5. 根据所选波特率和数据位数,计算出一个can数据帧的传输时间,即:Tframe = 33 * Tq = 33 * 8us = 264us6. 根据传输时间计算出可以在一个时间段内传输的数据量。
以125kbps为例,一个时间段为1秒,则可以传输的数据量为:N = 1 / Tframe = 1 / 264us = 3787帧/秒7. 根据需要传输的数据量和所选波特率,计算出每个数据帧的传输时间。
以125kbps为例,每个数据帧的传输时间为:Tcan = 8 + 1 + 1 + 8 + 15 + 1 + 8 = 42Tq = 336us8. 根据每个数据帧的传输时间和可以传输的数据量,计算出所选波特率下的最大数据传输速率。
以125kbps为例,最大数据传输速率为:R = N * 8 / Tcan = 3787 * 8 / 336us = 90.01kbps 以上即为can通讯波特率的计算方法,对于can通讯的实际应用具有重要的指导意义。
STM32CAN波特率计算在STM32系列微控制器中,CAN(Controller Area Network)的波特率计算可以使用以下公式:波特率=(APB1时钟频率)/(CAN分频器x(1+BSG1+BSG2))其中,APB1时钟频率是TIMx对应的APB1总线的时钟频率(单位为Hz)。
CAN分频器是BRP寄存器的值,用于将APB1时钟分频为CAN时钟。
BSG1和BSG2分别是SJW和BS1计数器和BS2计数器的值,用于确定CAN位定时器的时间段。
具体的计算步骤如下:1.确定APB1时钟频率。
在使用CAN之前,需要先设置APB1总线的时钟频率。
可以通过查阅STM32的参考手册或芯片数据手册来获取APB1时钟频率的值。
2.确定CAN分频器的值。
根据需要的波特率,以及APB1时钟频率,可以计算出CAN分频器的值。
公式如下:CAN分频器=(APB1时钟频率)/(波特率x(1+BSG1+BSG2))通常情况下,CAN分频器的值范围为1到10243.确定BSG1和BSG2的值。
BS1和BS2的值通常介于1到16之间。
它们的和(BS1+BS2)确定了CAN位定时器的长度。
其中,BS1用于传输的时间段,包括同步段、传输段和前部分的惯例部分。
而BS2用于接收的时间段,包括后部分的惯例部分和重同步段。
通常情况下,可以选择BS1和BS2的值为84.计算波特率。
将得到的CAN分频器、BSG1和BSG2的值带入公式:波特率=(APB1时钟频率)/(CAN分频器x(1+BSG1+BSG2))即可计算出所需的波特率。
需要注意的是,以上公式是用于计算CAN的时钟频率,实际的波特率可能会稍有偏差。
如果精确的波特率很关键,则可以进一步对BRP和BS1/BS2进行微调来达到所需的精度。
这是一个简化的波特率计算方法。
对于更复杂或特定的应用场景,建议参考STMicroelectronics提供的CAN计算器工具或查阅相关资料来进行具体的计算。
CAN波特率计算
CAN总线的波特率一般不超过1Mbit/s,但少数场合可以更高,比如汽车电子控制系统(ECU)和汽车仪表集成系统(IMS)中的高速CAN。
CAN总线上的波特率通常以BRP(波特率参数)和波特率系数K来表示,其计算公式为:
BRP = fOSC/(NBTR*FBit)
其中,fOSC为CAN控制器的时钟频率,NBTR为波特率比特率(比特/秒),FBit为波特率系数K, 以下是一些常用的CAN波特率:10Kbit/s:BRP=4,K=8;
20Kbit/s:BRP=2,K=8;
125Kbit/s:BRP=2,K=8;
250Kbit/s:BRP=1,K=8;
500Kbit/s:BRP=0,K=8;
800Kbit/s:BRP=0,K=8;
1Mbit/s:BRP=0,K=8
一般来说,CAN总线上使用的波特率越高,总线上的数据传输速率就越快,但抗干扰能力越差。
所以,在选择CAN总线上的波特率时应当根据实际情况来选择,以满足实际应用场合的需求。
can总线波特率计算方法CAN(Controller Area Network)总线是一种常用于汽车、工业和通信领域的网络通信协议,它的波特率是指数据传输速率,是衡量总线性能的重要指标。
CAN总线的波特率计算方法可以通过以下步骤进行。
一、了解CAN总线基本概念和术语在深入探讨CAN总线波特率计算方法之前,首先需要了解一些基本概念和术语。
1. 总线速率(bit rate):CAN总线传输数据的速率,通常用波特率(bps)表示。
2. 采样点数量(number of time quanta):一个CAN总线位周期内的时间划分数,通常是8个。
3. 位周期时间(bit time):一个CAN总线位周期的持续时间,通常由采样点数量和每个时间划分的时间(时间划分数)决定。
4. 传输速率误差(transmission rate error):实际波特率与预期波特率之间的差别,通常以百分比表示。
二、计算CAN总线的理论波特率根据CAN总线的基本概念和术语,可以计算CAN总线的理论波特率。
以下是计算波特率的步骤。
1. 确定采样点数量:根据CAN总线的需求和要求,确定一个合适的采样点数量。
常用的采样点数量为8个。
2. 计算位周期时间:位周期时间等于一个时间划分的时间乘以采样点数量。
假设每个时间划分的时间为T,位周期时间为Tbit。
例如,如果每个时间划分的时间为1微秒,采样点数量为8个,则位周期时间为8微秒。
3. 计算总线速率:总线速率等于位周期时间的倒数。
假设位周期时间为Tbit,总线速率为BR。
推导公式为:BR = 1 / Tbit。
在上述例子中,总线速率为125 kbps。
三、考虑采样点数量和传输速率误差的影响除了基本的波特率计算方法外,还需要考虑采样点数量和传输速率误差对CAN总线性能的影响。
1. 采样点数量:较多的采样点数量可以提高系统的抗噪性能,但也会增加总线负载和传输延迟。
因此,在选择采样点数量时需要综合考虑各方面因素。
CAN波特率计算CAN(Controller Area Network)是一种常用于实时通信的串行总线系统。
CAN总线的波特率(即数据传输速率)是非常重要的参数,它决定了CAN总线传输数据的速度和可靠性。
计算CAN总线的波特率需要考虑以下几个因素:1. 位时间(Bit Time):CAN总线被划分为若干个位时间,每个位时间由若干个时间段组成。
其中最重要的三个时间段是同步时间段(Synchronization Segment, Sync_Seg)、传播时间段(Propagation Segment, Prop_Seg)和相位段(Phase Segment, Phase_Seg)。
2. 位时间的总数:位时间的总数由同步时间段、传播时间段和相位段的时长之和决定。
位时间的总数记为N,通常有一个最小值(N_min)和一个最大值(N_max)。
3.位时间的时间分配:每个时间段的时长可以根据实际需求进行分配。
一般来说,同步时间段的时长很短,传播时间段的时长取决于总线长度和传播速度,相位段的时长取决于网络拓扑结构和所需的抗干扰能力。
4. 采样点(Sampling Point):CAN总线数据帧中每个位的采样点位置是固定的,并且通常位于相位段的中心。
5. 采样点的位置:采样点的位置可以通过同步时间段的时长(t_sync)、传播时间段的时长(t_prop)和位时间的总数(N)来计算。
采样点的位置可以用相位段的时长(t_phase)相对于整个位时间的长度(t_bit)来表示。
现在,我们来具体计算CAN总线的波特率的步骤:1.确定CAN总线的特性:首先需要确定CAN总线的物理特性,包括总线长度、传播速度等参数。
2. 确定位时间的总数(N):根据CAN总线的要求或规范,可以确定位时间的总数的最小值(N_min)和最大值(N_max)。
一般来说,N的取值范围在8到25之间。
3. 计算同步时间段的时长(t_sync):同步时间段的时长一般为1至3个时间单元(CAN位时间的最小单位)。
CAN波特率设置时的参数计算
CAN(Controller Area Network)总线最早由德国 BOSCH公司提出,主要用于汽车内部测量与控制中心之间的数据通信。
由于其良好的性能,在世界范围内广泛应用于其他领域当中,如工业自动化、汽车电子、楼宇建筑、电梯网络、电力通讯和安防消防等诸多领域,并取逐渐成为这些行业的主要通讯手段。
Can
控制器器只需要进行少量的设置就可以进行通信,其中较难设置的部分就是通信波特率的计算。
CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。
实际上,CAN总线的波特率是一个范围。
假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置)。
CAN波特率设置时需要计算几个参数,这些参数共同决定波特率大小,由于计算比较复杂,希望有一个简易步骤,本人经过研究,找到一个简易办法,现贴出来分享,不对的地方请留言指正。
需要说明的是,本人使用的can控制器是AT89C51CC03单片机中的can
首先,确定一下各项参数的取值范围:
参数范围编程值说明
BRP [1..64] 0-63 定义时间量子(时间份额)的长度tq
Sync_Seg 1 tq 固定长度,总线输入与系统时钟同步
Prog_Seg [1..8]tq 0-7 补偿物理延时时间
Phase_Seg1 [1..8]tq 0-7 可通过同步暂时延长
Phase_Seg2 [1..8]tq 0-7 可通过同步暂时缩短
TSJW [1..4]tq 0-3 不能比任何一相位缓冲段长
以上是参数的取值范围,编程值是实际往寄存器里写的值,为实际取值减1。
下面说一下步骤:
1、首先计算CAN时钟和波特率的比值;
2、根据比值确定预分频器的分频值BRP,计算时间量子的数目,这个数值范围是8-25;
3、将时间量子数减1(去掉Sync_Seg)后在Prog_Seg Phase_Seg1 Phase_Seg2三个参数中分配;
4、Prog_Seg和整个线路的时延有关,一般不太好确定,可以按下面的原则进行分配:
Prog_Seg<=Phase_Seg1<=Phase_Seg2 ;
Phase_Seg1=Phase_Seg2 或者 Phase_Seg1+1=Phase_Seg2;
5、SJW取Phase_Seg1和4中小的那个。
估计上面叙说不太好理解,下面举例说明:
假定晶振是12M,CAN时钟为6M(不同单面机,CAN时钟和晶振的关系不一样,BRP的取值范围不同单单片机也不一定相同,参看单片机说明)
1、500K波特率
FCAN/CAN baudrate = 6 MHz/500 kHz = 12,在8-25范围,所以BRP=1,TQ数目=12/1=12
Prog_Seg Phase_Seg1 Phase_Seg2分别等于3、4、4
寄存器编程值为(上述值减1):
BRP=0,SJW=3,PRS=2,PHS1=3,PHS2=3
2、100K波特率
FCAN/CAN baudrate = 6 MHz/100 kHz = 60,取BRP=6,TQ数目=60/6=10
Prog_Seg Phase_Seg1 Phase_Seg2分别等于2、3、4
寄存器编程值为(上述值减1):
BRP=5,SJW=2,PRS=1,PHS1=2,PHS2=2
3、10K波特率
FCAN/CAN baudrate = 6 MHz/100 kHz = 600,取BRP=60,TQ数目=600/60=10
Prog_Seg Phase_Seg1 Phase_Seg2分别等于2、3、4
寄存器编程值为(上述值减1):
BRP=59,SJW=2,PRS=1,PHS1=2,PHS2=2
4、5K波特率
FCAN/CAN baudrate = 6 MHz/5 kHz = 1200,取BRP=60,TQ数目=1200/60=20 Prog_Seg Phase_Seg1 Phase_Seg2分别等于6、6、7
寄存器编程值为(上述值减1):
BRP=59,SJW=3,PRS=5,PHS1=5,PHS2=6。