基于GSM的中央空調末端控制器研究
為了解決以上問題,本文設計實現了一種基于手機SIM卡GSM網絡的中央空調末端風閥異地控制模塊。GSM除語音業務外,另有短消息數據傳輸業務[4-8]。該模塊不但可以完成室內溫度信息通過GSM網絡以短信息的形式報告用戶,同時也可以由用戶通過該模塊發送期望設定室內溫度給末端控制器,完成遠程控制。
本文以Samsung公司的S3C2410芯片作為處理器,以Linux2.6為嵌入式操作系統,基于PID控制策略,通過手機短信的方式對中央空調末端裝置進行遠程控制,實現了對室內溫度的設置和監控,取得了很好的實際效果。
1 末端控制器系統設計
1.1 控制器系統硬件設計
本文基于ARM9平臺,采用Linux嵌入式操作系統,以S3C2410處理器為核心。系統硬件主要由以下模塊組成:
(1)GSM/GPRS射頻模塊。用來與GPRS網絡進行通信的射頻模塊,本文選用Simcom公司推出的工業級GSM/GPRS雙頻Modem模塊SIM300,具有完整的Modem信號,在網絡通信時可以作為一個Modem而存在。模塊采用串行接口通信,主要為語音傳輸、短信息和數據業務提供無線接口,帶GPRS功能[9]。SIM300芯片的外圍電路采用了芯片的典型連接,利用阻容充電和施密特觸發器整形獲得上電后大約1.5 s低電平延時來啟動。
(2)16C550串行接口。16C550是一種用于將并口數據轉換成串口數據的高速UART芯片,并自帶16位FIFO緩存通道,而且波特率可選。一方面可獲得完整的Modem控制,另一方面也是為了獲得精準的UART波特率,本文在SIM300射頻模塊與處理器組成的控制單元進行串行通信時使用16C550芯片。16C550芯片的虛擬地址為0xdb000000,工作在帶中斷的FIFO方式;其波特率設置為115200,傳輸無校驗,8位數據位,1位停止位,忽略輸入BREAK、幀錯誤和奇偶校驗錯,使用標準模式傳輸。
(3)CPU中央處理單元。采用Samsung公司生產的32/16位高性能基于ARM920T內核的RISC微處理器S3C2410,具有低功耗、自帶8通道10位ADC和DAC、并支持NAND Flash和SDRAM存儲器等特點。該單元包括S3C2410微控制器的最小系統、時鐘電路、復位電路等部分。
(4)輸入輸出單元:模擬房間內的溫度傳感器信號輸入到處理器的A/D轉換器;處理器通過PID算法得到的輸出量由D/A轉換器輸出以控制送風執行閥的開度,調整房間內的送風量從而達到調節室內溫度的目的。
圖1為系統硬件框圖。
1.2 控制器系統軟件設計
操作系統采用實時性強的Linux2.6內核,編譯器使用gcc 4.0.2版本,完成了各個功能模塊的接口函數。由于在進行嵌入式系統內核開發時,若交叉編譯工具(特別是gcc)版本較低則無法編譯高版本內核,版本過高也不行。因此本文為配合要采用的Linux2.6.18內核開發末端控制器,進行定制開發交叉編譯環境。具體如下:crosstool-0.43,binutils-2.16.1.tar.bz2,gcc-4.0.2,glibc-2.3.5,glibc-linuxthreads-2.3.5,linux-libc-headers-2.6.12.0,gdb-6.5,生成交叉編譯工具為arm-9tdmi-linux-gcc。其中短消息通信線程的初始化和主循環共分為以下4個步驟:
(1)完成串口初始化。系統啟動并完成初始化后,開始反復讀取16C550芯片發來的串口數據。當GSM模塊收到新短信后,通過串口向處理器發送1個字符串。該字符串格式、長度及內容都是固定的,以+CMTI開頭,以此為依據判斷是否新短信到來。
(2)向SIM300模塊發送讀取短消息的AT指令,判斷短消息內容。首先通過手機號來判斷短消息是否由用戶發來。如果短消息由用戶發來,則判斷用戶發送的指令,否則直接刪除。
(3)如果用戶發送的內容是“設定溫度XX”(XX代表二位溫度值),則將“XX”通過解碼函數解碼成ASCII字符,再通過換算得到用戶期望設置的溫度發送給溫度控制模塊,最后刪除該信息。如果用戶發送的內容是“查詢狀態”,則將當前溫度值和室內狀態以短消息的形式發送給用戶手機,最后同樣刪除該信息。
(4)處理器繼續讀取串口數據。
短消息通信程序流程如圖2所示。
處理器通過串口與GSM模塊通信,串行通信的基本參數有:波特率、數據位、停止位及校驗方式等。串口驅動程序實現了對串口的讀寫操作,給應用程序提供發送接收數據的接口。串口正常工作之前,需要進行初始化設置,選擇串口工作方式,設置波特率、數據格式及中斷,建立數據隊列和信號量。應用程序只要調用相應的函數,就可以實現相應的功能。
以串口發送一個字符串為例介紹發送程序,其中buf表示要發送的字符串,nbytes表示字符的個數:
int tty_write(char*buf,int nbytes)
{
int i;
for(i=0;inbytes;i++) {
write(tty_fd,buf[i],1);
usleep(100);
}
return tcdrain(tty_fd);
}
pid控制器相關文章:pid控制器原理
評論