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:時間段2

CAN_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結構體沒有全部說明。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章