PIC18F26K83 CAN总线位定时计算疑问:求简易分步计算方法
简易PIC18F26K83 CAN位定时分步计算指南(8MHz时钟→250kbps)
步骤1:吃透核心波特率公式
PIC18F26K83的CAN模块时钟是FOSC/2(8MHz系统时钟对应4MHz CAN模块时钟),波特率的计算公式非常关键:
波特率 = (FOSC/2) / [ (BRP + 1) * N ]
其中:
BRP:波特率预分频器的寄存器值(范围0-63,实际分频系数是BRP+1)N:单比特的总时间量子(TQ)数 = 1(固定同步段) + PROPSEG(传播段) + PHSEG1(相位段1) + PHSEG2(相位段2)
步骤2:代入目标值计算关键乘积
把8MHz时钟、250kbps波特率代入公式,化简后得到核心等式:
(BRP+1)*N = (8000000/2) / 250000 = 16
现在要找满足8≤N≤25(CAN标准推荐的合理范围,保证采样精度)的整数组合:
- 组合A:
BRP+1=1(即BRP=0),N=16 - 组合B:
BRP+1=2(即BRP=1),N=8 - 更小的
N(比如4、2)不符合CAN规范,直接舍去
步骤3:分配各段TQ数(遵循硬性约束)
CAN标准有几个必须遵守的规则:
PHSEG2 ≤ PHSEG1(相位段2不能比相位段1长)PHSEG2 ≤ SJW(同步跳转宽度不能小于相位段2)- 各段最小TQ数:PROPSEG≥1,PHSEG1≥1,PHSEG2≥1,SJW≥1
组合A(BRP=0,N=16)
总TQ=16,所以PROPSEG+PHSEG1+PHSEG2=15,推荐实用分配:
- PROPSEG=5TQ → 寄存器
PRSEG=4(寄存器值=实际TQ数-1) - PHSEG1=6TQ → 寄存器
PHSEG1=5 - PHSEG2=4TQ → 寄存器
PHSEG2=3 - SJW=4TQ → 寄存器
SJW=3
验证:1+5+6+4=16,(BRP+1)N=116=16,波特率=4000000/(1*16)=250kbps,完全符合要求。
组合B(BRP=1,N=8)
总TQ=8,所以PROPSEG+PHSEG1+PHSEG2=7,推荐实用分配:
- PROPSEG=3TQ → 寄存器
PRSEG=2 - PHSEG1=3TQ → 寄存器
PHSEG1=2 - PHSEG2=1TQ → 寄存器
PHSEG2=0 - SJW=1TQ → 寄存器
SJW=0
验证:1+3+3+1=8,(BRP+1)N=28=16,波特率=4000000/(2*8)=250kbps,同样正确。
步骤4:排查你的错误原因
你之前得到50kbps的结果,大概率是这两个问题之一:
- 寄存器配置错误:比如误将BRP设为4(而非0),此时
(BRP+1)*N=5*16=80,波特率=4000000/80=50kbps,正好对应你的结果。 - 公式理解错误:如果漏掉了CAN模块时钟是FOSC/2这一步,直接用
波特率=FOSC/[(BRP+1)*N],或者误将系统时钟当成4MHz,都会导致计算偏差。
另外你提到的工具参数(SJW=1,BRP=2,PHSEG1=1,PHSEG2=2,PROPSEG=4),实际计算波特率约为166.6kbps,和50kbps不符,大概率是你使用工具时输入的时钟参数错误(比如选了4MHz而非8MHz),或者工具本身的公式存在问题。
内容的提问来源于stack exchange,提问作者Günkut Ağabeyoğlu
相关产品推荐
相关产品推荐

