CAN总线-位时序、波特率、采样点
? CAN總線通訊協議的每一幀可以看作一連串的電平信號,每一個電平信號代表一位(一個字節8位的位),所以一幀中包含了很多個位,由發送單元在非同步的情況下發送的每秒鐘的位數稱為位速率。
? 一位又分為4段,同步段(SS)、傳播時間段(PTS)、相位緩沖段 1(PBS1)、相位緩沖段 2(PBS2)。
? 一位可以當作一條水平的時間軸,不同的段在整個時間軸的占比不一樣,每一段又由若干個最小時間單元Time Quantum(以下稱為 Tq)構成。
? ?位由多少個 Tq 構成、每個段又由多少個 Tq 構成等,可以任意設定位時序。通過設定位時序,多個單元可同時采樣,也可任意設定采樣點。各段的作用和 Tq 數如表 11 所示。1 個位的構成如下圖所示
? ? ? ? ? ??
?
在stm32的程序配置中,我們要通過位時序設置采樣點和波特率。
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; CAN_InitStructure.CAN_BS2=CAN_BS2_6tq; CAN_InitStructure.CAN_Prescaler=5;上面是一個設置的實例,在stm32程序設計中,初始化跟linux編程差不多,利用系統提供的結構體類型對其各個成員賦值,再調用系統的初始化函數。
CAN_Init(&CAN_InitStructure);該函數參數就是上面配置好參數的結構體。
CAN_SJW:上面的表格有解釋。(一般為1)CAN_BS1:時間段1(跟表格劃分有區別)CAN_BS2:時間段2CAN_Prescaler:這個可以理解為系數,也叫波特率分頻器?
關于采樣點和波特率的計算公式:
CAN波特率 = CAN時鐘/( (1 + CAN_BS1 + CAN_BS2) * CAN_Prescaler) sample = ( 1 + CAN_BS1) / (1 + CAN_BS1 + CAN_BS2)如果 ?CAN時鐘為8M,CAN_BS1 = 9,CAN_BS2 = 6,CAN_Prescaler = 5
那么? 波特率=8M/(1+9+6)/5=100K
? ? ? ??采樣點=(1+9)/(1+9+6)=62.5%
由上面可以看出來,同一波特率條件下,BS1、BS2可以有不同的組合,不同的組合采樣點不同。
?
下面是剛才提到的兩條公式的推導過程(可以不用理解,記公式即可):
采樣點:
? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ??所謂采樣點是讀取總線電平,并將讀到的電平作為位值的點。位置如圖所示處。所以從一個位的開始到采樣點的時間占一個完整位的總時間的百分比就是所求的值:sample = ( 1 + ?CAN_BS1) / ?(1 + ?CAN_BS1 + ?CAN_BS2)。
?
波特率:
波特率是描述串口通訊的速度、速率的指標,指串口每秒傳輸多少位數據。有此得出波特率與一個位的時間的關系:
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
設CAN時鐘的周期為Tclk,一個時間單元為Tq,正常位時間為Tn,輸出波特率為Bcan。
? ? ? ? ? ? ? ? ? ??
注意:CAN總線通訊的波特率和采樣點的設置影響通訊的穩定性和錯誤率等。上面提到的CAN總線初始化只提到幾個參數,關于CAN_InitStructure結構體沒有全部說明。
?
?
?
?
?
總結
以上是生活随笔為你收集整理的CAN总线-位时序、波特率、采样点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CAN总线的初步认识
- 下一篇: stm32之ADC应用实例(单通道、多通