第一篇:linux串口觸摸屏設(shè)計(jì)總結(jié)
Linux serial touch 設(shè)計(jì)總結(jié)
概述:
最近在做嵌入式linux下串口觸摸屏設(shè)計(jì),遇到一些問題,經(jīng)過查找資料和請教同事,總算把問題解決了,事后有把linux相關(guān)的內(nèi)核代碼仔細(xì)看了一遍,為了有點(diǎn)成果,特別寫了個(gè)總結(jié)。如有任何問題請聯(lián)系yxj_5421@163.com,轉(zhuǎn)載請標(biāo)明出處。
系統(tǒng)資源:
Linux:2.6.36
UI:QT+TSLIB 硬件資源不關(guān)心
設(shè)計(jì)方法:
有兩種實(shí)現(xiàn)途徑。
1、是將要使用的串口單獨(dú)拿出來,作為一個(gè)platform總線設(shè)備實(shí)現(xiàn),在嵌入式平臺mach文件里面,加上串口中斷號和寄存器首地址,然后將這個(gè)串口注冊成一個(gè)platform總線設(shè)備。在驅(qū)動(dòng)probe函數(shù)里面需要得到這個(gè)串口中斷號以及寄存器映射地址,通過寄存器映射地址設(shè)置串口波特率,數(shù)據(jù)位,停止位等,通過中斷號注冊中斷等,然后調(diào)用input_register_device注冊一個(gè)input設(shè)備。在中斷里面得到外面觸摸屏的數(shù)據(jù),然后根據(jù)input touch協(xié)議上報(bào)觸摸數(shù)據(jù)。這種方法實(shí)現(xiàn)簡單明了,不需要和linux的tty,serio等打交道。但是要求知道串口硬件spec,比如寄存器等,而且這個(gè)串口就只能給觸摸屏使用了,不能作為tty使用。因?yàn)槭乔度胧介_發(fā),因此很容易知道硬件spec,而且嵌入式平臺一旦確定,那么這個(gè)串口肯定就是給觸摸屏使用了。因此在嵌入式平臺上,推薦使用這個(gè)方法。
是將串口作為一個(gè)serio總線設(shè)備,利用linux內(nèi)核提供serio總線驅(qū)動(dòng),通過設(shè)置對應(yīng)的串口,調(diào)用serport提供的函數(shù)將串口當(dāng)做serio總線設(shè)備,在驅(qū)動(dòng)里面需要按照serio總線設(shè)備驅(qū)動(dòng)的框架來實(shí)現(xiàn),這方面的例子linux里面有很多,比如touchright.c,在模塊init函數(shù)里面調(diào)用serio_register_driver注冊serio總線設(shè)備驅(qū)動(dòng),如果serio總線上對應(yīng)的serio設(shè)備存在,就調(diào)用connect函數(shù),在這個(gè)函數(shù)里面調(diào)用input_register_device注冊一個(gè)input設(shè)備。具體驅(qū)動(dòng)不再分析了,很簡單,相信各位都能看的懂。
至此,兩種方法都實(shí)現(xiàn)了串口觸摸屏的驅(qū)動(dòng),講到這里是不是就完了,非也,本文的重點(diǎn)還在后面,請看下面分析:
第一種方法只要驅(qū)動(dòng)模塊被加載,就會(huì)在/dev/input下面創(chuàng)建一個(gè)eventx節(jié)點(diǎn),tslib就能訪問這個(gè)節(jié)點(diǎn),獲得觸摸坐標(biāo),然后送給qt。第二種方法驅(qū)動(dòng)模塊加載后,并沒有創(chuàng)建eventx節(jié)點(diǎn),也就是說connect函數(shù)沒有被調(diào)用,按照linux驅(qū)動(dòng)模型來看,就是serio總線上還沒有對應(yīng)的serio設(shè)備,因此驅(qū)動(dòng)加載時(shí)沒有對應(yīng)的設(shè)備,就不會(huì)調(diào)用connect函數(shù),這時(shí)的串口還是作為一個(gè)linux tty設(shè)備存在。
我遇到的問題就是serio驅(qū)動(dòng)加載了,但是沒有創(chuàng)建eventx節(jié)點(diǎn),查找資料也只有一個(gè)說是要把tty設(shè)置成N_MOUSE,然后讀,說的不清楚,也不知道怎么實(shí)現(xiàn),經(jīng)過自己摸索,終于把問題解決了。
2、Linux 啟動(dòng)后串口形式: Linux一啟動(dòng)是將串口作為tty來設(shè)置的。看下的調(diào)用:
start_kernel
init/main.c大家對這個(gè)函數(shù)不陌生吧,linux啟動(dòng)過程中重要的一個(gè)函數(shù)
console_init();
drivers/tty/tty_io.c
tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);drivers/tty/tty_idisc.c 給串口注冊一個(gè)tty鏈路層處理函數(shù)ops。
現(xiàn)在我們需要寫一個(gè)上層的應(yīng)用程序,對這個(gè)tty進(jìn)行設(shè)置,需要設(shè)置波特率,數(shù)據(jù)位,停止位等,最重要的是要將這個(gè)tty設(shè)備設(shè)置成一個(gè)serio總線設(shè)備,然后把它注冊在serio總線上,請看下面的代碼:
fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK);
if(fd < 0){
setline(fd, type->flags, type->speed);ldisc = N_MOUSE;if(ioctl(fd, TIOCSETD, &ldisc)){
} fprintf(stderr, “inputattach: can't set line disciplinen”);return EXIT_FAILURE;
} fprintf(stderr, “inputattach: '%s'-%sn”, device, strerror(errno));return 1;
里面的device就是對應(yīng)要使用的那個(gè)串口,linux里面一般是/dev/ttyS0,首先是打開串口 open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)接著設(shè)置波特率等 setline(fd, CS8, B9600);static void setline(int fd, int flags, int speed){
} struct termios t;tcgetattr(fd, &t);t.c_cflag = flags | CREAD | HUPCL | CLOCAL;t.c_iflag = IGNBRK | IGNPAR;t.c_oflag = 0;t.c_lflag = 0;t.c_cc[VMIN ] = 1;t.c_cc[VTIME] = 0;cfsetispeed(&t, speed);cfsetospeed(&t, speed);tcsetattr(fd, TCSANOW, &t);devt = type->type |(id << 8)|(extra << 16);if(ioctl(fd, SPIOCSTYPE, &devt)){ fprintf(stderr, “inputattach: can't set device typen”);} return EXIT_FAILURE;
read(fd, NULL, 0);
接下來就是重點(diǎn)了
ldisc = N_MOUSE;if(ioctl(fd, TIOCSETD, &ldisc))
跟蹤代碼到內(nèi)核層ioctl:
long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
drivers/tty/tty_io.c case TIOCSETD: return tiocsetd(tty, p);
drivers/tty/tty_io.c
tty_set_ldisc(tty, ldisc);drivers/tty/tty_idisc.c,ldisc等于N_MOUSE new_ldisc = tty_ldisc_get(ldisc);
ldops = get_ldops(disc);
這段代碼需要得到N_MOUSE的鏈路層,先在tty_ldiscs里面查找是否有N_MOUSE鏈路層的處理函數(shù)ops,如果沒有,就需要加載serport模塊,看看這個(gè)模塊init函數(shù) retval = tty_register_ldisc(N_MOUSE, &serport_ldisc);注冊一個(gè)N_MOUSE鏈路層的處理函數(shù)ops 創(chuàng)建一個(gè)新的N_MOUSE鏈路層new_ldisc,接著調(diào)用 tty_ldisc_assign(tty, new_ldisc);
把新的鏈路層放在tty里面 retval = tty_ldisc_open(tty, new_ldisc);打開這個(gè)新的鏈路層
至此,已經(jīng)給串口增加了一個(gè)N_MOUSE的鏈路層,并且把鏈路層的處理函數(shù)也注冊進(jìn)去了。這個(gè)串口當(dāng)前的鏈路層就是N_MOUSE。目前為止串口還只是個(gè)tty設(shè)備,并沒有注冊到serio總線上。繼續(xù)看我們的應(yīng)用程序:
devt = type->type |(id << 8)|(extra << 16);if(ioctl(fd, SPIOCSTYPE, &devt)){
fprintf(stderr, “inputattach: can't set device typen”);
return EXIT_FAILURE;} ret = ld->ops->open(tty)
ld->ops就是serport注冊的serport_ldisc static int serport_ldisc_open(struct tty_struct *tty)drivers/input/serio/serport.c 這個(gè)函數(shù)里面會(huì)創(chuàng)建一個(gè)serport結(jié)構(gòu)體,并初始化
調(diào)用
long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
drivers/tty/tty_io.c retval = ld->ops->ioctl(tty, file, cmd, arg);static int serport_ldisc_ioctl(struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned long arg)設(shè)置
serport->id.proto = type & 0x000000ff;serport->id.id
=(type & 0x0000ff00)>> 8;serport->id.extra =(type & 0x00ff0000)>> 16;這里三個(gè)值一定要和serio總線驅(qū)動(dòng)里面對應(yīng)的值一致,serio總線就是靠它們來給設(shè)備和驅(qū)動(dòng)建立聯(lián)系的。
調(diào)用
read(fd, NULL, 0);跟蹤代碼到內(nèi)核層tty_read:
static ssize_t tty_read(struct file *file, char __user *buf, size_t count,loff_t *ppos)(ld->ops->read)(tty, file, buf, count)
這個(gè)ld就是tty當(dāng)前的鏈路層結(jié)構(gòu),上面我們已經(jīng)設(shè)置N_MOUSE為tty的當(dāng)前鏈路層,因此ld->ops就是serport注冊的serport_ldisc static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, unsigned char __user * buf, size_t nr)
serio_register_port(serport->serio);
serio_init_port(serio);
serio_queue_event(serio, owner, SERIO_REGISTER_PORT);注冊一個(gè)serio總線設(shè)備,關(guān)于serio總線,網(wǎng)絡(luò)有很多資料介紹,這里就不說了。至此,我們的串口設(shè)備已經(jīng)當(dāng)做serio總線設(shè)備注冊在serio總線上了,如果相應(yīng)的驅(qū)動(dòng)也在serio總線上,就會(huì)進(jìn)行設(shè)備和驅(qū)動(dòng)的匹配,然后調(diào)用驅(qū)動(dòng)里面的connect函數(shù),在這個(gè)函數(shù)里面就會(huì)創(chuàng)建input節(jié)點(diǎn)。我們的驅(qū)動(dòng)和設(shè)備已經(jīng)運(yùn)行起來了,現(xiàn)在看看數(shù)據(jù)是如何傳遞的
先看具體串口中斷函數(shù): 我們以altera_uart.c為例: altera_uart_interrupt
altera_uart_rx_chars(pp)
tty_flip_buffer_push(port->state->port.tty);
flush_to_ldisc(&tty->buf.work);
disc->ops->receive_buf(tty, char_buf,flag_buf, count);disc->ops就是serport注冊的serport_ldisc static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)
serio_interrupt(serport->serio, cp[i], ch_flags);
ret = serio->drv->interrupt(serio, data, dfl);drv->interrupt就是我們驅(qū)動(dòng)函數(shù)提供一個(gè)函數(shù),它每次接受一個(gè)字符,在這個(gè)函數(shù)里面,接受到足夠信息后,就能得到觸摸屏坐標(biāo)信息,然后通過input_report上報(bào)上去。看看數(shù)據(jù)處理流程圖:
總結(jié):
要想讓基于serio總線驅(qū)動(dòng)的串口觸摸屏能正常工作,在linux內(nèi)核需要加載驅(qū)動(dòng)模塊,serport模塊。還需要一個(gè)上層應(yīng)用程序,這個(gè)程序需要進(jìn)行以下工作
1、打開你要使用的串口,比如
open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)
device為/dev/ttyS0
2、設(shè)置串口波特率等,和你的串口觸摸屏一致
3、給串口增加一個(gè)N_MOUSE鏈路層
4、設(shè)置你的串口觸摸屏type,id,extra
5、讀串口read(fd, NULL, 0);
第二篇:單片機(jī)串口總結(jié)
51單片機(jī)串口總結(jié)
有句話說“盡信書不如無書”,要學(xué)好單片機(jī)就要不斷的、大膽的實(shí)驗(yàn),要多懷疑,即使我們的懷疑最終被證明是錯(cuò)誤的那么這也是進(jìn)步(人們認(rèn)識事物很多情況下來源于懷疑),當(dāng)懷疑出現(xiàn)時(shí)就要去實(shí)踐。有很多東西如果不通過實(shí)踐是不可能掌握其中隱藏的奧秘,就拿51單片機(jī)串口通訊這一塊,我認(rèn)為掌握很好了,可以很輕松的實(shí)現(xiàn)數(shù)據(jù)的接收、發(fā)送,但這段時(shí)間當(dāng)我重新學(xué)習(xí)串口時(shí),我才發(fā)現(xiàn)里面還有很多小細(xì)節(jié)從沒注意,更別說研究了。對于接收發(fā)送程序永遠(yuǎn)是按照別人的模式來編寫程序,并沒有真真正正的挖掘深層次的內(nèi)容。我身邊太多的人在臨摹別人的程序,當(dāng)然我不反對,但是希望自己多問幾個(gè)問什么,單純的會(huì)編程是學(xué)不好單片機(jī)的,畢竟單片機(jī)有自己獨(dú)特的硬件結(jié)構(gòu)。
開講之前先簡要說一下同步、異步通信:
同步通信:發(fā)送方時(shí)鐘對接收方時(shí)鐘控制,使雙方達(dá)到完全同步。
異步通信:發(fā)送與接受設(shè)備使用各自的時(shí)鐘控制數(shù)據(jù)的發(fā)送和接受過程(雖然時(shí)鐘不同,但一般相差不大)。
51單片機(jī)串行口結(jié)構(gòu)
從上圖中我們看到,51單片機(jī)有兩個(gè)物理上獨(dú)立的接收、發(fā)送緩沖器SBUF,它們共用同一個(gè)地址99H,但是請注意:接收緩沖器只能讀而不能寫,發(fā)送緩沖器只寫不讀。單片機(jī)可以同時(shí)實(shí)現(xiàn)數(shù)據(jù)的發(fā)送與接收功能。
特別注意:接收器是雙緩沖結(jié)構(gòu):當(dāng)前一個(gè)字節(jié)從接收緩沖區(qū)取走之前,就已經(jīng)開始接收第
二個(gè)字節(jié)(串行輸入至移位寄存器),此時(shí)如果在第二個(gè)字節(jié)接收完畢而前一個(gè)字節(jié)還未被讀走,那么就會(huì)丟失前一個(gè)字節(jié)。
51單片機(jī)串口控制寄存器
關(guān)于51單片機(jī)的控制寄存器各個(gè)位表示的含義在這里我只談SM2。
SM2為多機(jī)控制位,主要用于工作方式2和3,當(dāng)接收機(jī)的SM2=1時(shí),可以利用接收到的RB8來控制是否激活RI(RB8=0不激活RI,收到的數(shù)據(jù)丟失;RB8=1時(shí)收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI ,進(jìn)而在中斷服務(wù)程序中將數(shù)據(jù)從SBUF中讀走)。當(dāng)SM2=0時(shí),不論收到的RB8為何值都將使接收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,通過控制SM2實(shí)現(xiàn)多機(jī)通信。
51單片機(jī)串口通訊方式
51串口通訊方式有3種,方式0、方式
1、方式2與方式3,他們的工作模式不盡相同。首先他們的波特率很容易忽視。方式0與方式2的波特率固定,而方式1和3的波特率由T1的溢出率決定。
方式0的波特率=f/12
系統(tǒng)晶振的12分頻,換句話說12M晶振的情況下,其波特率可達(dá)1M,速度是很高的(當(dāng)我們在選用串行器件并采用方式0時(shí)需要特別注意器件所能允許的最大時(shí)鐘頻率)。
方式2 =f/64或f/32(當(dāng)SMOD=1時(shí)為f/32,SMOD=0時(shí)為f/64)。
曾經(jīng)我用方式2進(jìn)行MODBUS通信時(shí),總是通訊失敗,我仔細(xì)檢查程序,沒有發(fā)現(xiàn)邏輯錯(cuò)誤,特別是當(dāng)我參考別人的程序時(shí),發(fā)現(xiàn)很少有人用方式2進(jìn)行MODBUS通訊,所以當(dāng)時(shí)自己妄下結(jié)論51單片機(jī)的串行方式2不可用,直到有一天夜里我突然想起方式2的波特率是固定的,試想晶振11.0592M/32或11.0592M/64怎么也不可能是9600啊,怎么可能通信成功。這才恍然大悟,看來還是自己太武斷了,沒有認(rèn)真看書啊。有時(shí)我們認(rèn)為我們犯這樣的錯(cuò)誤很低級,其實(shí)我們很多次都是因?yàn)檫@樣的小細(xì)節(jié)導(dǎo)致我們整個(gè)系統(tǒng)不正常,正所謂“千里之堤毀于蟻穴”,這些細(xì)節(jié)真的傷不起啊。
方式1、3波特率=(2smod/32)*T1的溢出率,其中TI的溢出率=f/{12*[256-(TH1)]}.關(guān)于3種通訊方式其中有幾點(diǎn)特別容易出錯(cuò):
1、無論采用哪種通訊方式,數(shù)據(jù)發(fā)送和接受都是低位在先,高位在后。、3種方式作為輸出,由于輸出是CPU主動(dòng)發(fā)送,不會(huì)產(chǎn)生重疊錯(cuò)誤,當(dāng)數(shù)據(jù)寫入SBUF后,發(fā)送便啟動(dòng)(通過單片機(jī)內(nèi)部邏輯控制,與程序無關(guān)),當(dāng)該字節(jié)發(fā)送結(jié)束(SBUF空),置TI。不要理解為當(dāng)數(shù)據(jù)一寫入SBUF就置位TI,如果中斷允許則在中斷中發(fā)送數(shù)據(jù),這就大錯(cuò)特錯(cuò)了。同樣作為輸入,可能會(huì)產(chǎn)生重疊錯(cuò)誤(主要依賴于特定的環(huán)境),當(dāng)一個(gè)字節(jié)的數(shù)據(jù)接收完畢(SBUF滿)置位RI,表示緩沖區(qū)有數(shù)據(jù)提示CPU讀取。
接下來通過一些實(shí)驗(yàn)具體說明串口通信中需要注意的地方 方式0輸出
方式0主要功能是作為移位寄存器,將數(shù)據(jù)從SBUF中逐位移出,最常見的用法就是外接串入并出的移位寄存器,如74LS164。之前在做這一部分實(shí)驗(yàn)時(shí)總是利用單片機(jī)I/O端口模擬實(shí)現(xiàn),現(xiàn)在想想在串口未被占用的情況下,方式0是最好的實(shí)現(xiàn)方式。
利用串口方式0,向74LS164輸出字符“0”的編碼,程序如下:
該程序采用了中斷方式實(shí)現(xiàn),結(jié)果是通過74LS164使數(shù)碼管顯示“0”。實(shí)驗(yàn)結(jié)果如下:
這里我說明幾點(diǎn): 如果采用查詢方式,并且只發(fā)送一遍,那么程序最后的while(1);不可以省略,否則會(huì)出現(xiàn)數(shù)碼管閃爍的現(xiàn)象(在KEIL環(huán)境下,main()函數(shù)也是作為一個(gè)調(diào)用函數(shù),最后也有返回RET,它不像C中的main()函數(shù),當(dāng)執(zhí)行完畢后就停止,而是重新復(fù)位執(zhí)行,如此反復(fù),這一點(diǎn)要特別注意)
這是查詢方式下不加while(1);的現(xiàn)實(shí)效果 如果采用中斷方式發(fā)送,請記得中斷中清除TI,僅僅是為了解除中斷標(biāo)志,而不是等待發(fā)送結(jié)束,因?yàn)榇藭r(shí)數(shù)據(jù)早已離開了SBUF跑到外邊去了。3 74LS164最高25MHZ,采用方式0,沒有問題。
方式0作為輸入模式
以74ls165(最高時(shí)鐘25MHZ)為例,可以滿足要求。
對應(yīng)結(jié)果如下:
(注意:74ls165線傳送高位,而串口通信低位在先,所以顯示的數(shù)據(jù)和實(shí)際數(shù)據(jù)高低位正好相反
P1.7---P1.0對應(yīng)D0---D7)。
本程序只接收一次,也許有人會(huì)問,中斷程序中REN=0,表示什么意思?可不可以改成ES=0?
這個(gè)問題很好,首先REN=0表示接收禁止,即不允許串口接收數(shù)據(jù);ES=0是禁止中斷和單片機(jī)是否接收數(shù)據(jù)沒有關(guān)系,不接收數(shù)據(jù)自然中斷允許也是徒勞,這兩者有很大的區(qū)別。我們在很多接收程序中經(jīng)常可以看到在判斷RI標(biāo)志后緊跟著清除標(biāo)志位,我想問一下,為什么?)
如果我們也按照這種模式改寫會(huì)怎樣呢?
實(shí)驗(yàn)結(jié)果如下
兩次結(jié)果差異怎么這么大?為什么會(huì)這樣子?
為了便于理解,也為了說明問題方便,對中斷程序做了如下處理:
結(jié)果又變了
是不是感覺很奇怪,究竟咋回事呢?
首先中斷程序中當(dāng)判斷RI置位標(biāo)志后緊跟著清零是為了接收下一個(gè)字節(jié)的數(shù)據(jù),也為了避免單片機(jī)重復(fù)中斷。
當(dāng)51單片機(jī)串口方式0作輸入時(shí),在REN=1且RI=0的條件下就啟動(dòng)了單片機(jī)串口接收過程。如果有一個(gè)條件不滿足就不能啟動(dòng)接收過程,以上出現(xiàn)的錯(cuò)誤正式由于忽略了這個(gè)重要的因素造成的。在RI清零后由于REN仍然為1,單片機(jī)已經(jīng)開始接收第二字節(jié)的數(shù)據(jù),由于串口速度很快,RI仍會(huì)置位,而緊接著將REN清零只能阻止單片機(jī)接收數(shù)據(jù),但是卻
不能阻擋第二次中斷。由于只接收了部分外部引腳數(shù)據(jù)(此時(shí)外部引腳為高電平,即邏輯1,其實(shí)單片機(jī)只接收了一位,對于12M晶振而言,方式0大約8us接收一個(gè)字節(jié)數(shù)據(jù))。相反在RI=0與REN=0之間加上適當(dāng)?shù)难舆t,就可以保證一個(gè)字節(jié)的數(shù)據(jù)全部接收完畢,故此時(shí)我們讀上來的一個(gè)字節(jié)為0xff。
我在中斷程序中添加了一個(gè)中斷計(jì)數(shù)器(不加延遲),發(fā)現(xiàn)中斷服務(wù)程序的確執(zhí)行了兩次
結(jié)果如下
加上延遲結(jié)果
這就驗(yàn)證了剛才的結(jié)論。
至于說可不可以換做ES=0,回答是可以的,盡管同樣可以實(shí)現(xiàn)數(shù)據(jù)的讀取,但是實(shí)質(zhì)不同,當(dāng)禁止中斷后,單片機(jī)仍在接收外部數(shù)據(jù),只是不再請求中斷,自然的不再讀取第2、3。。。字節(jié)的數(shù)據(jù),那么P1將保留第一次中斷時(shí)從SBUF中讀出的數(shù)據(jù)。如果某一時(shí)刻打開中斷發(fā)現(xiàn)結(jié)果不正常,如果理解了上面的機(jī)制就不會(huì)覺得驚訝了。建議:單次接收時(shí),中斷服務(wù)程序中REN清零放在RI之前。
還有一個(gè)問題非常重要:
如果我在中斷服務(wù)程序中不清除RI,會(huì)怎樣?
很少有人會(huì)這樣用,但是經(jīng)常有人忘記了(包括我)。課本上寫得很清楚,務(wù)必在中斷中用軟件清除RI,為什么要這樣呢?難道僅僅是為了接收下一次數(shù)據(jù)并且避免單片機(jī)不斷的響應(yīng)中斷?的確如此,如果對于一個(gè)小系統(tǒng)而言,不清除中斷標(biāo)志,那么單片機(jī)將不停的中斷,影響接下來任務(wù)的執(zhí)行,系統(tǒng)必然癱瘓,而且不能正常的接收數(shù)據(jù)。總結(jié):方式0作為發(fā)送方,只要向SBUF中寫入數(shù)據(jù)就啟動(dòng)了發(fā)送過程;
方式0在座位接收模式時(shí),REN=
1、RI=0的情況下就已經(jīng)啟動(dòng)了接收過程。在中斷程序中要注意兩者清零的順序。
還有一種情況要特別注意:單片機(jī)復(fù)位時(shí)SCON自動(dòng)清零,如果單片機(jī)不工作在方式0,那么如果采用位操作SCON時(shí)也要注意REN=1與SM0、SM1的書寫順序,總之切記方式0啟動(dòng)發(fā)送、接收數(shù)據(jù)的條件。
方式1 方式1為10位異步通信模式。作為輸出和方式0沒有本質(zhì)的區(qū)別,不同的是數(shù)據(jù)幀的形式,但是對于接受模式則有點(diǎn)不同,當(dāng)REN=1且RI=0時(shí),單片機(jī)并不啟動(dòng)接收過程。而是以已選擇波特率的16倍速率采樣RXD引腳的電平,當(dāng)檢測到輸入引腳發(fā)生1---0負(fù)跳變時(shí),則說明起始位有效,才開始接受本幀數(shù)據(jù)。方式1模式下 單片機(jī)可以工作在全雙工以及半雙工方式。下面舉兩個(gè)例子
半雙工
主機(jī)發(fā)送某一字符,從機(jī)接收到數(shù)據(jù)后返回?cái)?shù)據(jù)加1的值 比如 主機(jī)發(fā)送“1“,從機(jī)收到后回復(fù)主機(jī)”2“。實(shí)驗(yàn)結(jié)果如下:
方式1工作方式主要注意: 1 波特率可變。數(shù)據(jù)接收以起始位為標(biāo)志,停止位結(jié)束。當(dāng)RI=0且SM2=0或接收到有效停止位時(shí),單片機(jī)將接收到的數(shù)據(jù)移入SBUF中,兩個(gè)條件缺一不可。
方式2和方式3 方式2和3不同的只是波特率,這里以方式3為例
作為輸出模式同方式1沒有區(qū)別,只是增加了第八位數(shù)據(jù)位,第八位數(shù)據(jù)可以用作校驗(yàn)位或在多機(jī)通信中用作數(shù)據(jù)/地址幀的判別位。
首先我們來做模擬主從奇偶校驗(yàn)?zāi)J?/p>
主機(jī)發(fā)送一幀數(shù)據(jù),并發(fā)送奇偶校驗(yàn)位,從機(jī)接收數(shù)據(jù)后,判斷數(shù)據(jù)是否正確,如果正
確,接收指示燈亮,并且回送主機(jī)數(shù)據(jù)加1,反之回送0;主機(jī)接收從機(jī)信息,如果校驗(yàn)正確點(diǎn)亮LED指示燈.(從機(jī)、主機(jī)接收數(shù)據(jù)無論校驗(yàn)正確與否,均顯示接收到的字節(jié)數(shù)據(jù))。奇校驗(yàn)?zāi)J?演示結(jié)果如下:
(注:從接接收不正確,返回0)
主從機(jī)接收正確效果
之前我們已經(jīng)介紹了SM2的具體用法,主要用于多機(jī)通信,將SM2作為數(shù)據(jù)/地址幀 的判別位,在接收地址時(shí)令SM2=1,當(dāng)接收到的第八位數(shù)據(jù)為1時(shí)激活RI產(chǎn)生中斷,然后比較地址,如果地址符合則清除SM2準(zhǔn)備接受數(shù)據(jù)信息,反之不理睬。
特別注意 當(dāng)RI=0且SM2=0(或SM2=1時(shí)接收到第9位數(shù)據(jù)為1)時(shí),單片機(jī)將接收到的數(shù)據(jù)移入SBUF中,兩個(gè)條件缺一不可。
在這里我只舉一個(gè)簡單的例子 一個(gè)主機(jī),兩個(gè)從機(jī) 起始時(shí),主機(jī)從機(jī)的SM2均置位,所有的從機(jī)等待主機(jī)發(fā)送地址幀,主機(jī)令TB8=1,發(fā)送地址幀。所用的從機(jī)將接受到的地址和自己的地址比較,如果符合,點(diǎn)亮LED指示燈,清除SM2(準(zhǔn)備接受主機(jī)發(fā)送的數(shù)據(jù)幀),并將自己的地址發(fā)送到主機(jī)。主機(jī)接收從機(jī)發(fā)送的地址信息,如果地址符合則數(shù)碼管顯示從機(jī)地址并開始準(zhǔn)備發(fā)送數(shù)據(jù),反之發(fā)復(fù)位信號,TB8=1。從機(jī)接收數(shù)據(jù)先判斷RB8,如果RB8=1,則復(fù)位,重新開始接收主機(jī)發(fā)送的地址幀,反之通過P1口外接數(shù)碼管顯示接收到的數(shù)據(jù)。實(shí)驗(yàn)結(jié)果如下:
注意:如果主機(jī)沒有得到正確的地址,則將按照一定的速率發(fā)送地址幀,直到接收正確的地址為止,該試驗(yàn)主機(jī)向從機(jī)2發(fā)送信息。
另外在這里我補(bǔ)充兩點(diǎn): 我們可以很方便的利用串口通信的工作方式2或3實(shí)現(xiàn)奇偶校驗(yàn),注意技巧,當(dāng)為偶校驗(yàn)時(shí)TB8=P,奇校驗(yàn)時(shí)TB8=~P;
2當(dāng)單片機(jī)利用中斷發(fā)送大量數(shù)據(jù)時(shí),盡量采用中斷發(fā)送,因?yàn)閱纹瑱C(jī)在寫入SBUF數(shù)據(jù)后由硬件將數(shù)據(jù)發(fā)送完,在發(fā)送過程中,單片機(jī)還可以做很多事情,利用中斷發(fā)送數(shù)據(jù)可以提高CPU利用率。尤其在低波特率時(shí)效果更明顯。
第三篇:嵌入式論文關(guān)于觸摸屏設(shè)計(jì)
嵌入式實(shí)驗(yàn)課程設(shè)計(jì)
題
目 基于嵌入式的觸摸屏控制實(shí)驗(yàn)
院
系
電子工程系
專
業(yè)
信息工程
學(xué)
號
20092309022
姓
名
楊 金 磊
指導(dǎo)教師
董立軍
二O一二 年 六 月 八 日
目 錄
1.要求.............................................................2 1.1設(shè)計(jì)目的......................................................1 1.2 設(shè)計(jì)意義......................................................2 1.3 設(shè)計(jì)內(nèi)容......................................................2 1.4 主要任務(wù)......................................................2 2.正文.............................................................3 2.1觸摸屏工作原理(觸摸屏接口工作模式)..........................3 2.2、設(shè)計(jì)總體方案.................................................4 2.3、設(shè)計(jì)所需工具.................................................5 2.4、平臺構(gòu)建過程.................................................5
2.4.1、硬件平臺搭建.............................................5 2.4.2根文件系統(tǒng)的制作...........................................7(1)根文件系統(tǒng).................................................7 3.程序............................................................11 3.1.程序流程圖:.................................................11 3.2.分析驅(qū)動(dòng).....................................................11 3.2.1、觸摸屏設(shè)備驅(qū)動(dòng)中數(shù)據(jù)結(jié)構(gòu)................................11 3.2.2、觸摸屏驅(qū)動(dòng)模塊加載和卸載函數(shù)............................13 3.2.3、觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)..................................15 3.2.4、觸摸屏設(shè)備驅(qū)動(dòng)的輪詢與異步通知..........................15 3.2.5源程序觸摸屏驅(qū)動(dòng)代碼:....................................16 3.2.6、實(shí)驗(yàn)結(jié)果顯示:..........................................27 4.心得............................................................28 4.1 課程設(shè)計(jì)心得體會(huì):...........................................28 5.參考文獻(xiàn)........................................................28
5.1【參考文獻(xiàn)】..................................錯(cuò)誤!未定義書簽。
第一章 要求
1.1 設(shè)計(jì)目的
(1)基于WINDOWS操作系統(tǒng),以及實(shí)驗(yàn)箱,利用觸摸屏返回觸點(diǎn)坐標(biāo)值及動(dòng)作信息。
(2)坐標(biāo)及動(dòng)作的具體顯示:觸摸筆動(dòng)作,觸點(diǎn)X坐標(biāo)值,觸點(diǎn)Y坐標(biāo)值。
1.2 設(shè)計(jì)意義
(1)熟悉嵌入式系統(tǒng)開發(fā)平臺
(2)掌握ARM嵌入式操作系統(tǒng)下的各個(gè)指令的使用方法(3)了解觸摸屏的原理
1.3 設(shè)計(jì)內(nèi)容
(1)系統(tǒng)的正確移植和使用(2)根文件系統(tǒng)的正確移植和使用(3)驅(qū)動(dòng)程序的編譯與裝載
(4)嵌入式系統(tǒng)下應(yīng)用程序的交叉編譯及下載與調(diào)試
1.4 主要任務(wù)
(1)熟悉實(shí)驗(yàn)的流程(2)理解驅(qū)動(dòng)程序源代碼
(3)調(diào)用驅(qū)動(dòng)程序的某些函數(shù),編譯與調(diào)試應(yīng)用程序
第二章 正文
2.1觸摸屏工作原理(觸摸屏接口工作模式)
(1)普通轉(zhuǎn)換模式
普通轉(zhuǎn)換模式(AUTO_PST = 0,XY_PST = 0)是用作一般目的下的ADC轉(zhuǎn)換。這個(gè)模式可以通過設(shè)置ADCCON和ADCTSC來進(jìn)行對AD轉(zhuǎn)換的初始化;而后讀取ADCDAT0(ADC數(shù)據(jù)寄存器0)的XPDATA域(普通ADC轉(zhuǎn)換)的值來完成轉(zhuǎn)換。(2)分離的X/Y軸坐標(biāo)轉(zhuǎn)換模式:X軸坐標(biāo)轉(zhuǎn)換和Y軸坐標(biāo)轉(zhuǎn)換。
X軸坐標(biāo)轉(zhuǎn)換(AUTO_PST=0且XY_PST=1)將X軸坐標(biāo)轉(zhuǎn)換數(shù)值寫入到ADCDAT0寄存器的XPDATA域。轉(zhuǎn)換后,觸摸屏接口將產(chǎn)生中斷源(INT_ADC)到中斷控制器。
Y軸坐標(biāo)轉(zhuǎn)換(AUTO_PST=0且XY_PST=2)將X軸坐標(biāo)轉(zhuǎn)換數(shù)值寫入到ADCDAT1寄存器的YPDATA域。轉(zhuǎn)換后,觸摸屏接口將產(chǎn)生中斷源(INT_ADC)到中斷控制器。
(3)自動(dòng)(連續(xù))X/Y軸坐標(biāo)轉(zhuǎn)換模式。
自動(dòng)(連續(xù))X/Y軸坐標(biāo)轉(zhuǎn)換模式(AUTO_PST=1且XY_PST= 0)以下面的步驟工作:
觸摸屏控制器將自動(dòng)地切換X軸坐標(biāo)和Y軸坐標(biāo)并讀取兩個(gè)坐標(biāo)軸方向上的坐標(biāo)。觸摸屏控制器自動(dòng)將測量得到的X軸數(shù)據(jù)寫入到ADCDAT0寄存器的XPDATA域,然后將測量到的Y軸數(shù)據(jù)到ADCDAT1的YPDATA域。自動(dòng)(連續(xù))轉(zhuǎn)換之后,觸摸屏控制器產(chǎn)生中斷源(INT_ADC)到中斷控制器。(4)等待中斷模式
當(dāng)觸摸屏控制器處于等待中斷模式下時(shí),它實(shí)際上是在等待觸摸筆的點(diǎn)擊。在觸摸筆點(diǎn)擊到觸摸屏上時(shí),控制器產(chǎn)生中斷信號(INC_TC)。中斷產(chǎn)生后,就可以通過設(shè)置適當(dāng)?shù)霓D(zhuǎn)換模式(分離的X/Y軸坐標(biāo)轉(zhuǎn)換模式或自動(dòng)X/Y軸
坐標(biāo)轉(zhuǎn)換模式)來讀取X和Y的位置。(5)靜態(tài)(Standby)模式
當(dāng)ADCCON寄存器的STDBM位被設(shè)為1時(shí),Standby模式被激活。在該模式下,A/D轉(zhuǎn)換操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持著先前轉(zhuǎn)換所得的值。
2.2、設(shè)計(jì)總體方案
2.2.1 軟件
(1)Embest Online Flash Programmer For ARM: Embest Flash在線編程器(2)HYPER TERMINAL(超級終端):傳送vivi.nand;
傳送vivi.nand
vivi> load flash kernel x <回車> 燒寫更新內(nèi)核,傳送zImage文件;等待傳送內(nèi)核:
vivi>load flash root j <回車> 燒寫更新文件系統(tǒng);燒寫新的文件系統(tǒng) load flash root j
(3)EmbestIDE Pro for ARM: 應(yīng)用于嵌入式軟件開發(fā)的新一代集成開發(fā)環(huán)境,是一個(gè)高度集成的圖形界面操作環(huán)境,包含編輯器、編譯匯編鏈接器、調(diào)試器、工程管理、Flash 編程等工具;支持的開發(fā)語言包括標(biāo)準(zhǔn)C和匯編語言。(4)cygwin: 4
一個(gè)在windows平臺上運(yùn)行的unix模擬環(huán)境,它對于學(xué)習(xí)unix/linux操作環(huán)境,或者從unix到windows的應(yīng)用程序移植,或者進(jìn)行某些特殊的開發(fā)工作,尤其是使用gnu工具集在windows上進(jìn)行嵌入式系統(tǒng)開發(fā),把gcc,gdb,gas等開發(fā)工具進(jìn)行了改進(jìn),能夠生成并解釋win32的目標(biāo)文件。2.2.2 硬件
S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,32位微控制器。該處理器擁有:獨(dú)立的16KB指令Cache和16KB數(shù)據(jù)Cache,MMU,支持TFT的LCD控制器,NAND閃存控制器,3路UART,4路DMA,4路帶PWM的Timer,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2個(gè)USB主機(jī),1個(gè)USB設(shè)備,SD主機(jī)和MMC接口,2路SPI。S3C2410處理器最高可運(yùn)行在203MHz。
2.3、設(shè)計(jì)所需工具
2.3.1 軟件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超級終端),EmbestIDE Pro for ARM,cygwin 2.3.2 硬件:s3c2410開發(fā)板,Embest實(shí)驗(yàn)箱
2.4、平臺構(gòu)建過程
2.4.1、硬件平臺搭建
硬件流程圖:
(1)Vivi燒寫過程
1)首先把SW104斷開,F(xiàn)lash Programmer的Program,在File選擇Open打開要燒寫的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program頁中選擇要燒寫的文件vivi.bon&load.bin。點(diǎn)擊按鈕 Progarm 開始燒寫,直到燒寫成功
2)連接串口線到 PC 機(jī) COM1,運(yùn)行光盤中提供的 Windows 超級終端Hyper Terminal.ht 把開發(fā)板重新加電,程序運(yùn)行后,在超級終端上可以看到串口輸出Wating,表示正在等待用戶從超級終端下載文件。這時(shí),請點(diǎn)擊超級終端菜單“傳送”選擇 Xmodem 方式下載 vivi.nand 文件,點(diǎn)擊 OK 后等待下載燒寫結(jié)束即可。(2)內(nèi)核zImage燒寫
1)首先SW104設(shè)為短接(從Nand Flash啟動(dòng)),并確定已經(jīng)燒寫vivi.nand,加電。)在vivi啟動(dòng)等待中,敲入空格鍵進(jìn)入vivi界面環(huán)境,并輸入以下命令:vivi> load flash kernel x <回車> 燒寫更新內(nèi)核約1分鐘即可燒寫完畢)點(diǎn)擊超級終端菜單中的“傳送”,選“發(fā)送文件”zImage” 并選擇xModem方式傳送)燒寫結(jié)束,重起實(shí)驗(yàn)板,觀測超級終端窗口提示信息就可以啟動(dòng)linux內(nèi)核,(3)新文件系統(tǒng)的燒寫
1)首先SW104設(shè)為短接(從Nand Flash啟動(dòng)),確定已經(jīng)成功燒寫vivi.nand,加電運(yùn)行可以看到vivi啟動(dòng)信息,輸入空格進(jìn)入命令狀態(tài);
2)雙擊運(yùn)行Download.pjf(該文件在/tmp/edukit-2410/image/中)工程(將啟動(dòng)Embest IDE環(huán)境),點(diǎn)擊連接Remote connect,程序應(yīng)該正在運(yùn)行(命令按鈕STOP為紅色);在串口輸入help,看看有沒有反應(yīng),如果沒反應(yīng),點(diǎn)擊IDE 按鈕:Reset->Start(F5);再輸入help測試,直到有反應(yīng)為止;
3)如果可以輸出一些信息,再點(diǎn)擊IDE中的Stop,配置Debug的Download地 6
址為0x30000000,并點(diǎn)擊IDE菜單Project選擇Settings項(xiàng),在Download頁下拉Category到Download項(xiàng),在Download File選擇root.cramfs文件,點(diǎn)擊確定后:
點(diǎn)擊IDE菜單DEBUG選擇Download下載文件系統(tǒng)映象? 下載完畢后,點(diǎn)擊Start(F5)然后在超級終端里輸入: load flash root j(燒寫更新文件系統(tǒng))?
注意:只能在“vivi的燒寫”操作完成后,才可以按以上方法正確燒寫root映象到Nand Flash。
重起實(shí)驗(yàn)板,觀測超級終端窗口提示信息,引導(dǎo)整個(gè)系統(tǒng)啟動(dòng)到linux行命令輸入狀態(tài)。
2.4.2根文件系統(tǒng)的制作(1)根文件系統(tǒng)
根文件系統(tǒng)是Linux系統(tǒng)的核心部分,包含系統(tǒng)使用的軟件和庫,以及所有用來為用戶提供支持架構(gòu)和用戶使用的應(yīng)用軟件,并作為儲存數(shù)據(jù)讀寫結(jié)果的區(qū)域。在Linux系統(tǒng)啟動(dòng)時(shí),首先完成內(nèi)核安裝及環(huán)境初始化,最后會(huì)尋找一個(gè)文件系統(tǒng)作為根文件系統(tǒng)被加載。Linux系統(tǒng)中使用“/”來唯一表示根文件系統(tǒng)的安裝路徑。嵌入式系統(tǒng)中通常可以懸著的根文件系統(tǒng)有:Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至還可以使用NFS作為根文件系統(tǒng)。
(2)cramfs文件系統(tǒng)
Cramfs是Linux創(chuàng)始人Linux torvalds開發(fā)的一個(gè)適用于嵌入式系統(tǒng)的小文件系統(tǒng)。Cramfs是一個(gè)只讀文件系統(tǒng),采用zlib壓縮,壓縮比一般可以達(dá)到1:2,但仍可以做到高效的隨機(jī)讀取。Linux系統(tǒng)中,通常把需要修改的目錄壓縮存放,并在系統(tǒng)引導(dǎo)的時(shí)候再將壓縮文件解開。因?yàn)閏ramfs不會(huì)影響系統(tǒng)讀取文件的速度,而且是一個(gè)高度壓縮的文件系統(tǒng),因此非常廣泛應(yīng)用于嵌入式系統(tǒng)中。
(3)cygwin簡介
Cygwin是一個(gè)在windows平臺上運(yùn)行的unix/Linux模擬環(huán)境,是cygnus solutions公司開發(fā)的自由軟件。Cygwin中,“/”表示根目錄,即cygwin的安裝目錄。我們常用的set_env_linux.sh中定義的目錄有:
SOURCEDIR:/tmp/edukit-2410存儲了vivi、linux、fs等源代碼和例程 WORKDIR:/usr/local/src/edukit-2410工作區(qū)。
一般情況下都要把已經(jīng)規(guī)劃好的目錄結(jié)構(gòu)轉(zhuǎn)換成一個(gè)映象文件,即使用命令工具 mkcramfs(cygwin下為 mkcramfs.exe),把相應(yīng)的 cramfs 目錄樹壓縮為單一的映象文件。其命令格式為:
mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 可以使用我們提供的 mkcramfs.exe 在 cygwin 下編譯生成文件系統(tǒng)映象文件 root.cramfs,再固化到開發(fā)系統(tǒng) FLASH 上運(yùn)行。
(4)常用的Linux行命令
1)、cd 改變當(dāng)前目錄(文件夾)。例如下,cd/ 返回到根目錄 cd..退回到上級目錄
cd/tmp/edukit-2410/進(jìn)入/tmp/edukit-2410/文件夾 2)、ls 列出當(dāng)前目錄中的內(nèi)容。Ls 簡單格式列表 ls–l 使用詳細(xì)格式列表。3)、pwd 顯示當(dāng)前所在的目錄。
(5)tar工具命令
tar 程序用于儲存或展開 tar 存檔文件。命令格式:
tar [-參數(shù)] [文件名][路徑]-x :extract |--get 從存檔展開文件-v :--verbose 詳細(xì)顯示處理的文件-j :--有 bz2 屬性的必須包含
-f :--file [HOSTNAME:]F 指定存檔或設(shè)備(缺省為 /dev/rmt0)
(6)解壓原文件系統(tǒng)(命令+解壓目錄的存放)
1)先將 root.cramfs.tar.bz2文件放在C:cygwin目錄中 2)解壓文件系統(tǒng)
運(yùn)行cygwin,執(zhí)行以下命令解壓安裝:
$> source /tmp/edukit-2410/set_env_linux.sh? Linux編譯環(huán)境變量設(shè)置 $> cd /
$> tar-xvjf root.cramfs.tar.bz2 $> ls ? root ?
root文件夾中就是我們想要的cramfs文件系統(tǒng) 3)如果在根目錄中產(chǎn)生root文件夾,解壓成功 4)在root目錄中新建xx文件夾,用于存放應(yīng)用程序
進(jìn)入該目錄后執(zhí)行以下命令編譯鏈接測試程序: $> cd root $>mkdir xx
(7)編譯應(yīng)用程序 ts.c(命令+生成文件格式+存放位置): 將編寫好的ts.c程序放在C:cygwin目錄中 進(jìn)入該目錄后執(zhí)行以下命令編譯鏈接測試程序: $> cd / $> arm-linux-gcc-o ts ts.c(也可以編寫Makefile來編譯)
生成文件: ts 如下圖所示
將ts文件放入root 下的xx文件夾中
(8)新文件系統(tǒng)的制作: 把剛才編譯輸出的ts文件拷貝到文件系統(tǒng)所在的工作目錄root目錄下,執(zhí)行以下命令生成新的文件系統(tǒng)映象:
$> cd /
$> mkcramfs root root.new
剛剛編譯生成的文件系統(tǒng)映象 root.new 中已經(jīng)包含測試程序即生成文件。解壓文件系統(tǒng)在root目錄中新建xx文件夾,用于存放應(yīng)用 將編寫好的ts.c程序放在C:cygwin目錄中 生成文件: ts 如下圖所示
新文件系統(tǒng)的制作
生成文件:
第三章 程序
3.1.程序流程圖:
3.2.分析驅(qū)動(dòng)
觸摸屏驅(qū)動(dòng)在/kernel/drivers/char/s3c2410-ts.c 文件中。
3.2.1、觸摸屏設(shè)備驅(qū)動(dòng)中數(shù)據(jù)結(jié)構(gòu)
(1)觸摸屏的file_operations static struct file_operations s3c2410_fops={ owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release, #ifdef USE_ASYNC fasync: s3c2410_ts_fasync,//異步通知
#endif poll: s3c2410_ts_poll,//輪詢 };(2)觸摸屏設(shè)備結(jié)構(gòu)體的成員與按鍵設(shè)備結(jié)構(gòu)體的成員類似,也包含一個(gè)緩沖區(qū),同時(shí)包括自旋鎖、等待隊(duì)列和fasync_struct指針 typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun(環(huán)形緩沖區(qū))*/ unsigned int head, tail;/* head and tail for queued events(環(huán)形緩沖區(qū)的頭尾)*/ wait_queue_head_t wq;//* 等待隊(duì)列數(shù)據(jù)結(jié)構(gòu) spinlock_t lock;//* 自旋鎖
#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;//友善之臂專有的,我后面的代碼刪除了這段 #endif } TS_DEV;
(3)觸摸屏結(jié)構(gòu)體中包含的TS_RET值的類型定義,包含X、Y坐標(biāo)和狀態(tài)(PEN_DOWN、PEN_UP)等信息,這個(gè)信息會(huì)在用戶讀取觸摸信息時(shí)復(fù)制到用戶空 間
typedef struct { 12
unsigned short pressure;//* 壓力,這里可定義為筆按下,筆抬起,筆拖曳
unsigned short x;//* 橫坐標(biāo)的采樣值 unsigned short y;//* 縱坐標(biāo)的采樣值 unsigned short pad;//* 填充位 } TS_RET;
(4)在觸摸屏設(shè)備驅(qū)動(dòng)中,將實(shí)現(xiàn)open()、release()、read()、fasync()和poll()函數(shù),因此,其文件操作結(jié)構(gòu)體定義
觸摸屏驅(qū)動(dòng)文件操作結(jié)構(gòu)體:static struct file_operations s3c2410fops={} _3.2.2、觸摸屏驅(qū)動(dòng)模塊加載和卸載函數(shù)
(1)在觸摸屏設(shè)備驅(qū)動(dòng)的模塊加載函數(shù)中,要完成申請?jiān)O(shè)備號、添加cdev、申請中斷、設(shè)置觸摸屏控制引腳(YPON、YMON、XPON、XMON)等多項(xiàng)工作 觸摸屏設(shè)備驅(qū)動(dòng)的模塊加載函數(shù)
static int __init s3c2410_ts_init(void)觸摸屏設(shè)備驅(qū)動(dòng)模塊卸載函數(shù)
static void __exit s3c2410_ts_exit(void)(2)可知觸摸屏驅(qū)動(dòng)中會(huì)產(chǎn)生兩類中斷,一類是觸點(diǎn)中斷(INT-TC),一類是X/Y位置轉(zhuǎn)換中斷(INT-ADC)。在前一類中斷發(fā)生后,若之前處于PEN_UP狀態(tài),則應(yīng)該啟動(dòng)X/Y位置轉(zhuǎn)換。另外,將抬起中斷也放在INT-TC處理程序中,它會(huì)調(diào)用tsEvent()完成等待隊(duì)列和信號的釋放 觸摸屏設(shè)備驅(qū)動(dòng)的觸點(diǎn)/抬起中斷處理程序
static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)
當(dāng)X/Y位置轉(zhuǎn)換中斷發(fā)生后,應(yīng)讀取X、Y的坐標(biāo)值,填入緩沖區(qū) 觸摸屏設(shè)備驅(qū)動(dòng)X/Y位置轉(zhuǎn)換中斷處理程序
static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)觸摸屏設(shè)備驅(qū)動(dòng)中獲得X、Y坐標(biāo)
static inline void s3c2410_get_XY(void)(3)tsEvent最終為tsEvent_raw(),這個(gè)函數(shù)很關(guān)鍵,當(dāng)處于PEN_DOWN狀態(tài)時(shí)調(diào)用該函數(shù),它會(huì)完成緩沖區(qū)的填充、等待隊(duì)列的喚醒以及異步通知信號的釋放;否則(處于PEN_UP狀態(tài)),將緩沖區(qū)頭清0,也喚醒等待隊(duì)列并釋放信號
觸摸屏設(shè)備驅(qū)動(dòng)的tsEvent_raw()函數(shù) static void tsEvent_raw(void)(4)在包含了對拖動(dòng)軌跡支持的情況下,定時(shí)器會(huì)被啟用,周期為10ms,在每次定時(shí)器處理函數(shù)被引發(fā)時(shí),調(diào)用start_ts_adc()開始X/Y位置轉(zhuǎn)換過程
觸摸屏設(shè)備驅(qū)動(dòng)的定時(shí)器處理函數(shù)
static void tstimerhandler(unsigned long data)(5)在觸摸屏設(shè)備驅(qū)動(dòng)的打開函數(shù)中,應(yīng)初始化緩沖區(qū)、penStatus和定期器、等待隊(duì)列及tsEvent時(shí)間處理函數(shù)指針 觸摸屏設(shè)備驅(qū)動(dòng)的打開函數(shù)
static int s3c2410tsopen(struct inode *inode, struct file *filp)
_
_
_
_ 14
(6)觸摸屏設(shè)備驅(qū)動(dòng)的釋放函數(shù)非常簡單,刪除為用于拖動(dòng)軌跡所使用的定時(shí)器即可
觸摸屏設(shè)備驅(qū)動(dòng)的釋放函數(shù)
static int s3c2410tsrelease(struct inode *inode, struct file *filp)
_
_3.2.3、觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)
觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)實(shí)現(xiàn)緩沖區(qū)中信息向用戶空間的復(fù)制,當(dāng)緩沖區(qū)有內(nèi)容時(shí),直接復(fù)制;否則,如果用戶阻塞訪問觸摸屏,則進(jìn)程在等待隊(duì)列上睡眠,否則,立即返回-EAGAIN 觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)
static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, sizet count, lofft *ppos)_
_3.2.4、觸摸屏設(shè)備驅(qū)動(dòng)的輪詢與異步通知
在觸摸屏設(shè)備驅(qū)動(dòng)中,通過s3c2410_ts_poll()函數(shù)實(shí)現(xiàn)了輪詢接口,這個(gè)函數(shù)的實(shí)現(xiàn)非常簡單。它將等待隊(duì)列添加到poll_table,當(dāng)緩沖區(qū)有數(shù)據(jù)時(shí),返回資源可讀取標(biāo)志,否則返回0 觸摸屏設(shè)備驅(qū)動(dòng)的poll()函數(shù)
static unsigned int s3c2410_ts_poll(struct file *filp, struct polltablestruct *wait)而為了實(shí)現(xiàn)觸摸屏設(shè)備驅(qū)動(dòng)對應(yīng)用程序的異步通知,設(shè)備驅(qū)動(dòng)中要實(shí)現(xiàn)s3c2410_ts_fasync()函數(shù) 觸摸屏設(shè)備驅(qū)動(dòng)的fasync()函數(shù) __
static int s3c2410_ts_fasync(int fd, struct file *filp, int mode)3.2.5源程序觸摸屏代碼:
/* * s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 * * Author: Janghoon Lyu
#include
#include
#include
#ifdef CONFIG_PM #include
/* debug macros */ #undef DEBUG #ifdef DEBUG #define DPRINTK(x...)printk(“s3c2410-ts: ” ##x)#else #define DPRINTK(x...)#endif
#define PEN_UP 0
#define PEN_DOWN 1 #define PEN_FLEETING 2 #define MAX_TS_BUF 16 /* how many do we want to buffer */
#undef USE_ASYNC 1 #define DEVICE_NAME “s3c2410-ts” #define TSRAW_MINOR 1
typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun */ unsigned int head, tail;/* head and tail for queued events */ wait_queue_head_t wq;spinlock_t lock;#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;#endif } TS_DEV;
static TS_DEV tsdev;
#define BUF_HEAD(tsdev.buf[tsdev.head])#define BUF_TAIL(tsdev.buf[tsdev.tail])#define INCBUF(x,mod)((++(x))&((mod)-1))
static int tsMajor = 0;
static void(*tsEvent)(void);
#define HOOK_FOR_DRAG #ifdef HOOK_FOR_DRAG #define TS_TIMER_DELAY(HZ/100)/* 10 ms */ static struct timer_list ts_timer;#endif
#define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN |
XP_AIN | XM_HIZ | YP_AIN | YM_GND |
XP_PST(WAIT_INT_MODE);} #define wait_up_int(){ ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ |
YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE);} #define mode_x_axis(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |
XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE);} #define mode_x_axis_n(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |
XP_PULL_UP_DIS | XP_PST(NOP_MODE);} #define mode_y_axis(){ ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND |
XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE);} #define start_adc_x(){ ADCCON = PRESCALE_EN | PRSCVL(49)|
ADC_INPUT(ADC_IN5)| ADC_START_BY_RD_EN |
ADC_NORMAL_MODE;
ADCDAT0;} #define start_adc_y(){ ADCCON = PRESCALE_EN | PRSCVL(49)|
ADC_INPUT(ADC_IN7)| ADC_START_BY_RD_EN |
ADC_NORMAL_MODE;
ADCDAT1;} #define disable_ts_adc(){ ADCCON &= ~(ADCCON_READ_START);}
static int adc_state = 0;static int x, y;/* touch screen coorinates */
static void tsEvent_raw(void){ if(tsdev.penStatus == PEN_DOWN){
BUF_HEAD.x = x;
BUF_HEAD.y = y;
BUF_HEAD.pressure = PEN_DOWN;
#ifdef HOOK_FOR_DRAG
ts_timer.expires = jiffies + TS_TIMER_DELAY;
add_timer(&ts_timer);#endif } else { #ifdef HOOK_FOR_DRAG
del_timer(&ts_timer);#endif
BUF_HEAD.x = 0;
BUF_HEAD.y = 0;
BUF_HEAD.pressure = PEN_UP;}
tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);wake_up_interruptible(&(tsdev.wq));
#ifdef USE_ASYNC if(tsdev.aq)
kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);#endif
#ifdef CONFIG_PM pm_access(tsdev.pm_dev);#endif }
static int tsRead(TS_RET * ts_ret){ spin_lock_irq(&(tsdev.lock));ts_ret->x = BUF_TAIL.x;ts_ret->y = BUF_TAIL.y;ts_ret->pressure = BUF_TAIL.pressure;tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF);spin_unlock_irq(&(tsdev.lock));
return sizeof(TS_RET);}
static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){ TS_RET ts_ret;
retry: if(tsdev.head!= tsdev.tail){
int count;
count = tsRead(&ts_ret);
if(count)copy_to_user(buffer,(char *)&ts_ret, count);
return count;} else {
if(filp->f_flags & O_NONBLOCK)
return-EAGAIN;
interruptible_sleep_on(&(tsdev.wq));
if(signal_pending(current))
return-ERESTARTSYS;
goto retry;}
return sizeof(TS_RET);}
#ifdef USE_ASYNC static int s3c2410_ts_fasync(int fd, struct file *filp, int mode){ return fasync_helper(fd, filp, mode, &(tsdev.aq));} #endif
static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait){ poll_wait(filp, &(tsdev.wq), wait);return(tsdev.head == tsdev.tail)? 0 :(POLLIN | POLLRDNORM);}
static inline void start_ts_adc(void){ adc_state = 0;mode_x_axis();start_adc_x();}
static inline void s3c2410_get_XY(void){ if(adc_state == 0){
adc_state = 1;
disable_ts_adc();
y =(ADCDAT0 & 0x3ff);
mode_y_axis();
start_adc_y();} else if(adc_state == 1){
adc_state = 0;
disable_ts_adc();
x =(ADCDAT1 & 0x3ff);
tsdev.penStatus = PEN_DOWN;
DPRINTK(“PEN DOWN: x: %08d, y: %08dn”, x, y);
wait_up_int();
tsEvent();} }
static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP)s3c2410_get_XY();#ifdef HOOK_FOR_DRAG else s3c2410_get_XY();#endif spin_unlock_irq(&(tsdev.lock));}
static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP){ start_ts_adc();} else { tsdev.penStatus = PEN_UP;DPRINTK(“PEN UP: x: %08d, y: %08dn”, x, y);wait_down_int();tsEvent();
} spin_unlock_irq(&(tsdev.lock));}
#ifdef HOOK_FOR_DRAG static void ts_timer_handler(unsigned long data){ spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_DOWN){
start_ts_adc();} spin_unlock_irq(&(tsdev.lock));} #endif
static int s3c2410_ts_open(struct inode *inode, struct file *filp){ tsdev.head = tsdev.tail = 0;tsdev.penStatus = PEN_UP;#ifdef HOOK_FOR_DRAG init_timer(&ts_timer);ts_timer.function = ts_timer_handler;#endif tsEvent = tsEvent_raw;init_waitqueue_head(&(tsdev.wq));
MOD_INC_USE_COUNT;return 0;}
static int s3c2410_ts_release(struct inode *inode, struct file *filp){ #ifdef HOOK_FOR_DRAG del_timer(&ts_timer);#endif MOD_DEC_USE_COUNT;return 0;}
static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release,#ifdef USE_ASYNC fasync: s3c2410_ts_fasync, #endif poll: s3c2410_ts_poll, };
void tsEvent_dummy(void){} #ifdef CONFIG_PM static int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,void *data){ switch(req){
case PM_SUSPEND:
tsEvent = tsEvent_dummy;
break;
case PM_RESUME:
tsEvent = tsEvent_raw;
wait_down_int();
break;} return 0;} #endif
#ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_ts_dir, devfs_tsraw;#endif static int __init s3c2410_ts_init(void){ int ret;
tsEvent = tsEvent_dummy;
ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);if(ret < 0){ printk(DEVICE_NAME “ can't get major numbern”);return ret;} tsMajor = ret;
/* set gpio to XP, YM, YP and YM */ #if 0 set_GPIO_mode(GPIO106_nYPON_MD);
set_GPIO_mode(GPIO105_YMON_MD);set_GPIO_mode(GPIO104_nXPON_MD);set_GPIO_mode(GPIO103_XMON_MD);
GPUP(GPIO106_nYPON)|= GPIO_bit(GPIO106_nYPON);GPUP(GPIO105_YMON)&= GPIO_bit(GPIO105_YMON);GPUP(GPIO104_nXPON)|= GPIO_bit(GPIO104_nXPON);GPUP(GPIO103_XMON)&= GPIO_bit(GPIO103_XMON);#else set_gpio_ctrl(GPIO_YPON);set_gpio_ctrl(GPIO_YMON);set_gpio_ctrl(GPIO_XPON);set_gpio_ctrl(GPIO_XMON);#endif
/* Enable touch interrupt */ ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_adc);if(ret)goto adc_failed;ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_tc);if(ret)goto tc_failed;
/* Wait for touch screen interrupts */ wait_down_int();
#ifdef CONFIG_DEVFS_FS devfs_ts_dir = devfs_mk_dir(NULL, “touchscreen”, NULL);devfs_tsraw = devfs_register(devfs_ts_dir, “0raw”, DEVFS_FL_DEFAULT,tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&s3c2410_fops, NULL);#endif
#ifdef CONFIG_PM #if 0 tsdev.pm_dev = pm_register(PM_GP_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif tsdev.pm_dev = pm_register(PM_DEBUG_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif printk(DEVICE_NAME “ initializedn”);
return 0;tc_failed: free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);adc_failed: return ret;}
static void __exit s3c2410_ts_exit(void){ #ifdef CONFIG_DEVFS_FS
devfs_unregister(devfs_tsraw);devfs_unregister(devfs_ts_dir);#endif unregister_chrdev(tsMajor, DEVICE_NAME);#ifdef CONFIG_PM pm_unregister(tsdev.pm_dev);#endif free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);free_irq(IRQ_TC, s3c2410_isr_tc);}
module_init(s3c2410_ts_init);module_exit(s3c2410_ts_exit);觸摸屏應(yīng)用程序
#include
#define PEN_UP 0 /* 觸摸筆抬筆,即觸摸屏不被壓下 */ #define PEN_DOWN 1 /* 觸摸筆下筆,即觸摸屏被壓下 */ #define PEN_FLEETING 2 /* 觸摸筆拖動(dòng) */
typedef struct { unsigned short pressure;/* 觸摸筆動(dòng)作 */ unsigned short x;
/* 觸點(diǎn)x座標(biāo)值 */ unsigned short y;
/* 觸點(diǎn)y座標(biāo)值 */ unsigned short pad;}TS_RET;
int main(){ int fd,ret,i;
unsigned char suba;TS_RET tsret;
fd = open(“/dev/touchscreen/0raw”, O_RDWR);/* 打開設(shè)備 */ if(fd ==-1){ printf(“nCan't open I2C device!n”);exit(-1);}
while(1){
ret = read(fd,(char *)&tsret, sizeof(TS_RET));
if(ret!= sizeof(TS_RET))
{
printf(“read touch screen error!”);
close(fd);
exit(-1);
}
else
{
printf(“pressure is: %dn”, tsret.pressure);
printf(“x is: %dn”, tsret.x);
printf(“y is: %dn”, tsret.y);
} }
close(fd);return 0;} 3.3.應(yīng)用程序的調(diào)試
使用s3c2410_ts.c觸摸屏驅(qū)動(dòng)編寫應(yīng)用程序,讀取觸摸屏的觸點(diǎn)坐標(biāo)值及動(dòng)作信息(觸點(diǎn)x坐標(biāo)值,y坐標(biāo)及是否有壓力值press),并在串口中斷打印出來
對觸摸屏設(shè)別的操作有打開設(shè)備,關(guān)閉設(shè)備,讀操作等。編寫應(yīng)用程序讀取觸摸屏的觸點(diǎn)坐標(biāo)值及動(dòng)作信息時(shí),只需利用觸摸屏驅(qū)動(dòng)程序便可實(shí)現(xiàn),先打開觸摸屏設(shè)備,然后調(diào)用讀函數(shù)即可。
其中,觸摸筆動(dòng)作取值如下: #define PEN_UP 0 #define PEN_DOWN
/* 觸摸筆抬筆,即觸摸屏不被壓下 */ /* 觸摸筆下筆,即觸摸屏被壓下 */
#define PEN_FLEETING 2 結(jié)構(gòu)體定義如下: typedef struct { unsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;}TS_RET 打開應(yīng)用程序:
/* 觸摸筆拖動(dòng) */
/* 觸摸筆動(dòng)作 */ /* 觸點(diǎn)x座標(biāo)值 */ /* 觸點(diǎn)y座標(biāo)值 */
3.2.6、實(shí)驗(yàn)結(jié)果顯示:
第四部分 感想
第四章 心得
4.1 課程設(shè)計(jì)心得體會(huì):
經(jīng)過個(gè)人的努力和老師以及同學(xué)們的幫助和指導(dǎo),我順利的完成了本次《嵌入式系統(tǒng)原理》課程設(shè)計(jì)。本次課程設(shè)計(jì)為我提供了一個(gè)理論與實(shí)踐相結(jié)合的機(jī)會(huì),既鍛煉了我的動(dòng)手能力,又加深理解了在課堂所學(xué)習(xí)的理論知識。通過本次課程設(shè)計(jì),將課本上的理論知識和實(shí)際應(yīng)用有機(jī)結(jié)合起來,培養(yǎng)了我又動(dòng)腦,又動(dòng)手,獨(dú)立思考分析問題的能力,提高了我運(yùn)用所學(xué)知識解決實(shí)際問題的綜合素質(zhì)。通過本次課程設(shè)計(jì)我明白了只有不斷的努力,不斷的學(xué)習(xí),才能在將來遇到的問題中能夠游刃有余,才能夠不會(huì)捉襟見肘。
參考文獻(xiàn) 程昌南,方強(qiáng)等.《ARM Linux入門與實(shí)踐 》【M】.北京:北京航空航天大學(xué)出版社,2008.10 2 張曉林等.《嵌入式系統(tǒng)設(shè)計(jì)與實(shí)踐》【M】.北京:北京航空航天大學(xué)出版社,2006.1 3 李俊等.《嵌入式Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》【M】.北京:北京人民郵電出版社,2008.3 4 黃智偉,鄧月明,王彥.《ARM9嵌入式系統(tǒng)設(shè)計(jì)基礎(chǔ)教程》.北京:北京航空航天大學(xué)出版社,2008.8
第四篇:觸摸屏材料總結(jié)和觸摸屏發(fā)展趨勢
觸摸屏材料總結(jié)和觸摸屏發(fā)展趨勢
目前觸摸屏的應(yīng)用范圍從以往的銀行自動(dòng)柜員機(jī)、工控計(jì)算機(jī)等小眾商用市場,迅速擴(kuò)展到手機(jī)、PDA、GPS(全球定位系統(tǒng))、MP3,甚至平板電腦(UMPC)等大眾消費(fèi)電子領(lǐng)域。展望未來,觸控操作簡單、便捷,人性化的觸摸屏有望成為人機(jī)互動(dòng)的最佳界面而迅速普及。
目前的觸控技術(shù)尚存在屏幕所使用的材源透光較差影響顯示畫面的清晰度,或者長期使用后出現(xiàn)坐標(biāo)漂移、影響使用精度等問題。而且,全球主要觸摸屏生產(chǎn)大廠多集中在日、美、韓等國家以及我國臺灣地區(qū);主要技術(shù)、關(guān)鍵零組件和原材料更是基本掌握在日、美廠商手中,中國大陸的觸摸屏/觸控面板產(chǎn)業(yè)還基本處于起步階段。但正因如此,整個(gè)觸控行業(yè)未來的上升空間還非常大,它也有望成為我國電子企業(yè)今后創(chuàng)新發(fā)展、大有作為的重要領(lǐng)域。
觸摸屏起源于20世紀(jì)70年代,早期多被裝于工控計(jì)算機(jī)、POS機(jī)終端等工業(yè)或商用設(shè)備之中。2007年iPhone手機(jī)的推出,成為觸控行業(yè)發(fā)展的一個(gè)里程碑。蘋果公司把一部至少需要20個(gè)按鍵的移動(dòng)電話,設(shè)計(jì)得僅需三四個(gè)鍵就能搞定,剩余操作則全部交由觸控屏幕完成。除賦予了使用者更加直接、便捷的操作體驗(yàn)之外,還使手機(jī)的外形變得更加時(shí)尚輕薄,增加了人機(jī)直接互動(dòng)的親切感,引發(fā)消費(fèi)者的熱烈追捧,同時(shí)也開啟了觸摸屏向主流操控界面邁進(jìn)的征程。
目前,觸摸屏應(yīng)用范圍已變得越來越廣泛,從工業(yè)用途的工廠設(shè)備的控制/操作系統(tǒng)、公共信息查詢的電子查詢設(shè)施、商業(yè)用途的提款機(jī),到消費(fèi)性電子的移動(dòng)電話、PDA、數(shù)碼相機(jī)等都可看到觸控屏幕的身影。當(dāng)然,這其中應(yīng)用最為廣泛的仍是手機(jī)。根據(jù)調(diào)研機(jī)構(gòu)ABIResearch報(bào)告指出,2008年采用觸控式屏幕的手機(jī)出貨量將超過1億部,預(yù)計(jì)2012年安裝觸控界面的手機(jī)出貨量將超過5億部。
而且有跡象表明,觸摸屏在消費(fèi)電子產(chǎn)品中的應(yīng)用范圍正從手機(jī)屏幕等小尺寸領(lǐng)域向具有更大屏幕尺寸的筆記本電腦拓展。目前,戴爾、惠普、富士通、華碩等一線筆記本電腦品牌廠商都計(jì)劃推出具備觸摸屏的筆記本電腦或UMPC。當(dāng)然,目前關(guān)于配備觸摸屏的筆記本電腦是否能從10英寸以下的低價(jià)筆記本電腦或UMPC,擴(kuò)大到14英寸以上的主流筆記本電腦市場,業(yè)界仍存爭論。因?yàn)閷τ谥髁鞴P記本電腦或臺式機(jī)來說,消費(fèi)者多已習(xí)慣了使用鍵盤及鼠標(biāo)進(jìn)行輸入,不像小尺寸筆記本電腦,因可容納的鍵盤數(shù)量有限,需觸摸屏加以輔助,達(dá)到更直觀的人機(jī)溝通目的。而且現(xiàn)在Windows系統(tǒng)尚不支持多點(diǎn)觸控功能,如由PC廠商單獨(dú)導(dǎo)入多點(diǎn)觸控功能,在軟件上的努力與投資又將極為可觀,因此預(yù)計(jì)到2010年支持多點(diǎn)觸控的新操作系統(tǒng)Windows7上市之前,配備觸摸屏的筆記本電腦仍將局限于12.1英寸以下。但即便如此,觸摸屏市場未來的發(fā)展前景也十分誘人。根據(jù)市場調(diào)研機(jī)構(gòu)的預(yù)測,到2010年觸摸屏產(chǎn)值將達(dá)到35億美元。
依照感應(yīng)方式的不同,觸摸屏大致可以分為電阻式、電容式、紅外線式、超音波式四類。其中電阻式與電容式目前的市場前景最被看好,其他技術(shù)短期內(nèi)恐很難趕上。
就技術(shù)原理來看,電阻式觸摸屏只能算是一種“類觸控”技術(shù)。它采用兩層鍍有導(dǎo)電功能的ITO(銦錫氧化物)PET塑料膜,PET本身具有一定的透明度與耐用性,兩片ITO設(shè)有微粒支點(diǎn),使屏幕在未被壓按時(shí)兩層ITO間有一定的空隙,處于未導(dǎo)電的狀態(tài)。當(dāng)操作者以指尖或筆尖壓按屏幕(外層PET膜)時(shí),壓力將使PET膜內(nèi)凹,因變形而使銦錫氧化物導(dǎo)電層接觸導(dǎo)電,再通過偵測X軸、Y軸電壓變化換算出對應(yīng)的壓力點(diǎn),完成整個(gè)屏幕的觸按處理機(jī)制。由于此種技術(shù)成本低廉,現(xiàn)已大量應(yīng)用于電子產(chǎn)品之上。目前電阻式觸摸屏有4線、5線、6線與8線等多種類型,線數(shù)越多,代表可偵測的精密度越高,但成本也會(huì)相對提高。
不過,仔細(xì)考量電阻式觸控技術(shù)的原理就會(huì)發(fā)現(xiàn),通過觸按屏幕觸發(fā)ITO薄膜導(dǎo)電的偵測機(jī)制,在物理上有其局限性:電阻式技術(shù)想要增加偵測面積與分辨率,最直接的方法就是增加線數(shù),但線數(shù)的提高也代表著處理運(yùn)算信息量的增加,這對處理器將是一大負(fù)擔(dān),同時(shí)成本的提升也是問題。另外,PET膜再怎么強(qiáng)化,材質(zhì)的耐壓性、耐磨性、抗變形能力,畢竟有其極限,長時(shí)間運(yùn)用一定會(huì)減低銦錫氧化物導(dǎo)電層接觸導(dǎo)通效率,觸按點(diǎn)也會(huì)因經(jīng)常使用的就是那幾處,造成特定區(qū)域過度使用磨損,而降低透明度。
電容式觸摸屏與電阻式比較,架構(gòu)相對簡單。由于電容式觸摸屏中的投射電容式(電容式觸摸屏主要分為投射電容式與表面電容式兩種)可支持當(dāng)前流行的多點(diǎn)觸控功能,并擁有更高的屏幕透光率、更低的整體功耗、更長的使用壽命等優(yōu)點(diǎn),正不斷挑戰(zhàn)電阻式觸摸屏的市場地位。
據(jù)isuppli公司預(yù)測,2008年全球具備觸控功能的手機(jī),仍以電阻式觸控技術(shù)為主,產(chǎn)值可達(dá)4900萬美元,預(yù)計(jì)2012年將達(dá)6500萬美元;而投射電容式觸控技術(shù)2008年產(chǎn)值雖然只有1000萬美元,占整個(gè)市場份額的17%,但估計(jì)2012年投射電容式產(chǎn)值將突破2000萬美元,市場比重躍升至23%。
但是電容式觸控也有許多值得關(guān)注的問題:比如液晶屏非常靠近銦錫氧化物模板,新的技術(shù)甚至直接將兩者做在同一個(gè)真空堆棧中,形成一個(gè)模組。而為了達(dá)到觸點(diǎn)偵測功效,銦錫氧化物模板又需不斷地掃描像素,會(huì)持續(xù)散發(fā)干擾信號,影響整個(gè)模組的操作。另外,廠商雖然會(huì)對觸摸屏的表面進(jìn)行硬化處理,可是為了不隔絕掉ITO的表面電流,硬化鍍層非常薄,當(dāng)施加在觸摸屏上的外力過大時(shí),依然有傷到ITO的可能,對觸摸屏造成損傷,降低使用壽命。因此,針對提高使用壽命問題,有廠商開發(fā)出了超聲波式或紅外線式觸摸屏。特別是在導(dǎo)通線路精細(xì)度方面是制約電容屏發(fā)展的瓶頸問題,直接購買鍍膜設(shè)備成本會(huì)增加很多,但是最近uninwell International最近推出的光刻銀漿可以解決這方便的問題,此種材料可以將線細(xì)和線距控制在0.05mm以內(nèi),使得電容屏的投資成本大大降低。
紅外線與超聲波式觸控技術(shù)的作用原理相仿。不過受限于傳感器的尺寸,這兩項(xiàng)技術(shù)目前多用于20英寸以上的屏幕,如醫(yī)療、ATM等裝置上,同時(shí)產(chǎn)品的成本也會(huì)較高。
由于市場需求迅速增長,觸控產(chǎn)業(yè)近年來也迅速躥紅,許多廠商紛紛投身其中。從觸摸屏的產(chǎn)業(yè)狀況來看,產(chǎn)業(yè)鏈大約可以分為上游零組件、原材料供應(yīng)與材料加工,如玻璃基板制造、ITO薄膜制造、PET制造、化學(xué)材料供應(yīng)、控制IC供應(yīng)等;中游觸摸屏/觸控面板的制造;下游則大多是一些系統(tǒng)整合與終端廠商,如模組廠商、顯示器廠商、家電廠商以及代理商等。
如果不算基本屬于應(yīng)用層面的下游廠商,目前中國大陸以及中國臺灣地區(qū)的廠商主要致力于在產(chǎn)業(yè)鏈中游的觸摸屏/觸控面板制造領(lǐng)域拓展,且以電阻式產(chǎn)品為主,如大陸的富陽光電、華意電路、北泰顯示、凰澤光電、深越光電、沃森電子、東莞冠智電子、廣州恒利達(dá)等。深越光電除了提供電阻式觸摸屏之外,還提供電容式與超聲波式產(chǎn)品。同時(shí)有消息稱,萊寶高科的觸摸屏項(xiàng)目將切入ITO薄膜以及ITO導(dǎo)電玻璃的制造。我國臺灣地區(qū)廠商切入時(shí)點(diǎn)較早,現(xiàn)在也已涌現(xiàn)出時(shí)緯科技、接口光電、洋華光電、奇菱科技、富晶通、嵩遠(yuǎn)光電、仕欽科技、遠(yuǎn)諾光電、宇宙光電、理義科技、勝華科技等一批觸摸屏制造企業(yè)。
但觸摸屏上游的零組件與材料供應(yīng)基本上仍掌握在日本、美國供貨商手中。比如玻璃基板的主要制造商有日商旭硝子、美商康寧;PET制造商為3M,住友、東麗;化學(xué)材料供貨商為Uninwell,日礦、三井;膠材中的銀膠有Uninwell,breakover-quick,Longtone,伊必艾科技、杜邦、3M,絕緣膠有藤倉、住友、杜邦、3M,雙面膠有3M、日東電工,印刷膠有東洋紡等;ITOFilm制造為日東電工、尾池工業(yè)、帝人化成、東洋紡等。只有在控制IC領(lǐng)域,我國臺灣地區(qū)的義隆電子與禾瑞亞還有較大的發(fā)言權(quán)。其次在ITO玻璃的制造中,臺廠正太、冠華也有了較強(qiáng)的供應(yīng)能力,但目前占該材料成本比重最多的ITOFilm供應(yīng)幾乎都是以日本廠商為主。
盡管觸摸屏的實(shí)際應(yīng)用越來越多,應(yīng)用范圍越來越廣闊,可實(shí)際上該項(xiàng)技術(shù)仍然存在許多需要完善的地方,只有設(shè)計(jì)出更先進(jìn)、智能、體貼的人機(jī)界面,使進(jìn)行觸控操作時(shí)更加直觀、精準(zhǔn),同時(shí)又不影響系統(tǒng)的反應(yīng)速度,才能有望成為人機(jī)交互的主流界面。最典型的例子就是觸控操作中的回饋問題。在手機(jī)應(yīng)用中,觸摸屏很大程度上已經(jīng)可以代替按鍵。可是從消費(fèi)者的使用習(xí)慣角度出發(fā),傳統(tǒng)的按鍵仍然具有一個(gè)觸摸屏所沒有的特性——— 觸感回饋。通過按鍵,很多使用者即使在不看鍵盤的情況下,也可以憑借觸感判斷撥打電話、發(fā)送短信,但目前通過觸控屏幕卻沒有能力完成這項(xiàng)工作,使用者只有盯著屏幕,用手指瞄準(zhǔn),才能操作。未來,需要在虛擬按鍵上加入適當(dāng)?shù)陌存I回饋機(jī)制,例如聲音或是震動(dòng)裝置,以更貼近消費(fèi)者的使用習(xí)慣。
再者,觸摸屏還有壽命和體積等問題。一般情況下,觸摸屏的使用期限,肯定要遠(yuǎn)低于按鍵鍵盤,如果在屏幕上貼上保護(hù)膜,又會(huì)降低觸摸屏操作的靈敏度和精確度。如果產(chǎn)品還有小型化的設(shè)計(jì)需求,那么過小的屏幕,會(huì)讓觸控操作更加困難,形成負(fù)面效果。
此外,許多業(yè)者現(xiàn)在還在致力開發(fā)如內(nèi)嵌式觸摸屏,應(yīng)用于電子紙、OLED(有機(jī)發(fā)光二極管)等上的觸摸屏等研發(fā)。可見,觸摸屏行業(yè)的技術(shù)提升空間仍然很大,仍有很多潛在的市場需求尚待開發(fā)。因此也可看出,觸摸屏作為一項(xiàng)新近興起的輸入控制界面,中國企業(yè)在這一領(lǐng)域仍然大有可為。
第五篇:基于plc的觸摸屏總結(jié)
基于plc的觸摸屏專業(yè)技能總結(jié)
專業(yè):電子信息工程
學(xué)號:0414110111 姓名:王國發(fā)
這學(xué)期我們進(jìn)行了有關(guān)PLC的科研技能訓(xùn)練,科研技能訓(xùn)練是大學(xué)中必不可少的一個(gè)環(huán)節(jié),因?yàn)榭蒲屑寄苁古囵B(yǎng)學(xué)生的科研能力、創(chuàng)新意識和創(chuàng)新能力,通過科研技能訓(xùn)練,使學(xué)生掌握科學(xué)研究的過程和方法,能夠初步掌握進(jìn)行科學(xué)研究、科技論文寫作的方法步驟,全面掌握 進(jìn)行科技活動(dòng)必備的素質(zhì)要求,激發(fā)學(xué)生的專業(yè)熱情和學(xué)習(xí)興趣,為學(xué)生撰寫畢業(yè)論文、進(jìn)行畢業(yè)設(shè)計(jì)奠定基礎(chǔ),并能培養(yǎng)學(xué)生的科研組織能力和專業(yè)知識綜合 運(yùn)用能力,提高其與專業(yè)有關(guān)的綜合素質(zhì),并且能提高創(chuàng)新能力!
一、觸摸屏的現(xiàn)狀與應(yīng)用
PLC(Programmable Logical Controller)通常稱為可編程邏輯控制器,是一種以微處理器為基礎(chǔ),綜合了現(xiàn)代計(jì)算機(jī)技術(shù)、自動(dòng)控制技術(shù)和通信技術(shù)發(fā)展起來的一種通用的工業(yè)自動(dòng)控制裝置,由于它擁有體積小、功能強(qiáng)、程序設(shè)計(jì)簡單、維護(hù)方便等優(yōu)點(diǎn),特別是它適應(yīng)惡劣工業(yè)環(huán)境的能力和它的高可靠性,使它的應(yīng)用越來越廣泛,已經(jīng)被稱為現(xiàn)代工業(yè)的三大支柱(即PLC、機(jī)器人和CAD/CAM)之一。
PLC基于電子計(jì)算機(jī),但并不等同于計(jì)算機(jī)。普通計(jì)算機(jī)進(jìn)行入出信息交換時(shí),大多只考慮信息本身,信息入出的物理過程一般不考慮的。而PLC則要考慮信息入出的可靠性、實(shí)時(shí)性、以及信息的實(shí)際使用。特別要考慮怎樣適應(yīng)于工業(yè)環(huán)境,如便于安裝便于門內(nèi)外感應(yīng)采集信號,便于維修和抗干擾等問題,入出信息變換及可靠地物理實(shí)現(xiàn),可以說是PLC實(shí)現(xiàn)控制的兩個(gè)基本點(diǎn)。PLC可以通過他的外設(shè)或通信接口與外界交換信息。其功能要比繼電器控制裝置多得多、強(qiáng)得多。PLC有豐富的指令系統(tǒng),有各種各樣的I/O接口、通信接口,有大容量的內(nèi)存,有可靠的自身監(jiān)控系統(tǒng),因而具有以下基本功能:
1邏輯處理功能; 2數(shù)據(jù)運(yùn)算功能; 3準(zhǔn)確定時(shí)功能; 4高速計(jì)數(shù)功能;
5中斷處理(可以實(shí)現(xiàn)各種內(nèi)外中斷)功能; 6程序與數(shù)據(jù)存儲功能; 7聯(lián)網(wǎng)通信功能 ; 8自檢測、自診斷功能。
可以說,凡普通小型計(jì)算機(jī)能實(shí)現(xiàn)的功能,PLC幾乎都可以做到。像 PLC這樣,集豐富功能于一身,是別的電控制器所沒有的,更是傳統(tǒng)的繼電器控制電路所無法比擬的。豐富的功能為PLC 的廣泛應(yīng)用提供了可能,同時(shí),也為自動(dòng)門行業(yè)的遠(yuǎn)程化、信息化、智能化創(chuàng)造了條件。
人機(jī)界面是在操作人員和機(jī)器設(shè)備之間做雙向溝通的橋梁,用戶可以自由的組合文字、按鈕、圖形、數(shù)字等處理或監(jiān)控管理及應(yīng)付隨時(shí)可能變化信息的多功能顯示屏幕。隨著機(jī)械設(shè)備的飛速發(fā)展,以往的操作界面需由熟練的操作員才能操作,而且操作困難,無法提高工作效率。但是使用人機(jī)界面能夠明確指示并告知操作員設(shè)備目前的狀況,使操作變的簡單生動(dòng),并且可以減少操作上的失誤,即使是新手也可以輕松的操作整個(gè)機(jī)器設(shè)備。使用人機(jī)界面還可以使機(jī)器的配線標(biāo)準(zhǔn)化、簡單化,同時(shí)也能減少PLC控制器所需的I/O點(diǎn)數(shù),降低生產(chǎn)的成本。同時(shí)由于面板控制的小型化及高性能,相對的提高了整套設(shè)備的附加價(jià)值。
觸摸屏是“圖形操作終端”“GOT”在工業(yè)控制中的通俗叫法,這種液晶顯示器具有人體感應(yīng)功能,當(dāng)手指觸摸到觸摸屏上的圖形時(shí),可發(fā)出操作指令。
一、觸摸屏的簡要結(jié)構(gòu)、原理 1.電阻式觸摸屏原理
觸摸屏工作時(shí),上下導(dǎo)體層相當(dāng)于電阻網(wǎng)絡(luò),當(dāng)某一層電極加上電壓時(shí),會(huì)在該網(wǎng)絡(luò)上形成電壓梯度。如有外力使得上下兩層在某一點(diǎn)接觸,則在電極未加電壓的另一層可以測得接觸點(diǎn)處的電壓,從而知道接觸點(diǎn)處的坐標(biāo)。
2.電容式觸摸屏原理(1)表面電容觸摸屏通過人體的感應(yīng)電流來進(jìn)行工作。它采用一層銦錫氧化物(ITO),外圍至少有四個(gè)電極。當(dāng)一個(gè)接地的物體靠近時(shí),例如手指,流經(jīng)這四個(gè)電極的電流與手指到四角的距離成正比,控制器通過對這四個(gè)電流比例的精確計(jì)算,得出觸摸點(diǎn)的位置。
(2)投射電容式觸摸屏。當(dāng)手指靠近從一個(gè)電極到另一個(gè)電極的電場線時(shí),相鄰電極耦合產(chǎn)生的電容產(chǎn)生變化,控制器收集變化信息,從而計(jì)算出位置。這種觸摸屏的最大優(yōu)勢是實(shí)現(xiàn)了多點(diǎn)觸控,使得用戶的操作更加便捷。
(3)紅外線觸摸屏原理
在屏幕周邊,成對安裝紅外線發(fā)射器和紅外線接受器,形成緊貼屏幕前密布X、Y方向上的紅外線矩陣,通過不停的掃描是否有紅外線被物體阻擋檢測并定位用戶的觸摸。
(4)聲波式觸摸屏原理
表面聲波觸摸屏是利用聲波可以在剛體表面?zhèn)鞑サ奶匦栽O(shè)計(jì)而成。以X軸為例,控制電路產(chǎn)生發(fā)射信號(電信號),該電信號經(jīng)玻璃屏上的X軸發(fā)射換能器轉(zhuǎn)換成超聲波,超聲波在前進(jìn)途中遇到45度傾斜的反射線后產(chǎn)生反射,產(chǎn)生和入射波成90度、和Y軸平行的分量,該分量傳至玻璃屏X方向的另一邊也遇到45度傾斜的反射線,經(jīng)反射后沿和發(fā)射方向相反的方向傳至X軸接收換能器。X軸接收換能器將回收到的聲波轉(zhuǎn)換成電信號。控制電路對該電信號進(jìn)行處理得到表征玻璃屏聲波能量分布的波形。有觸摸時(shí),手指會(huì)吸收部分聲波能量,回收到的信號會(huì)產(chǎn)生衰減,程序分析衰減情況可以判斷出X方向上的觸摸點(diǎn)坐標(biāo)。同理可以判斷出Y軸方向上的坐標(biāo),X、Y兩個(gè)方向的坐標(biāo)一確定,觸摸點(diǎn)自然就被唯一地確定下來。
各類觸摸屏橫向比較
? 電阻式:觸摸屏處于一種對外界完全隔離的工作環(huán)境,不怕灰塵、水汽和油污,可以用任何物體來觸摸。精度非常高,可用來作圖,書寫。價(jià)格合理。
? 電容式:最大優(yōu)勢是能實(shí)現(xiàn)多點(diǎn)觸控,操作最隨意。不足的是精度較低,受周圍環(huán)境電場影響可能產(chǎn)生漂移,價(jià)格較高。
? 紅外線式:紅外觸摸屏不受電流、電壓和靜電干擾,但對光照較為敏感。價(jià)格較低,維護(hù)方便。
? 聲波式:屏幕多為鋼化玻璃,清晰度高,透光率好。高度耐久,抗刮傷性良好。多用于各種公共場合如ATM,自動(dòng)售票機(jī)等。
二、觸摸屏的畫面制作及基本操作
1、GOT的接線及與計(jì)算機(jī)、PLC的連接 作為PLC的圖形操作終端,GOT必須與PLC聯(lián)機(jī)使用,通過操作人員手指與觸摸屏上的圖形元件的接觸發(fā)出PLC的操作指令或者顯示PLC運(yùn)行中的各種信息。
2.GOT的畫面功能(用戶畫面功能、系統(tǒng)畫面)(1)用戶畫面功能(用戶制作的畫面)(2)系統(tǒng)畫面功能 ① 監(jiān)視功能
② 數(shù)據(jù)采樣功能 ③ 報(bào)警功能 ④ 其他功能
三、觸摸屏的選用
由于在此系統(tǒng)中,觸摸屏要擔(dān)任監(jiān)控各部分運(yùn)行狀態(tài),而且還用于控制作用,所以在此擔(dān)任的任務(wù)還是比較重的。所以在此選定的觸摸屏為MT506T型號。
①可實(shí)時(shí)顯示設(shè)備和系統(tǒng)的運(yùn)行狀態(tài)。
②通過觸摸向PLC發(fā)出指令和數(shù)據(jù),再通過PLC完成對系統(tǒng)或設(shè)備的控制。
③可做成多幅多種監(jiān)控畫面,替代了傳統(tǒng)的電氣操作盤及顯示記錄儀表等,且功能更加強(qiáng)大。
四、觸摸屏程序設(shè)計(jì)
本系統(tǒng)的觸摸屏人機(jī)交互界面的開發(fā)平臺,采用MT506觸摸屏的編程軟件實(shí)現(xiàn)。該軟件類似于組態(tài)軟件,采用圖形化的編程方法,只需將相關(guān)元件拖到預(yù)先定義的畫面上,根據(jù)需要設(shè)置相關(guān)參數(shù)、合理配置PLC寫入地址即可完成操作。
五‘GT-Designer2 畫面制作軟件介紹
三菱觸摸屏的用戶畫面制作軟件有FX-PCS-DU/WIN-C和GT-Designer等,前者主要用于制作F900系列觸摸屏的畫面,后者用于高檔觸摸屏(如A900系列、GT11系列、GT15系列)畫面的制作,也可用于F900系列觸摸屏。
觸摸屏作為一種新型的人機(jī)界面,從一出現(xiàn)就受到關(guān)注,它的簡單易用,強(qiáng)大的功能及優(yōu)異的穩(wěn)定性使它非常適合用于工業(yè)環(huán)境,甚至可以用于日常生活之中,應(yīng)用非常廣泛,比如:自動(dòng)化停車設(shè)備、自動(dòng)洗車機(jī)、天車升降控制、生產(chǎn)線監(jiān)控等,甚至可用于智能大廈管理、會(huì)議室聲光控制、溫度調(diào)整。
隨著科技的飛速發(fā)展,越來越多的機(jī)器與現(xiàn)場操作都趨向于使用人機(jī)界面,PLC控制器強(qiáng)大的功能及復(fù)雜的數(shù)據(jù)處理也呼喚一種功能及與之匹配而操作又簡單的人機(jī)的出現(xiàn),觸摸屏的應(yīng)運(yùn)而生無疑是21世紀(jì)自動(dòng)化領(lǐng)域里的一個(gè)巨大的革新。
通過科研技能訓(xùn)練,我發(fā)現(xiàn)要干好一件事情必須要不怕困難,堅(jiān)持到底,只有這樣才會(huì)戰(zhàn)勝困難,贏得最后的勝利。作為信息時(shí)代的大學(xué)生,我們應(yīng)該有這種不怕辛苦,勇于創(chuàng)新的精神。另外,理工科的學(xué)生不是只有會(huì)計(jì)算和實(shí)驗(yàn)就夠了的,培養(yǎng)表達(dá)能力也很重要,要懂得把自己的想法恰如其分的表達(dá)清楚,梳理成文章,讓感興趣的人很好的欣賞自己的創(chuàng)作。所以通過科研技能訓(xùn)練,讓我在原有水平上有了一個(gè)量的提高,對我以后的發(fā)展和專業(yè)水平的提高有很大的幫助,我想我會(huì)一直努力用理論聯(lián)系實(shí)際的方法不斷提高自己,奔向人生最高處。