張俊杰
(國家能源集團 新朔鐵路公司機務分公司,內蒙古 鄂爾多斯 017000)
通過對現有SS4B機車變壓器油溫的溫度測控器的研究發現,現有的溫度測控器采用模擬信號傳輸方式,精度較差,抗干擾能力弱,主電路大都采用模擬電路,設計復雜,故障率較高等缺點。本次設計采用SS4B機車既有的PT100鉑電阻溫度傳感器,重新設計溫度測控器和信號傳輸方式。
溫度變送器在國內的應用比較廣泛,基于Modbus協議的通信方式是現在流行的一種方式。國內的溫度變送器應用水平相對于國外先進技術來說還有一定的差距,技術相對來說不算是十分成熟,形成廣泛應用的溫度變送器也比較少。本設計采用精度高,穩定性好,可靠性強的鉑電阻測溫,采用單片機實現信號的放大、轉換和處理等功能。比起以往的設計,本設計的硬件電路設計較為簡單,省去了采集和放大等電路的設計,選用的單片機可以實現以上功能。鉑電阻的驅動電路采用四線制,可以消除引線電阻,線性化處理采用軟件編程的方法實現,適合高精度的應用場合。
通信電路采用的是RS485總線來實現數據的傳輸,以Modbus協議為基礎來設計軟件編程。RS485總線具有傳輸速率快、傳輸距離遠以及抗共模干擾的能力強等特點,克服了RS232總線的缺點。
設計實現的功能是把溫度信號通過單片機采集、放大和處理后通過RS485總線實現和計算機的通信。本設計具有精度高,數據采集可靠,傳輸速率快和傳輸距離遠等特點。
溫度變送器需要和熱電阻或者熱電偶配合使用,把溫度信號轉換成統一的標準信號,把信號作為控制器等的輸入信號來實現溫度參數的顯示和控制等功能。熱電阻溫度變送器有兩線制和四線制之分,這里采用四線制來消除引線電阻的影響。圖1為四線制鉑電阻測溫元件。

圖1 四線制鉑電阻測溫元件
鉑電阻測溫電路需要有電壓或電流來驅動,設計選用恒流源驅動PT100鉑電阻。如圖1所示,采用200 μA恒流源來驅動鉑電阻,并且采用四線制的連接方法消除引線電阻,電流通過鉑電阻產生電壓,電壓信號通過放大電路放大后變成1 V~5 V的統一的輸出信號。把溫度信號通過鉑電阻測溫電路和放大電路,變成統一的電壓輸出信號就構成了鉑電阻溫度變送器。如圖2所示為溫度變送器結構方框圖。

圖2 鉑電阻溫度變送器結構方框圖
Modbus通信協議是一種應用于電子控制器的通用語言。采集器相互之間,采集器通過網絡和其他設備之間通過此協議可以通信。通過此協議不同廠家生產出來的各種采集器和設備可以連成工業網絡,可以集中起來控制。Modbus是一個開放的標準的而且可以免費使用的協議,支持多種電氣接口,可以在雙絞線、光纖、無線網等傳輸介質上傳送。協議采用主從方式,若主機設備發送一個信息,一臺從機設備就會返回一個響應。在一個Modbus網絡上工作的各個設備必須有自己的設備地址。當主機發送一條命令,各個從機設備開始檢測地址是否是自己的設備地址,如果不是自己的設備地址則不回應,如果是自己的設備地址,根據請求決定執行什么功能,如果需要回應,就生成Modbus協議幀方式發送報文。
Modbus協議有兩種通用的傳輸模式:ASCII模式和RTU模式。根據自己的設計選擇合適的模式。在一個網絡上的所有設備的傳輸模式和串口通信參數必須一致。
2.2.1 ASCII模式。在Modbus網絡上以ASCII模式進行通信的時候,每8位字節對應兩位十六進制數以ASCII字符值發送的。ASCII模式這種方式的優點是字符發送的時間間隔可以長達1 s,也不容易產生錯誤。ASCII模式和RTU模式傳輸模式的特性見表1。

表1 ASCII模式和RTU模式傳輸模式的特性
使用ASCII模式時消息是以冒號字符開始,回車換行符為結束。在Modbus網絡上的所有設備不停地檢測冒號字符,當檢測到冒號字符時立刻開始通過地址域判斷是否是發給自己的命令,決定是執行還是繼續檢測。ASCII模式的好處就是傳輸的內容都是ASCII字符,調試的時候比較容易,LRC錯誤校驗也很容易。典型的ASCII消息幀如表2所示。

表2 ASCII消息幀
ASCII傳輸模式的錯誤校驗方法是LRC校驗,它是以冒號開始,以回車換行符結束,忽略了單個字符數據奇偶校驗的辦法。校驗碼為8位二進制值,一個字節。接收設備接受信息時計算LRC的校驗碼,與接收到的發送設備計算的LRC值比較,如果兩個值不一樣就會產生一個錯誤。
2.2.2 RTU模式。 RTU通信模式在Modbus網絡上通信時,信息里的每8位字節分為2個4位的十六進制的字符。RTU傳輸模式的特性見表1。它相對于ASCII模式的優勢是波特率相同的情況下傳輸的數據會更多。消息中每8位都是1個由2個十六進制字符組成的。在一個Modbus系統中只允許使用一種傳輸模式,不允許混合使用。
RTU模式的起始位是T1-T2-T3-T4時間的停頓,網絡上所有的設備不斷檢測,當起始位滿足條件,立刻開始檢測第一個域,第一個域是設備地址域,設備判斷地址是否為自己的設備地址來進行相應的操作。不是自己的設備地址則重新開始檢測。如果是自己的設備地址則開始解碼功能代碼、數據等來執行。消息幀必須是連續的傳輸,如果在結束之前出現有超過1.5個字符時間的停頓,接收設備將認為下一個字節是一個新的消息的地址。再結束最后一個傳輸的字符后,至少得有3.5字符時間的停頓來標志消息的結束。如果下一個消息傳輸時,停頓時間沒有超過1.5個字符時間的停頓,接收設備就會認為它是前一個消息的延續。所以RTU模式的優勢是在同樣的波特率的情況下傳輸的信息量要比ASCII模式多。RTU消息幀如表3所示。

表3 RTU消息幀
在使用RTU模式傳輸數據時消息中有一個CRC校驗,CRC為16位的二進制值,兩個字節。傳輸設備在傳輸時按照CRC計算后加入消息中,接收設備接受消息時也計算接收到的消息的CRC并與消息中的CRC值比較。如果計算的值和消息中的值一樣則正確,不同則產生一個錯誤。校驗開始時調入一個16位寄存器的各位都置“1”,把信息中相鄰的2個8位字節數據放到當前寄存器中處理,只有每個字節的8位數據位用于CRC處理。起始位、校驗位、停止位都不參與CRC計算。在進行校驗時,每個8位數據與該寄存器的內容進行異或運算,然后向最低有效位(LSB)方向移動,用零填入最高有效位(MSB),對LSB檢查,如果LSB為0,不做異或運算,如果LSB為1,寄存器和預置的固定值異或。整個過程重復8次,最后一位完成后,下一個8位字節又單獨和寄存器的當前值異或,再重復上述過程,處理完全部信息中的數據字節后,寄存器中的值就是CRC值。
在消息中的功能域中的功能代碼告訴了被尋址的設備執行什么功能。有些功能代碼適用于所有設備,有些只應用于某些設備。幾種常用的功能碼見表4。

表4 常用的功能碼
例如功能代碼03是查詢并讀保持寄存器,從機設備執行的動作類型為查詢,用寄存器的內容作出回應。該消息的數據區必須含有告訴從機要查詢寄存器的起始地址及數量。錯誤校驗區的一些信息為從機提供一種校驗方法來保證信息的完整性。如果從機正常的響應,響應的功能代碼是查詢功能代碼的應答,數據區包括了采集到的寄存器的值。如果出現錯誤會修改功能碼,說明為錯誤響應,并在數據區含有一個代碼來說明錯誤。
溫度是非常重要的物理參數,熱電阻和熱電偶適合大多數的高溫測量。在工業上-200 ℃~500 ℃之間的溫度一般用電阻溫度計來進行測量。電阻溫度計在中低溫測溫時它的輸出信號要比熱電偶大很多,準確度和靈敏度很高。電阻溫度計輸出的電信號便于實現信號的遠傳和多點切換測量。
熱電阻一般采用金屬測溫電阻,但是不是所有的金屬都能作為熱電阻測溫的。必須滿足測溫時物理、化學性質穩定;電阻的溫度系數大;較大的電阻率;復現性好、復制性強;價格便宜以及電阻值與溫度的關系近似于線性的,從而便于分度和讀數。
鉑電阻因為具有穩定性好、準確度高、長期穩定性、可重復操作性、快速響應以及具有較寬的工作溫度范圍等特點,使其能夠適用于多種場合。本設計中采用PT100分度號的鉑電阻。
3.1.1 鉑電阻線性化處理。 鉑電阻隨著溫度的升高,它的電阻值也是升高的,但并不是呈線性關系的,所以在應用的時候必須對其進行非線性誤差補償。有多種的模擬和數字的方法可以對PT100鉑電阻進行非線性誤差補償。考慮到采用模擬電路對電阻進行線性化處理需增加的硬件電路部分以及其本身存在一定的誤差,這里采用數字補償的一種方法。
鉑電阻的阻值和溫度的關系可以用下列兩個式子表示。
在-200 ℃~0范圍之間:
Rt=R0[1+At+Bt2+Ct3(t-100)]
(1)
在0~850 ℃范圍之間:
Rt=R0(1+At+Bt2)
(2)
在以上兩個式子中Rt是t ℃時的電阻值,R0是0 ℃時的電阻值。A,B,C都是常數,對于工業用的鉑電阻來說,A=3.90802×10-3℃-1,B=-5.802×10-7℃-2,C=-4.27350×10-12℃-4。
以上兩公式描述了PT100鉑電阻阻值于溫度的關系,顯然它是呈現非線性的關系。根據以上兩式通過軟件編程的方法,對采集來的溫度進行計算得到的溫度值所存在的誤差很小,適用于精度要求高場合,實現起來也很簡單。這種方法需要微處理器的支持,本設計中選用的ADuC845單片機強大的處理及運算能力完全能夠進行PT100鉑電阻的線性化處理的運算。
3.1.2 測溫電路的設計。 鉑電阻阻值隨著溫度的變化而產生變化,利用鉑電阻這一特性可以用來測量溫度的變化。但是要利用鉑電阻采集溫度信號,必須要有恒流源或恒壓源來驅動,把阻值的變化轉換成能夠處理的電信號。如果采用恒壓源驅動電路,在恒電壓的橋式電路不僅存在鉑電阻的非線性誤差還有輸出電壓和電阻阻值的變化也存在非線性誤差,整個系統的誤差會增大。所以本設計采用恒流源來驅動鉑電阻,流過鉑電阻的電流如果能夠保持恒定,鉑電阻的阻值就和它兩端的電壓呈線性關系。但是流過鉑電阻的電流必須低于1.5 mA,如果流過電阻的電流過大,電阻發熱就會影響到測量精度。恒流源由選用的ADuC845單片機來提供,單片機有兩個匹配的、可以軟件設置的200 μA的電流源,如圖3所示。

圖3 鉑電阻測溫電路
通過設置單片機的激勵電流源控制寄存器,把200 μA的電流通過IEXC1引腳輸出來驅動鉑電阻。根據設計要求測量的溫度范圍是-50 ℃~300 ℃,鉑電阻阻值的變化范圍是80 Ω~212 Ω之間,200 μA的電流源通過PT100鉑電阻產生的電壓信號在0~80 mV之間,設置主ADC輸入范圍是0~80 mV單極性模式,單片機通過P1.0和P1.1采集電壓信號,來進行放大轉換等處理。
美國ADI公司推出的ADuC84X系列單片機執行速度很快,達到了一個時鐘可以執行一條指令的速度,最快可以達到25 MHz。它的片內集成的器件和各種功能在可靠性和功耗上都提升很多。
本設計選用具有2個獨立的24位的高分辨率的ADC的ADuC845,該單片機比較適合測控系統和在儀器儀表中使用。
ADuC845單片機具有以下特點。
3.2.1 高分辨率∑-Δ型ADC。 兩個獨立的24位ADC; 10個ADC輸入通道; 在60 Hz范圍內有20位有效分辨率。
3.2.2 存儲器。62 KB的片內閃速/電擦除程序存儲器;4 KB的片內閃速/電擦除數據存儲器;閃速/電擦除可使用100年,重復擦寫10萬次;在線串行下載;2304B片內數據RAM。
3.2.3 基于8051的內核。高性能的單指令周期內核; 32 kHz的外部晶振; 片內可編程鎖相環PLL,最高的時鐘頻率為12.58 MHz; 3個16位的定時器計數器; 26條可編程輸入/輸出線; 11個中斷源,2個優先級。
3.2.4 片內外圍設備。內部電源復位電路;雙激勵電流源;時間間隔計數器;UART、I2C、SPI串行接口;高速波特率發生器;看門狗定時器(WDT)和電源監視器(PSM)。
3.2.5 電源。采用3 V和5 V電壓工作;正常情況下位2.3 mA/3.6 V(核心時鐘頻率為1.57 MHz);掉電保持電流為20 μA,喚醒定時運行。
設計中的芯片用到的數字供電電源和模擬供電電源都是5 V的,所以電源電路的設計采用三端穩壓集成電路7805。如圖4所示,把220 V的交流電通過變壓器輸出為9 V的交流電,把9 V的交流電通過全控整流橋,經過電容濾波后輸入到三端穩壓集成電路7805。輸出的+5 V的電壓分為數字電路電源線和模擬電路電源線,它們各自走線,以減少數字電路和模擬電路之間的相互干擾,尤其是數字電路對模擬電路的干擾較大。如果采用兩套獨立的電源電路來分別為數字和模擬電路供電,將會增加電路的復雜性和成本。這種方法會再不增加電路的情況下顯著的降低數字電路和模擬電路的互相干擾。圖中的電容主要是起到濾波、退耦以保證單片機的正常工作和性能。圖中LED發光管主要做電源指示。

圖4 電源電路
鉑電阻測溫電路采集來的溫度信號通過單片機處理后通過串口傳送給計算機,串口和計算機的連接就是通過通信電路來連接的。電路設計采用串行通信方式,串行方式線路少、成本低是其優點,遠程傳輸廣泛采用串行傳輸的方式。
現在最常用串行通信接口是RS485接口。它克服了較早出現的RS232接口的傳輸速率低、傳輸距離短等不足之處。RS485的主要特點有:RS485最高的傳輸速率為10 Mbps;RS485接口是采用平衡驅動器和差分接收器的組合,抗共模干擾能力增強,即抗噪聲干擾性好;RS485最大的通信距離約為1 219 m,最大傳輸速率為10 Mb/S,傳輸速率與傳輸距離成反比,在100KB/s的傳輸速率下,才可以達到最大的通信距離,如果需傳輸更長的距離,需要加485中繼器。RS485總線一般最大支持32個節點,如果使用特制的485芯片,可以達到128個或者256個節點,最大的可以支持到400個節點。
如圖5所示為通信電路的設計電路。通信電路采用RS485接口,它采用Maxim公司生產的MAX485接口芯片,它是用于RS485的低功耗收發器。MAX485是用于RS485與RS422通信的低功耗收發器。MAX485的驅動器擺率不受限制,可以實現最高2.5 Mbps的傳輸速率。這些收發器在驅動器禁用的空載或滿載狀態下,吸取的電源電流在120 μA~500μA之間。所有器件都工作在5 V單電源下。驅動器具有短路電流限制,并可以通過熱關斷電路將驅動器輸出置為高阻狀態。接收器輸入具有失效保護特性,當輸入開路時,可以確保邏輯高電平輸出。具有較高的抗干擾性能。MAX485性價比高,優質,供貨穩定是大部分廠家采用它的主要原因。

圖5 通信電路
MAX485采用單一電源+5 V工作,額定電流為300 μA,采用半雙工通信方式。它完成將TTL電平轉換為RS485電平的功能。MAX485芯片的結構和引腳都非常簡單,內部含有一個驅動器和接收器。RO和DI端分別為接收器的輸出和驅動器的輸入端,與單片機連接時只需分別與單片機的RXD和TXD相連即可;RE和DE端分別為接收和發送的使能端,當RE為邏輯0時,器件處于接收狀態;當DE為邏輯1時,器件處于發送狀態,因為MAX485工作在半雙工狀態,所以只需用單片機的一個管腳控制這兩個引腳即可;A端和B端分別為接收和發送的差分信號端,當A引腳的電平高于B時,代表發送的數據為1;當A的電平低于B端時,代表發送的數據為0。在與單片機連接時接線非常簡單。只需要一個信號控制MAX485的接收和發送即可。
為了增加總線的抗干擾能力,在總線差分信號的A端口與電源之間、A端口和B端口之間、B端口和接地端之間分別都接入一個10 K的電阻。總線空閑時,A端電壓大約為3.2 V,B端電壓大約為1.6 V。當有干擾信號時,干擾信號很難產生串行通信的起始信號0。
當數據傳輸到計算機的通信接口處之前還得把RS485的差動信號轉換成RS232標準的數據信號,因為大多數的計算機使用的通信接口支持的是RS232的標準。本設計電平轉換電路采用MAX232芯片,如圖6所示。MAX485的接受使能端和發送使能端通過MAX232的R2OUT端來控制。當計算機發送數據時,R2OUT輸出低電平,經過Q1倒相后使MAX485的RE和DE為高電平而處于發送狀態。當計算機處于接收數據時,R2OUT輸出高電平,經過Q1倒相后使MAX485的RE和DE端為低電平而處于接收狀態。設計的電平轉換電路可以實現RS485和RS232之間的電平轉換。有了電平轉換電路就可以實現采用RS485總線來通信,可以發揮RS485總線的傳輸速率快、傳輸距離遠等特點。

圖6 RS485-RS232電平轉換電路設計
ADuC845的內部復位結構如圖7所示,復位引腳的RST端通過一個施密特觸發器和復位電路相連。上電復位所需的時間至少應該大于振蕩器建立時間加上2個機器周期,在這段時間內RST端的電平應該維持高于施密特觸發器的下閾值。

圖7 ADuC845的內部復位結構
為了保證單片機復位和運行的可靠性,本設計采用外部復位電路的方法。如圖8所示,X5045具有上電復位、低電壓監控、看門狗定時器和串行EEPROM等功能的可編程控制電路。

圖8 復位電路設計
當給X5045上電時,會激活它內部的復位電路而產生200 ms的復位脈沖,能足以保證單片機正常復位。在單片機工作過程中,X5045會一直監視VCC的電壓,當VCC的電壓降到單片機正常工作電壓以下時,它會產生一個復位脈沖,這個脈沖信號一直有效,直到VCC降到1 V以下。當VCC恢復到單片機正常工作的電壓以上時,復位脈沖延時200 ms后自動消失,單片機就可以恢復正常的工作。
除了具有上電復位和電壓監控功能還有看門狗定時器和串行的EEPROM來保證單片機是正常工作和掉電保護等功能。
主要介紹了設計的硬件電路部分,主要包括鉑電阻測溫電路、電源電路、通信電路和復位電路的設計。設計選用ADuC845單片機,它的處理速度和24位高分辨率的ADC完全可以滿足設計精度的要求,它的兩個激勵電流源可以直接用來驅動鉑電阻測溫電路。
設計的重點就是鉑電阻測溫電路的設計和通信電路的設計。為了實現高精度的要求,鉑電阻通過恒流源來驅動,通過24位高分辨率的ADC來轉換,鉑電阻的非線性誤差補償采用軟件編程的方法來實現,這種方法適合高精度的應用場合。通信電路采用RS485/Modbus組網方式來實現計算機和單片機之間的通信,RS485總線具有傳輸速率快、傳輸距離長和抗共模干擾能力強等特點,克服了RS232的一些缺點。
硬件電路的運行離不開軟件的支持,硬件電路必須有與之相符的軟件程序才能執行命令,實現它要實現的功能。單片機把鉑電阻測溫電路的電信號采集、放大、轉換和線性化處理不僅是硬件部分要求連接正確,軟件程序也須按照一定的順序正確執行。單片機處理后的數據通過串口在Modbus協議的基礎上與計算機實現通信。
4.1.1 ADC初始化內容。單片機要實現對信號采集和轉換等功能首先要對各個狀態寄存器進行初始化。單片機的主程序主要是數據的采集和轉換功能,初始化的狀態寄存器有ADCSTAT、ADCMODE、ADC0CON1、ADC0CON2、SF、ICON。
ADCSTAT是ADC狀態寄存器,它反映了ADC的數據準備和校準的狀態,是否有與ADC有關的錯誤,包括REFIN檢測、轉換溢出等標志。如表5所示。

表5 ADC狀態寄存器
RDY0:主ADC準備好標志位,在該位被清除前禁止向主ADC寫入轉換結果或禁止向其校準寄存器寫入數據。
RDY1:輔助ADC準備好標志位,與RDY0類似。
CAL:校準狀態位。完成后硬件置位,清除該位啟動一次模數轉換。
NOXREF:無外部參考電源標志位,僅在主ADC或輔助ADC運行時有效。當該位被置位時,所有的轉換結果的各位都為1。清除該位時說明外部的參考電源有效。
ERR0:主ADC發生錯誤標志位,寫入模式位啟動轉換或校準時自動清除該位。
ERR1:輔助ADC發生錯誤標志位,與ERR0類似。
ADCMODE是ADC模式控制寄存器,用于控制主ADC和輔助ADC的操作,如表6所示。

表6 ADC模式控制寄存器
REJ60:自動60 Hz陷波器選擇位。置位時自動選擇60 Hz陷波器。
ADC0EN:主ADC使能位,清除該位使主ADC處于掉電模式。
ADC1EN:輔助ADC使能位,與ADC0EN相似。
CHOP:斬波模式選擇位,置位時主ADC和輔助ADC處于非斬波模式工作,清除該位使主ADC和輔助ADC處于斬波模式工作。
MD2,MD1,MD0:主ADC和輔助ADC工作模式的控制位,本設計選擇011,連續轉換模式。
ADC0CON1是主ADC控制寄存器,用于主ADC的設置,包括緩沖、單極性或雙極性編碼、主ADC的輸入范圍等,如表7所示。

表7 主ADC控制寄存器
BUF1、BUF2:緩沖設置位,選擇00,設置為ADC+和ADC-都具有緩沖。
UNI:主ADC的單極性控制位。
RN2,RN1,RN0:主ADC輸入范圍設置位,設置為010,單極性模式為0~80 mV范圍。
ADC0CON2:是主ADC通道選擇寄存器,用于主ADC的通道選擇。如表8所示。

表8 主ADC通道選擇寄存器
XREF1,XREF0:主ADC外部參考電源選擇位。置位時選擇外部參考電源作為主ADC的參考電源。
CH3,CH2,CH1,CH0:主ADC通道選擇位,用來選擇主ADC的輸入通道。根據設計要求是兩路鉑電阻輸入,通道選擇時選擇1010和1011,兩路鉑電阻分別通過AIN1-AIN2管腳通道和AIN3-AIN4管腳通道輸入的。
SF為ADC濾波器控制寄存器,它用于ADC數字濾波器的抽取因子的選擇。SF的全部位用以設置ADC濾波器的抽取因子,影響著ADC的數據輸出速率和斬波建立的時間。為得到最好的校準效果,推薦在校準時設置SF為最大值,SF=11111111。
ICON是激勵電流源控制寄存器,它用于激勵電流源的控制。如表9所示。

表9 激勵電流源控制寄存器
ICON.6:激勵電流源使能位,置位可以使激勵電流源通過引腳AIN7/AIN8輸出。
ICON.3:選擇IEXC2為輸出引腳,為0時選擇AIN8,為1時選擇AIN7。
ICON.2:選擇IEXC1為輸出引腳,為0時選擇AIN7,為1時選擇AIN8。
ICON.1:IEXC2使能位,0時禁止,1時使能。
ICON.0:IEXC1使能位,0時禁止,1時使能。
根據設計的要求設置ICON=4FH,兩路鉑電阻測溫電路需要兩路的200 μA的電流源來驅動,兩路電流分別通過AIN7和AIN8來輸出。
4.1.2 單片機主程序。單片機在設計中實現的功能是不斷地采集溫度信號,通過串口中斷程序實現與計算機的通信。單片機主程序框圖如圖9所示。

圖9 單片機主程序框圖
主程序要先進行串口初始化,ADC0初始化才能正常的執行程序。串口中斷要在初始化完畢后打開,使得單片機可以執行串口中斷程序。單片機主程序是不停地采集信號、轉換和線性化處理。計算機發送指令后單片機立刻響應串口中斷,執行串口中斷程序和計算機實現通信。
以下是單片機主程序具體程序:
Void PT100 Linearization 1 (void); //鉑電阻線性化程序
Void PT100 Linearization 2 (void);
float t1,t2;
Void main (void)
{
float voltage,r1,r2;
T3CON=0x83;
T3FD=0x2d;
SCON=0x5c;
SF=0xff;
ICON=0x41;
ADCMODE=0x63;
ADC0CON1=0x22;
ADC0CON2=0x4a;
ES=1;
EA=1;
while(1)
{
ADC0CON2=0x4a;
voltage=ADC0H;
voltage=voltage*256+ADC0M;
voltage=voltage*256+ADC0L;
r1=voltage/0.0002;
PT100 Linearization 1( )
ADC0CON2=0x4b;
voltage=ADC0H;
voltage=voltage*256+ADC0M;
voltage=voltage*256+ADC0L;
r2=voltage/0.0002;
PT100 Linearization 2( );
}
Void PT100 Linearization 1(Void)
{
float rt,rt1,t1;
rt1=r;
rt=rt1;
t1=(rt-100)/0.36;
do
{
if(rt<100)
{
rt1=100+t1*(0.390802-0.0000580195*t1-0.000000000427351*
(t1-100)*t1*t1;
}
else
{
rt1=100+t1*(0.390802-0.0000580195*t1);
}
t1=t1+(rt-rt1)/0.36
}
while((rt-rt1)>0.005||(rt1-rt)>0.005);
return;
}
Void PT100 Linearization 2(Void)
{
float rt,rt2,t2;
rt2=r;
rt=rt2;
t2=(rt-100)/0.36;
do
{
if(rt<100)
{
rt2=100+t2*(0.390802-0.0000580195*t2-0.000000000427351*
(t2-100)*t2*t2;
}
else
{
rt2=100+t2*(0.390802-0.0000580195*t2);
}
t2=t2+(rt-rt2)/0.36
}
while((rt-rt2)>0.005||(rt2-rt)>0.005);
return;
}
4.2.1 串口初始化內容。 單片機和計算機通信是通過串口發送和接收數據的,單片機在執行主程序時要跳轉到串口中斷程序必須要提前打開中斷。要保證兩者的數據準確的傳輸,兩者必須設置相同的波特率。ADuC845單片機有一個專門用于產生波特率的定時器T3,尤其是高速率和高精度的波特率可以由它產生。T3是獨立于其他3個定時器的。用T3CON和T3FD兩個專用寄存器來設置T3。
T3CON是波特率控制寄存器,用于設置串口的波特率和二進制分頻器的分頻數的。T3CON專用寄存器的各位作用如表10所示。

表10 T3CON專用寄存器各位作用
T3BAUDEN:T3波特率發生器的使能位,置1時說明T3作為波特率發生器。PCON.7、T2CON.4、T2CON.5不再有效,清零時采用T1或者T2作為波特率發生器。
DIV2,DIV1,DIV0:二進制分頻器分頻因子,對內核時鐘分頻產生合適的時鐘頻率。
T3FD是所需波特率的一個分數分頻比,可以由內核時鐘頻率、分頻因子和所需波特率計算得到。
串行端口的控制狀態寄存器SCON如表11所示。

表11 串行端口控制狀態寄存器SCON
SM0,SM1:UART模式設置位。
SM2:模式2,3中多處理機通信的使能位,模式2,3中,當SM2=1且接收的第9位數據RB8為0,RI接收中斷的標志就不會被激活。
REN:允許接收位,由軟件置位或者清除,REN=0時禁止接收,REN=1時允許接收。
TB8:模式2,3中發送的第9位數據,可以由軟件置位或者清除。
RB8:模式2,3中已接收的第9位數據。
TI:發送中斷標志,在發送停止位之前由硬件置位,必須由軟件來清除TI。
RI:接收中斷標志,在接收停止位時由硬件置位,必須由軟件來清除RI。
設置T3CON=0x83H,T3FD=0x2DH,SCON=0xDCH,串口工作在方式3,波特率設置為9 600。
4.2.2 串口中斷程序。 在對串口初始化完畢之后,串口根據串口中斷程序對數據進行接收和發送。本設計是在Modbus協議基礎上,通過串口來實現計算機和單片機之間的通信。
根據Modbus協議的規定數據傳輸時有ASCII模式和RTU模式,因為在同一波特率情況下RTU模式可以傳輸更多的數據,它采用的CRC校驗方法使數據傳輸準確,所以采用效率更高的RTU模式傳輸數據。單片機再執行主程序時跳到串口中斷程序來執行程序,通過程序來實現接受、發送以及執行的功能等。串口中斷程序框圖如圖10所示。

圖10 串口中斷程序框圖
串口中斷程序在設計中實現的功能就是實現單片機和計算機之間的通信,保證數據的準確無誤的接收和發送,實現Modbus協議的讀寄存器中的值,把讀到的數值發送給計算機,從而實現單片機所要執行的功能。
中斷服務程序執行的流程為:打開串口,偵測幀頭,若符合Modbus協議規定的4個字符的延時等待時間就開始接受報文;首先判斷地址是否發給本機地址,如果是發送給自己的則產生CRC校驗碼并且和接收到的報文中的CRC碼進行比較,正確則執行報文所述功能,發送響應報文,中斷返回。如果兩個CRC校驗碼不一致,則產生錯誤報告,發送給主機,重新發送報文。
要實現計算機和單片機的通信,設計采用根據Modbus協議通過串口實現通信,通信介質為RS485總線。計算機如果要對從機實現控制就要按照Modbus協議的格式發送,本設計采用的是Modbus協議的RTU模式,發送的命令報文要符合RTU模式的幀格式,包含4個字符延時的起始位、地址位、功能代碼位、數據位、CRC校驗位和4個字符的結束位。
計算機和單片機之間的通信過程如圖11所示。首先打開串口準備要發送的報文,產生一個報文的CRC校驗碼放到報文中,組織好報文并發送。計算機開始等待單片機發送回來的響應報文,不停地偵測幀頭。如果接收到的報文幀頭符合4個字符的延時就開始接受報文,并產生這個報文的CRC校驗碼來和接收到的報文的CRC碼進行比較,如果兩個CRC碼一致,就開始分析報文并處理,如果CRC碼不一致就會產生錯誤報告,重新發送報文[13]。計算機等待的響應報文的時間過長就會執行超時處理,進行重發報文。

圖11 主機程序框圖
這主要說明的是以Modbus協議為基礎實現計算機和單片機的通信。重點是單片機主程序、串口中斷程序和主機程序的程序框圖。單片機程序包括ADC初始化、數據采集和非線性誤差補償等內容。串口中斷程序包括串口工作方式和波特率的設置,串口中斷程序的框圖設計。主機程序主要包括主機程序框圖的設計。計算機和單片機之間的通信主要靠主機程序和串口中斷程序一起來實現接收和發送。
筆者設計的是SS4B機車鉑電阻溫度變送器,它的功能是利用鉑電阻阻值隨著溫度的變化的特點來采集溫度,并通過RS485總線把工業現場的溫度信號傳送到計算機,計算機可以在任意時刻通過鉑電阻溫度變送器采集到現場溫度。在現場采集溫度要通過單片機采集、放大和轉換,鉑電阻的非線性化誤差補償也是通過單片機軟件編程運算來實現,軟件編程實現鉑電阻的非線性誤差補償適合高精度的應用場合。設計中選用ADuC845型號的單片機,它有24位高分辨率∑-Δ型ADC,10個ADC輸入通道。可以滿足設計要求的兩路鉑電阻的輸入和0.5%精度的要求。通信介質采用RS485總線,它具有傳輸速率快、傳輸距離遠和抗共模干擾能力強等特點。軟件程序是在Modbus協議的基礎上實現的,在同一波特率下RTU模式比采用ASCII模式傳輸的信息要多,所以設計采用傳輸效率更高的RTU傳輸模式。
設計主要包含硬件電路和軟件兩方面的內容,主要設計的內容和成果如下: ①在查閱大量的中文和外文文獻的基礎上對現場總線概念,尤其是Modbus總線有了比較深入的認識。對它的發展動態和發展趨勢,國內外的發展現狀等問題有一定的了解。②較為詳細地介紹了Modbus協議的傳輸模式,它們的幀格式、常用的功能代碼和CRC校驗的內容以及在兩種傳輸模式下是怎樣實現接收和發送報文的。③硬件電路設計的內容主要有:單片機型號的選取;鉑電阻的測溫電路的設計;電源電路的設計;通信電路的設計以及復位電路的設計。④軟件部分的內容有:單片機內部的各個控制寄存器的設置;ADC的初始化和串口的初始化;單片機主程序、串口中斷程序和主機程序框圖的設計等內容。