RS485是一種常見的通訊接口方式,在我們的實際產品中也是多次使用。但我們平常并不會去過多考慮某一實現的細節問題,不過最近我們遇到了一個因如上下拉電阻的選擇問題而造成的通訊故障,所以在這一片中我們來討論一下RS485總線上下拉電阻的選擇問題。
1 、出現的問題
前段時間在調試多個站點的Modbus通訊的時候出現了一個問題。在擁有6個節點的RS485總線上,主站發送給從站的報文能夠成功接收,從站返回的報文主站卻是接收不到。后來額外添加了上拉下拉電阻后,通訊恢復正常。這讓我們注意到,上下拉電阻的選擇對RS485總線通訊的影響問題。
首先,我們來看看為什么會有接收不到報文的情況。根據RS485總線的相關標準,當RS485總線差分電壓大于+200mV時,RS485收發器輸出高電平;當RS485總線差分電壓小于-200mV時,RS485收發器輸出低電平;當RS485總線上的電壓在-200mV~+200mV之間時,RS485收發器可能輸出高電平也可能輸出低電平,但對于某一特定的節點總是處于一種電平狀態,若RS485收發器的輸出處于低電平,這對于UART通信來說是一個起始位,此時通信會不正常,自然我們就接收不到正確的報文了。
既然是因為RS485總線上A端和B端的電壓差處于-200mV~+200mV之間而造成的錯誤,那么有沒有辦法防止它處于-200mV~+200mV之間呢?當然是有辦法的,那就是利用上拉下拉電阻來鉗位這一電壓差值。這就引出了另一個問題,我們該如何選擇適合的上拉下拉電阻呢?接下來我們將討論這個問題。
2 、分析問題
既然我們確認是上拉下拉電阻的匹配問題,那接下來我們就來討論一下上拉下拉電阻的選擇問題。我們先從簡單的的情況入手,逐步的討論更復雜的網絡情況。首先我們來看一下只有兩個節點的RS485網絡,如下圖所示:
在上圖的兩個節點的網絡中,我們規定兩端都有終端電阻,兩個節點所采用的收發器的輸入電阻相同,在總線中只有一個節點配置有上拉下拉電阻。我們根據電路中流入流出同一節點的電流是相同的原理,可以得到如下的兩個等式:
在我們設計RS485總線電路時,如果添加有上拉和下拉電阻,我們一般會選擇相同的阻值,我們記為R。那么我們根據上面兩個等式可以推導出下的算式:
有了這個式子我們可以計算出上拉下拉電阻的大小。因為我們加上拉下拉電阻的目的就是保證總線A端和B端的電壓差能夠符合不小于200mA的要求。所以我們以總線A、B的電壓差200mA來計算就可以得到上拉下拉電阻的值。
上面我們推導了兩個節點的計算公式,但兩個節點只是最簡單的情況,而總線上往往存在多個節點。所以接下來我們來討論總線上存在n個節點,總線兩端存在終端電阻,每一個節點都擁有相同的輸入電阻,只有主節點存在上拉下拉電阻,如下圖所示:
我們根據前面的推導過程可知,不同的只是因為增加節點而增加的輸入電阻,所以我們根據上述電路可以推導出如下的公式:
這一公式與兩個節點的公式相比僅僅只是輸入電阻部分并聯引起的變化。同樣的,我們可以依據總線A端和B端的電壓差不小于200mA的要求來計算上拉下拉電阻的阻值。
我們雖然推導了總線上有多個節點的計算公式,但我們只考慮了一個節點擁有上拉下拉電阻的情況。實際應用中,可能存在總線上有多個節點存在上拉下拉電阻的情況,所以我們來討論一下所有節點均存在上拉下拉電阻的極限情況,如下圖所示:
從上圖,我們不難看出與前一種多節點通訊的區別只是上拉下拉電阻的數量出現了變化。為了簡化推導過程,我們同樣假設每個節點擁有相同的上拉下拉電阻,以及同樣的上拉電源和地。采用相同的電路原理我們可得到如下的計算公式:
在這個公式中,n為節點的數量,總線A端和B端的差值我們定義為最小的200mA,這樣我們就可以將這個公式簡化為:
到這里,我們就得到了比較具有使用價值的上拉下拉電阻阻值的計算公式了。我們只需要根據實際的總線使用情況選擇n的值和電源的值就可以得到我們想要的上下拉電阻值。不過有一個問題需要注意,上下拉電阻的數量可能與節點的數量不同,但輸入電阻的數量與節點數量相同,所以計算時要注意n的取值問題。
3 、求解思路
我們已經推導了一個具有應用價值的上下拉電阻計算公式。接下來我們就來使用這一公式計算我們前面遇到的實際問題。
在第1節中,我們提到了一個實際問題,是一個具有6個節點的RS485總線,我們來計算一下這個實際事例中上拉下拉電阻該如何選擇。我們的主站采用的收發器是MAX3485,上拉下拉電阻選擇了普遍的4.7K歐姆電阻,上拉電源采用了3.3V電源。從節點為其他廠商產品,所采用的收發器為SP3485和SP485,我們只考慮主節點有上拉下拉電阻的情況。
從MAX3485和SP3485以及SP485的數據手冊我們可以查到輸入電阻均為12K歐姆。而在主站這邊添加了終端電阻,而總線上的其他從站均為添加終端電阻。所以我們就可以將這些數據帶入到上面的公式計算上拉下拉電阻:
于是我們很容易得到上拉下拉電阻的阻值約為903歐姆。這是在只有主節點有上拉下拉電阻的情況下,如果每個節點都有上拉下拉電阻呢?在這一情況下,所需的上拉下拉電阻要大得多,6個節點的話,約為5417歐姆。如果兩個終端都采用了終端電阻,則上拉下拉電阻需要更小一些,約為458歐姆左右。同樣如果6個節點均采用上拉下拉電阻,則上拉下拉電阻的值約為2749歐姆。一般在設計電路時,我們均默認所有節點均有上拉下拉電阻,在不能確認最遠端的距離及終端電阻時,選用5K歐姆左右的電阻是合適的。
我們似乎解決了我們前面所遇到的問題,但還有一種情形我們需要考慮,那就是總線上擁有最多節點的情況。一般來說,總線上能夠掛載多少個節點與采用的RS485收發器有關。同樣以我們常用的MAX3485和SP3485為例,其理論上可以掛載包括自己在內的32個節點,所以我們就以32個節點、所有節點均有上拉下拉電阻,兩端均有終端電阻為例來計算上拉下拉電阻的值。
我們可得到上拉下拉電阻的值約為13778歐姆,但這個值是一個極限值,我們并不能選用它,因為我們不能保證所掛載的每個節點都配有上拉下拉電阻。所以我們再拉計算一下只有我們設計的主節點具有上拉下拉電阻的情況。這種情況下,上拉下拉電阻的值約為431歐姆。那是不是我們選用這個最小值就可以適應總線掛載2到32個節點的所有情況了呢?很遺憾,并不是這樣的,還有其它的要求需要我們考慮。
前述只考慮了上下拉電阻對RS485通訊的積極影響,而沒有考慮上下拉電阻的選擇對RS485通訊的消極影響。這個消極影響就是上下拉電阻以及終端電阻會影響RS485收發器的帶載能力。因為根據RS485標準,收發器需要能夠提供不低于1.5V的差分輸出,此時對總線上A端與B端的差分負載要求為54歐姆。
我們一如前面的推導過程來歸納差模負載的計算公式。我們依然按所有節點的輸入電阻相同,上拉下拉電阻相同,終端電阻為兩端都有的極限情況來推導公式。首先我們推導總線A端和B端的共模負載,得到公式如下:
有了這個共模負載的計算公式,我們就可以推導出總線A端和B端差模負載的計算公式:
根據這個差模公式我們可以來核算一下總線對上拉下拉電阻的要求。我們以32個節點,每個節點都使用了上拉下拉電阻,兩端均有終端電阻,差模負載為54歐姆。我們依然以MAX3485和SP3485為例,其輸入電阻為為12K歐姆,計算可得共模負載為270歐姆,而上拉下拉電阻約為30857歐姆。這是在假設32個節點均有上拉下拉電阻的情況下得到的,而我們能夠確保有上拉下拉電阻的只有主節點,所以我們可以得到只有主節點有上拉下拉電阻時,電阻值約為964歐姆。
所以綜合上述計算過程,為了MAX3485和SP3485在2到32個節點的情況下均可用,理論上我們需要選擇上拉下拉電阻的值大于964歐姆即可,但實際情況卻不見得如此,因為其他節點也可能會采用上拉下拉電阻,所以上拉下拉電阻需要適當的選擇大一點,才能保證通訊的可靠性。
4 、不是結論
至此我們已經完成RS485總線中上拉下拉電阻選擇的計算過程。但在實際使用中上下拉電阻的選擇要復雜的多,因為它不但與所采用的收發器有關,還與總線上的節點數量有關。收發器的輸入阻抗也決定了總線所能掛載節點的數量。如我們前述的MAX3485和SP3485兩種收發器,其輸入阻抗為12K歐姆,掛載32個節點時,共模電阻只有375歐姆,這時候如果我們想要利用上拉下拉電阻來保證通訊可靠,已經不會有太大效果了。所以象MAX3485和SP3485這種擁有單位負載阻抗的收發器,在電路設計時就需要考慮其掛載節點的數量。
我們在前面的討論中,有些條件是我們假定的,如我們默認所有節點的輸入阻抗均為單位負載,但實際情況不一定如此,不同節點的輸入電阻可能不一定相等。在RS485標準中規定了單位負載,輸入電阻與節點的關系:
所以我們選擇輸入電阻為12K歐姆來計算實際上是極小值,所以不同節點的輸入電阻不相同也沒關系,更大的輸入電阻反而降低了驅動要求。
在前面的討論中我們都是按兩端有終端電阻來計算的,在實際使用中可能并非兩端都存在終端電阻,甚至沒有終端電阻的情況。根據前面的公式,我們不難發現如果只有1端有終端電阻或者沒有終端電阻的情況下,對上下拉電阻的要求更低一些,上下拉電阻可以適當增大,所以只要符合兩端帶終端電阻的情況,其它情形自然也可滿足。
還有在總線上,不同節點采用的上下拉電阻以及上拉電源并不一定相同。我們假定上拉電源為3.3V,實際已經是很低的情況,如果用更高的上拉電源,對上拉電阻的要求反而更低,所以用3.3V計算是能符合所有使用情況的。而至于上下拉電阻不同節點可能不同的問題,我們考慮的是最低情況,如果某一個或幾個節點采用更大的電阻,由于電阻的并聯作用,不會造成電阻更大的問題,即可保證壓差限制,也能保證差分負載的要求。
評論
查看更多