版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
PAGEPAGEI帆板控制系統(tǒng)(F題)【高職高專組】2015年7月30日摘要本文主要介紹了一種帆板控制系統(tǒng)。通過對直流風(fēng)扇風(fēng)速的控制,調(diào)節(jié)風(fēng)力大小,改變帆板的轉(zhuǎn)角。其主控芯片為STM32F103VET6,通過PWM對電機驅(qū)動模塊的控制,來調(diào)節(jié)電機的轉(zhuǎn)速,同時應(yīng)用電位器和風(fēng)扇的信號線的返回信號作為反饋,對整個調(diào)速系統(tǒng)進行PWM閉環(huán)調(diào)節(jié),以到所預(yù)期的角度。并且介紹了在調(diào)試過程中的實時監(jiān)控和數(shù)據(jù)分析應(yīng)用等調(diào)試手段。文章著重介紹核心器件的選擇、各部分電路、軟件的設(shè)計和調(diào)試手段1競賽作品上交及包裝密封要求2011年9月3日晚20:00競賽結(jié)束時,參賽隊需要上交的材料包括:①《設(shè)計報告》;②制作實物;③《2011全國大學(xué)生電子設(shè)計競賽登記表》,必須封入由各校自備的紙箱。密封后的紙箱內(nèi)部所有物品及紙箱外部不得出現(xiàn)任何校名、參賽隊代號、參賽隊員姓名及其它暗記,否則視為無效。紙箱封條由賽區(qū)組委會自備,各參賽學(xué)校必須按照賽區(qū)組委會要求的時間、地點上交。2.《設(shè)計報告》寫作與裝訂要求《設(shè)計報告》文字應(yīng)控制在8000字以內(nèi),第一頁為300字以內(nèi)的設(shè)計中文摘要,正文采用小四號宋體字,標題字號自定,一律采用A4紙縱向打印?!对O(shè)計報告》每頁上方必須留出3cm空白,空白內(nèi)不得有任何文字,每頁右下端注明頁碼。報告用紙由參賽學(xué)校自備。3.《設(shè)計報告》的密封方法競賽結(jié)束時,參賽隊?wèi)?yīng)將設(shè)計報告密封紙在距設(shè)計報告上端約2厘米處裝訂,然后將參賽隊的代碼(代碼由賽區(qū)組委會統(tǒng)一編制,在發(fā)放題目時通知各參賽隊)寫在設(shè)計報告密封紙的最上方。設(shè)計報告裝訂好后將密封紙掀起并折向報告背面,最后用膠水在后面粘牢。設(shè)計報告上不允許出現(xiàn)參賽隊的學(xué)校、姓名等文字。目錄264791系統(tǒng)方案 1106301.1智能控制模塊的論證與選擇 117391.2電機驅(qū)動模塊的論證與選擇 180141.3角度傳感器的論證與選擇 1133111.3顯示模塊的論證與選擇 1198882系統(tǒng)理論分析與計算 2250922.1帆板受力的分析和計算 217252.1.1帆板轉(zhuǎn)角的原理 286102.1.2帆板的受力分析 2274462.2角度傳感器的分析與計算 3244152.2.1角度傳感器的原理 3289702.2.2角度傳感器的計算 336242.3電機轉(zhuǎn)速的控制的分析和計算 3103672.3.1電機轉(zhuǎn)速的控制的分析 331252.3.2PID算法的計算 3299073電路與程序設(shè)計 4153343.1電路的設(shè)計 4285053.1.1系統(tǒng)總體原理圖 4227023.1.2控制系統(tǒng)框圖與電路原理圖 4308723.1.3聲光報警子系統(tǒng)框圖與電路原理圖 541743.1.4電源 63173.2程序的設(shè)計 6273723.2.1程序功能描述與設(shè)計思路 626533.2.2程序流程圖 683874測試方案與測試結(jié)果 784054.1測試方案 7129334.2測試條件與儀器 8298724.3測試結(jié)果及分析 84274.3.1測試結(jié)果(數(shù)據(jù)) 8298834.3.2測試分析與結(jié)論 8187165.設(shè)計總結(jié) 830046.參考文獻 92301附錄1:電路原理圖 108843附錄2:源程序 11PAGEPAGE28帆板控制系統(tǒng)(F題)【高職高專組】1系統(tǒng)方案本系統(tǒng)主要由智能控制模塊、電機驅(qū)動模塊、角度傳感器模塊、顯示模塊、電源模塊組成,下面分別論證這幾個模塊的選擇。1.1智能控制模塊的論證與選擇方案一:選用傳統(tǒng)的89C51單片機,它的結(jié)構(gòu)較為先進,功能較強,在原來的基礎(chǔ)上增加了更多的電路單元和指令,指令數(shù)達111條,MCS-51單片機可以算是相當(dāng)成功的產(chǎn)品,一直到現(xiàn)在,MCS-51系列或其兼容的單片機仍是應(yīng)用的主流產(chǎn)品,但是傳統(tǒng)的51單片機只有32個獨令的IO口且沒有ADC模數(shù)轉(zhuǎn)換功能和PWM輸出功能。方案二:ST公司的STM32F103VET6是一款高性能、低功耗的32位ARM微處理器,具有高速,內(nèi)部集成了ADC模數(shù)轉(zhuǎn)換,同時還具有豐富的外設(shè)資源,可謂功能強大。通過對系統(tǒng)的綜合設(shè)計考慮以及外設(shè)的要求,我們最終選擇了STM32F103VET6這款功能更完善,速度更高的單片機。綜合以上兩種方案,選擇方案二。1.2電機驅(qū)動模塊的論證與選擇方案一:通過用三極管搭建H橋來做電機驅(qū)動模塊,來控制電機的正反轉(zhuǎn),通過兩個8050和8550搭建成H橋。優(yōu)點是:結(jié)構(gòu)簡單,方便搭建。缺點是:驅(qū)動電流小。方案二:直接用電機驅(qū)動芯片L298,L298N是內(nèi)部集成了雙H橋,最大驅(qū)動電壓達到36V,驅(qū)動電流達到4A,且是現(xiàn)有資源。綜合以上兩種方案,選擇方案二。1.3角度傳感器的論證與選擇方案一:選用角度傳感器,飛思卡爾公司的MMA7445三軸加速度傳感器,不同點是它輸出的是數(shù)字量,擁有低功耗,高穩(wěn)定性等特點。方案二:線性電位WDD35D是360°連續(xù)機械轉(zhuǎn)角的線性電位器,精度可達到1%,將電位器旋鈕和電位器分別于帆板和連桿結(jié)合,在帆板轉(zhuǎn)動的同時帶動旋鈕改變阻值,用AD測出電壓變化,從而換算出傾斜角度。綜合以上兩種方案,經(jīng)小組討論后決定選用方案二。1.3顯示模塊的論證與選擇方案一:選用12864QB,該點陣的屏顯成本相對較低,適用于各類儀器,小型設(shè)備的顯示領(lǐng)域。比起LCD1602雖然顯示的文本量大大的提高,但是還存在著不能顯示圖片等缺點。方案二:選用320*240的觸摸彩屏,比起12864,彩屏存在諸多的優(yōu)點,顯示量大,刷新快等優(yōu)點,還有其觸摸功能,直接把人機交互界面整合到彩屏上,節(jié)省了鍵盤的輸入部分。綜合以上兩種方案,經(jīng)小組討論后決定選用方案二。*注:電源部分采用0-36V專用電源。2系統(tǒng)理論分析與計算2.1帆板受力的分析和計算2.1.1帆板轉(zhuǎn)角的原理 帆板受力如圖2.1.1所示,帆板在不受水平風(fēng)力的作用下,在重力的作用下應(yīng)該是與水平面成90度角。當(dāng)受到水平風(fēng)力時,在水平風(fēng)力和帆板自身重力而形成一個斜向下的合,使帆板繞軸轉(zhuǎn)動,與重力方向形成一個夾角。,當(dāng)連桿對帆板的拉力等于重力與風(fēng)力的合力時,帆板可以保持平衡,即理論上的靜止。調(diào)節(jié)電機的轉(zhuǎn)速從而影響風(fēng)力的大小,進而影響到夾角的大小。圖2.1.1圖.2帆板的受力分析圖2.12受力分析當(dāng)風(fēng)扇打開時,形成水平風(fēng)力F,和重力共同作用在帆板上,帆板的受力如圖2.12所示,帆板和垂直方向形成的夾角。 (1)由此,可以改變F的大小,進而改變夾角的大小。從而實現(xiàn)系統(tǒng)的各項功能。2.2角度傳感器的分析與計算2.2.1角度傳感器的原理 線性電位WDD35D是360°連續(xù)機械轉(zhuǎn)角的線性電位器,精度可達到1%,將電位器旋鈕和電位器分別于帆板和連桿結(jié)合,在帆板轉(zhuǎn)動的同時帶動旋鈕改變阻值,用AD測出電壓變化,從而換算出傾斜角度。2.2.2角度傳感器的計算 角度傳感器其本身就是一個電位器,帆板的軸部連接著電位器的轉(zhuǎn)動軸,帆板的轉(zhuǎn)動會導(dǎo)致電位器阻值的變化,通過分析電位器上所加的電壓的變化,即可得到時實的角度。例如:在帆板垂直的條件下,電位器上電壓是aV,帆板轉(zhuǎn)動到至60度的時候,電位器上的電壓是bV,該電位器的阻值是呈線性分布的,可較容易的在電壓和角度間完成轉(zhuǎn)換。2.3電機轉(zhuǎn)速的控制的分析和計算2.3.1電機轉(zhuǎn)速的控制的分析 本系統(tǒng)所用到的電機為普通電器上散熱所用的直流電機,較為常見,相對普通的電機,該電機還具有電機轉(zhuǎn)速的檢測的功能。單片機可以直接通過GPIO口讀取到這個信號,進而轉(zhuǎn)換成轉(zhuǎn)速。在正常情況下,直流電機通電時,轉(zhuǎn)速增加,電機斷電時,轉(zhuǎn)速逐漸減小,控制轉(zhuǎn)速比較容易實現(xiàn)的方法就是通過單片機的GPIO口輸出PWM波,只要調(diào)節(jié)PWM的占空比,就可以調(diào)節(jié)電機的轉(zhuǎn)速了。在控制電機轉(zhuǎn)速的過程中,免不了要用到各種各樣的算法,我們?yōu)榱烁玫乜刂齐姍C的轉(zhuǎn)速,我們采用了較為簡單且比較實用的算法。2.3.2PID算法的計算數(shù)字PID控制算法在生產(chǎn)過程中是一種最普遍采用的控制方法,在冶金、機械、化工等行業(yè)中獲得廣泛應(yīng)用。究其原因是:該算法蘊涵了動態(tài)控制過程中現(xiàn)在(P)、過去(I)和將來(D)的主要信息,具有本質(zhì)上的魯棒性、優(yōu)化控制特性和智能化,算法簡單明了,易于掌握。單位反饋的PID控制原理框圖如圖圖2.32PID控制原理框圖單位反饋代表理想輸入與實際輸出的誤差,這個誤差信號被送到控制器,控制器算出誤差信號的積分值和微分值,并將它們與原誤差信號進行線性組合,得到輸出量。(5)其中,、、分別稱為比例系數(shù)、積分系數(shù)、微分系數(shù)。接著被送到了執(zhí)行機構(gòu),這樣就獲得了新的輸出信號,這個新的輸出信號被再次送到感應(yīng)器以發(fā)現(xiàn)新的誤差信號,這個過程就這樣周而復(fù)始地進行。3電路與程序設(shè)計3.1電路的設(shè)計3.1.1系統(tǒng)總體原理圖系統(tǒng)總體框圖如圖1所示,圖1系統(tǒng)總體原理圖3.1.2控制系統(tǒng)框圖與電路原理圖1、控制系統(tǒng)子系統(tǒng)原理圖控制系統(tǒng)原理圖3.1.3聲光報警子系統(tǒng)框圖與電路原理圖1、聲光報警系統(tǒng)原理圖圖2聲光報警系統(tǒng)原理圖2、顯示及觸摸系統(tǒng)電路圖3顯示及觸摸系統(tǒng)電路3.1.4電源電源由變壓部分、濾波部分、穩(wěn)壓部分組成。為整個系統(tǒng)提供0-36V的可調(diào)電壓,確保電路的正常穩(wěn)定工作。這部分電路比較簡單,都采用三端穩(wěn)壓管實現(xiàn),故不作詳述。3.2程序的設(shè)計3.2.1程序功能描述與設(shè)計思路1、程序功能描述根據(jù)題目要求軟件部分主要實現(xiàn)鍵盤的設(shè)置和顯示。1)鍵盤實現(xiàn)功能:設(shè)置角度值、角度的增加及減小。2)顯示部分:顯示實時的角度值、調(diào)節(jié)時間、及系統(tǒng)誤差。2、程序設(shè)計思路根據(jù)題目要求實現(xiàn)鍵盤控制風(fēng)扇風(fēng)力以及帆板轉(zhuǎn)角,設(shè)定了角度模式。。在角度模式下,用按鍵調(diào)整設(shè)定角度再利用PID控制算法對角度進行控制,進而給出風(fēng)扇轉(zhuǎn)速的控制量再通過PID控制算法對風(fēng)扇轉(zhuǎn)速進行穩(wěn)定,從而實現(xiàn)穩(wěn)定的帆板轉(zhuǎn)角控制。同時,為了測試方便設(shè)定45°角的一鍵鎖定模式,鎖定之后進行聲光提示。3.2.2程序流程圖1、主程序流程圖主程序流程圖主程序流程圖4測試方案與測試結(jié)果4.1測試方案4.1.1硬件測試通過示波器對電機測速反饋電路進行測試,其波形如下圖4.11所示:圖4.114.2測試條件與儀器測試條件:檢查多次,仿真電路和硬件電路必須與系統(tǒng)原理圖完全相同,并且檢查無誤,硬件電路保證無虛焊。測試儀器:高精度的數(shù)字毫伏表,模擬示波器,數(shù)字萬用表。4.3測試結(jié)果及分析4.3.1測試結(jié)果(數(shù)據(jù))角度距離15°30°45°60°時間(s)10cm153144612.17cm163347641.29cm153245621.511cm142944602.213cm132743593.115cm122742574.04.3.2測試分析與結(jié)論根據(jù)上述測試數(shù)據(jù),可以清楚地看出不同的距離、不同的風(fēng)力、不同的風(fēng)速的數(shù)據(jù)對比,由此可以得出以下結(jié)論:1、電機驅(qū)動方案和電機很重要,一般的電機驅(qū)動方案和直流電機很難把帆板吹到60°;如果減輕帆板重量則抖動很厲害;如果連桿太粗糙角度不好控制。2、閉環(huán)調(diào)速系統(tǒng)很必要,完整的閉環(huán)系統(tǒng)(在電機和電源工作范圍內(nèi))不在乎距離和偏向角度的問題。3、數(shù)據(jù)處理手段多樣,不但要有實施監(jiān)控的,還有整體宏觀曲線,同時數(shù)據(jù)的分析與擬合等多種手段。綜上所述,本設(shè)計達到設(shè)計要求。設(shè)計總結(jié)經(jīng)過四天三夜的辛勤努力,本設(shè)計實現(xiàn)了題目的基本要求,遺憾的是由于我們時間緊迫,任務(wù)重,沒能完成發(fā)揮部分。我們知道系統(tǒng)還存在許多可以改進的地方,比如電路布局、抗干擾性等方面還有很大的提升空間,經(jīng)過改進,相信性能還會有進一步的提升。通過本次的電子設(shè)計競賽,使得我們學(xué)到了很多知識,更鍛煉了我們自己學(xué)習(xí)新知識的能力。由于理論到實際往往存在了大的距離,往往認為理論上正確的事,在實踐中存在很多意想不到的問題和突發(fā)錯誤,這就考驗了我們的心理,實驗中遇到了很多的挫折與失敗,并且我們也不知道結(jié)果是如何,但我們?nèi)稳辉诓粩嗟貓猿值降?,不斷地探索,困難與希望并存,我們將繼續(xù)努力爭取更大的進步。6.參考文獻[1]譚浩強.C程序設(shè)計(第三版)[M].北京:清華大學(xué)出版社,2007.[2]張義和,王敏男,許洪昌,余春長.例說51單片機(C語言版)[M].北京:人民郵電出版社,2010.[3]黃智偉.全國大學(xué)生電子設(shè)計競賽常用電路模塊制作[M].北京:北京航空航天大學(xué)出版社,2011.附錄1:電路原理圖附錄2:源程序/*********************************************************************************@filemain.c*@authorfire*@versionV1.0*@date2015-8-2*@brief風(fēng)帆測試實驗*******************************************************************************/#include"stm32f10x.h"#include"bsp_ili9341_lcd.h"#include"bsp_SysTick.h"#include"bsp_touch.h"#include"bsp_spi_flash.h"#include"bsp_sdfs_app.h"#include"bsp_exti.h"#include"bsp_usart1.h"#include"bsp_breathing.h" #include"bsp_adc.h"#include"bsp_led.h"extern__IOuint32_tADC_ConvertedValue[datashu];externuint32_ts;floatADC_ConvertedValueLocal_1;floatADC_ConvertedValueLocal_2;externvolatileunsignedchartouch_flag;externuint16_tADC_LCD_NUM_Y; uint16_tTIME1=400,TIME2=600;/***@brief:主函數(shù)*/intmain(void){ //PIO_Config(); SysTick_Init(); //系統(tǒng)定時器 //EXTI_PC13_Config(); USART1_Config();//打印串口初始化A9,10 //ADC1_GPIO_Config();//PC0,1 //TIM5_Cap_Init();//PA0 //TIM3_Mode_Config();//PWM輸出 Sd_fs_init(); //SD卡初始化LCD_Init();/LCD/初始化PD0,1,4,5,7,8,9,10,14,15?£P(guān)E7,8,9,10,11,12,13,14,15 SPI_FLASH_Init();//外部flash初始化PA4,5,6,7 Lcd_GramScan(2);//RAM掃描方向Touch_Init();//觸摸屏和中斷初始化PE0,2,3,4?£D13 /*等待觸摸屏校準完成*/ SPI_FLASH_BufferRead(&cal_flag,0,1); if(cal_flag==0x55){SPI_FLASH_BufferRead((void*)cal_p,1,sizeof(cal_p));SPI_FLASH_CS_HIGH();}else{while(Touch_Calibrate()!=0);}Palette_Init(); while(1){ if(touch_flag==1) {if(Get_touch_point(&display,Read_2046_2(),&touch_para)!=DISABLE){ LCD_DisNum(display.x,display.y,display.x,BLACK); LCD_DisNum(display.x,display.y+12,display.y,BLACK); Palette_draw_point(display.x,display.y);}}}/*endoffile*/Bsp_touch.c#include"bsp_touch.h"#include"bsp_gpio_spi.h"#include"bsp_ili9341_lcd.h"#include"bsp_SysTick.h"#include"bsp_spi_flash.h"#include"bsp_adc.h"#include"bsp_SysTick.h"#include"bsp_usart1.h"#include"bsp_breathing.h" //#defineGPIO_Write(GPIOA,x)P1=xexternvolatileunsignedchartouch_flag;longdoubleaa1=0,bb1=0,cc1=0,aa2=0,bb2=0,cc2=0;#defineTHRESHOLD2CoordinateDisplaySample[4]={{45,35},{10,200},{290,200},{200,35}};Coordinatedisplay;voidTouch_Init(void){GPIO_SPI_Config();}/**us??±e?óê±£?2?ê?oü??è·*/staticvoidDelayUS(vu32cnt){uint16_ti;for(i=0;i<cnt;i++){uint8_tus=12;/*éè???μ?a12£?′ó???ó1?¢??*/while(us--)/*?ó1?¢?? */{;}}} staticvoidXPT2046_WriteCMD(unsignedcharcmd){unsignedcharbuf;unsignedchari;//TP_CS(1);TP_DIN(0);TP_DCLK(0);//TP_CS(0);for(i=0;i<8;i++){buf=(cmd>>(7-i))&0x1;TP_DIN(buf);//Delayus(5);DelayUS(5);TP_DCLK(1);//Delayus(5);DelayUS(5);TP_DCLK(0);}}staticunsignedshortXPT2046_ReadCMD(void){unsignedshortbuf=0,temp;unsignedchari;TP_DIN(0);TP_DCLK(1);for(i=0;i<12;i++){TP_DCLK(0);temp=(TP_DOUT)?1:0;buf|=(temp<<(11-i));TP_DCLK(1);}buf&=0x0fff;return(buf);}uint16_tXPT2046_ReadAdc(uint8_t_ucCh){ //uint16_tusAdc;XPT2046_WriteCMD(_ucCh); return XPT2046_ReadCMD();}voidDrawCross(uint16_tx,uint16_ty){LCD_Clear(x,y,20,1,RED);LCD_Clear(x+10,y-10,1,20,RED);}/**?áè?TPxyμ?AD?μ(12bit£?×?′óê?4096)*/voidTouch_GetAdXY(int*x,int*y){intadx,ady;//adx=Read_X();adx=XPT2046_ReadAdc(CHX);DelayUS(1);//ady=Read_Y();ady=XPT2046_ReadAdc(CHY);*x=adx;*y=ady;}Coordinate*Read_2046(void){staticCoordinatescreen;intm0,m1,m2,TP_X[1],TP_Y[1],temp[3];uint8_tcount=0; /*×?±êXoíY??DD9′?2é?ù*/intbuffer[2][9]={{0},{0}}; do{ Touch_GetAdXY(TP_X,TP_Y);buffer[0][count]=TP_X[0];buffer[1][count]=TP_Y[0];count++; } while(!INT_IN_2046&&count<9); /*è?1?′¥±êμˉ?e*/ if(INT_IN_2046==1){ touch_flag=0; }if(count==9) {temp[0]=(buffer[0][0]+buffer[0][1]+buffer[0][2])/3;temp[1]=(buffer[0][3]+buffer[0][4]+buffer[0][5])/3;temp[2]=(buffer[0][6]+buffer[0][7]+buffer[0][8])/3;m0=temp[0]-temp[1];m1=temp[1]-temp[2];m2=temp[2]-temp[0];m0=m0>0?m0:(-m0);m1=m1>0?m1:(-m1);m2=m2>0?m2:(-m2);if(m0>THRESHOLD&&m1>THRESHOLD&&m2>THRESHOLD)return0;if(m0<m1){if(m2<m0)screen.x=(temp[0]+temp[2])/2;elsescreen.x=(temp[0]+temp[1])/2; }elseif(m2<m1)screen.x=(temp[0]+temp[2])/2;elsescreen.x=(temp[1]+temp[2])/2;temp[0]=(buffer[1][0]+buffer[1][1]+buffer[1][2])/3;temp[1]=(buffer[1][3]+buffer[1][4]+buffer[1][5])/3;temp[2]=(buffer[1][6]+buffer[1][7]+buffer[1][8])/3;m0=temp[0]-temp[1];m1=temp[1]-temp[2];m2=temp[2]-temp[0];m0=m0>0?m0:(-m0);m1=m1>0?m1:(-m1);m2=m2>0?m2:(-m2);if(m0>THRESHOLD&&m1>THRESHOLD&&m2>THRESHOLD)return0;if(m0<m1){if(m2<m0)screen.y=(temp[0]+temp[2])/2;elsescreen.y=(temp[0]+temp[1])/2; }elseif(m2<m1)screen.y=(temp[0]+temp[2])/2;elsescreen.y=(temp[1]+temp[2])/2;return&screen;}elseif(count>1){screen.x=buffer[0][0];screen.y=buffer[1][0];return&screen;}return0;}Coordinate*Read_2046_2(void){staticCoordinatescreen2;intTP_X[1],TP_Y[1];uint8_tcount=0;intbuffer[2][10]={{0},{0}};intmin_x,max_x;intmin_y,max_y;int i=0;do { /*?-?·2é?ù10′?*/Touch_GetAdXY(TP_X,TP_Y);buffer[0][count]=TP_X[0];buffer[1][count]=TP_Y[0];count++;} while(!INT_IN_2046&&count<10); /*è?1?′¥±êμˉ?e*/if(INT_IN_2046) { touch_flag=0; } if(count==10) {max_x=min_x=buffer[0][0];max_y=min_y=buffer[1][0];for(i=1;i<10;i++){if(buffer[0][i]<min_x){min_x=buffer[0][i];}elseif(buffer[0][i]>max_x){max_x=buffer[0][i];}}for(i=1;i<10;i++){if(buffer[1][i]<min_y){min_y=buffer[1][i];}elseif(buffer[1][i]>max_y){max_y=buffer[1][i];}} /*è¥3y×?D??μoí×?′ó?μ??oó?ó???ù?μ*/screen2.x=(buffer[0][0]+buffer[0][1]+buffer[0][2]+buffer[0][3]+buffer[0][4]+buffer[0][5]+buffer[0][6]+buffer[0][7]+buffer[0][8]+buffer[0][9]-min_x-max_x)>>3;screen2.y=(buffer[1][0]+buffer[1][1]+buffer[1][2]+buffer[1][3]+buffer[1][4]+buffer[1][5]+buffer[1][6]+buffer[1][7]+buffer[1][8]+buffer[1][9]-min_y-max_y)>>3;return&screen2;}return0;}Coordinate*screenPtr,Parameter*para){FunctionalStateretTHRESHOLD=ENABLE;para->Divider=((screenPtr[0].x-screenPtr[2].x)*(screenPtr[1].y-screenPtr[2].y))-((screenPtr[1].x-screenPtr[2].x)*(screenPtr[0].y-screenPtr[2].y)); if(para->Divider==0){retTHRESHOLD=DISABLE;}else{para->An=((displayPtr[0].x-displayPtr[2].x)*(screenPtr[1].y-screenPtr[2].y))-((displayPtr[1].x-displayPtr[2].x)*(screenPtr[0].y-screenPtr[2].y));para->Bn=((screenPtr[0].x-screenPtr[2].x)*(displayPtr[1].x-displayPtr[2].x))-((displayPtr[0].x-displayPtr[2].x)*(screenPtr[1].x-screenPtr[2].x));/*C£?(Y0(X2XD1£-X1XD2)+Y1(X0XD2£-X2XD0)+Y2(X1XD0£-X0XD1))£ˉK*/para->Cn=(screenPtr[2].x*displayPtr[1].x-screenPtr[1].x*displayPtr[2].x)*screenPtr[0].y+(screenPtr[0].x*displayPtr[2].x-screenPtr[2].x*displayPtr[0].x)*screenPtr[1].y+(screenPtr[1].x*displayPtr[0].x-screenPtr[0].x*displayPtr[1].x)*screenPtr[2].y;/*D£?((YD0£-YD2)(Y1£-Y2)£-(YD1£-YD2)(Y0£-Y2))£ˉK */para->Dn=((displayPtr[0].y-displayPtr[2].y)*(screenPtr[1].y-screenPtr[2].y))-((displayPtr[1].y-displayPtr[2].y)*(screenPtr[0].y-screenPtr[2].y));/*E£?((X0£-X2)(YD1£-YD2)£-(YD0£-YD2)(X1£-X2))£ˉK */para->En=((screenPtr[0].x-screenPtr[2].x)*(displayPtr[1].y-displayPtr[2].y))-((displayPtr[0].y-displayPtr[2].y)*(screenPtr[1].x-screenPtr[2].x));/*F£?(Y0(X2YD1£-X1YD2)+Y1(X0YD2£-X2YD0)+Y2(X1YD0£-X0YD1))£ˉK*/para->Fn=(screenPtr[2].x*displayPtr[1].y-screenPtr[1].x*displayPtr[2].y)*screenPtr[0].y+(screenPtr[0].x*displayPtr[2].y-screenPtr[2].x*displayPtr[0].y)*screenPtr[1].y+(screenPtr[1].x*displayPtr[0].y-screenPtr[0].x*displayPtr[1].y)*screenPtr[2].y;}return(retTHRESHOLD);}intTouch_Calibrate(void){uint8_ti;u16test_x=0,test_y=0;u16gap_x=0,gap_y=0;Coordinate*Ptr;for(i=0;i<4;i++){LCD_Clear(0,0,320,240,BACKGROUND);LCD_DispStr(110,110,(uint8_t*)"TouchCalibrate",RED); LCD_DisNum(160,90,i+1,RED);/*êêμ±μ??óê±oüóD±?òa*/Delay_ms(500);DrawCross(DisplaySample[i].x,DisplaySample[i].y);//??ê?D£?yó?μ??°ê??±×?do{Ptr=Read_2046_2();//?áè?TSC2046êy?Yμ?±?á?ptr}while(Ptr==(void*)0);//μ±ptr?a??ê±±íê???óD′¥μ?±?°′??ScreenSample[i].x=Ptr->x; //°??áè?μ??-ê?êy?Y′?·?μ?è???±?á?ScreenSample?á11ì?ScreenSample[i].y=Ptr->y;}Cal_touch_para(&DisplaySample[0],&ScreenSample[0],&touch_para); test_x=((touch_para.An*ScreenSample[3].x)+(touch_para.Bn*ScreenSample[3].y)+touch_para.Cn)/touch_para.Divider; /*è?ò???μ?????Y?μ*/test_y=((touch_para.Dn*ScreenSample[3].x)+(touch_para.En*ScreenSample[3].y)+touch_para.Fn)/touch_para.Divider;gap_x=(test_x>DisplaySample[3].x)?(test_x-DisplaySample[3].x):(DisplaySample[3].x-test_x);gap_x=(test_y>DisplaySample[3].y)?(test_y-DisplaySample[3].y):(DisplaySample[3].y-test_y);//LCD_Rectangle(0,0,320,240,CAL_BACKGROUND_COLOR);LCD_Clear(0,0,320,240,BACKGROUND);if((gap_x>10)||(gap_y>10)){LCD_DispStr(100,100,(uint8_t*)"Calibratefail",RED);LCD_DispStr(100,120,(uint8_t*)"tryagain",RED);Delay_ms(2000);return1;}/*D£?y?μêy?aè???±?á?*///aa1=(touch_para.An*1.0)/touch_para.Divider;//bb1=(touch_para.Bn*1.0)/touch_para.Divider;//cc1=(touch_para.Cn*1.0)/touch_para.Divider;////aa2=(touch_para.Dn*1.0)/touch_para.Divider;//bb2=(touch_para.En*1.0)/touch_para.Divider;//cc2=(touch_para.Fn*1.0)/touch_para.Divider;cal_p[0]=(touch_para.An*1.0)/touch_para.Divider;//aa1cal_p[1]=(touch_para.Bn*1.0)/touch_para.Divider;//bb1cal_p[2]=(touch_para.Cn*1.0)/touch_para.Divider;//cc1cal_p[3]=(touch_para.Dn*1.0)/touch_para.Divider;//aa2cal_p[4]=(touch_para.En*1.0)/touch_para.Divider;//bb2cal_p[5]=(touch_para.Fn*1.0)/touch_para.Divider;//cc2{cal_flag=0x55;SPI_FLASH_SectorErase(0);SPI_FLASH_BufferWrite(&cal_flag,0,1);SPI_FLASH_BufferWrite((void*)cal_p,1,sizeof(cal_p));//for(k=0;k<6;k++)//printf("\r\ntx=%LF\r\n",cal_p[k]);}LCD_DispStr(100,100,(uint8_t*)"CalibrateSucced",RED);Delay_ms(1000);return0;}//longdoublelinear=0;//longdoubleaa1=0,bb1=0,cc1=0,aa2=0,bb2=0,cc2=0;FunctionalStateGet_touch_point(Coordinate*displayPtr,Coordinate*screenPtr,Parameter*para){FunctionalStateretTHRESHOLD=ENABLE;if(screenPtr==0){retTHRESHOLD=DISABLE; }else{//if(para->Divider!=0)if(para->Divider!=1){//displayPtr->x=((aa1*screenPtr->x)+(bb1*screenPtr->y)+cc1);//displayPtr->y=((aa2*screenPtr->x)+(bb2*screenPtr->y)+cc2);displayPtr->x=((cal_p[0]*screenPtr->x)+(cal_p[1]*screenPtr->y)+cal_p[2]);displayPtr->y=((cal_p[3]*screenPtr->x)+(cal_p[4]*screenPtr->y)+cal_p[5]);}else{retTHRESHOLD=DISABLE;}}return(retTHRESHOLD);}u16data_hebing(uint8_t*pstr){u8i; u32s=0; while(*pstr!='\0'&&*pstr!='.') { //if(*pstr==46) /*0*/ i=*pstr-48; s=(s*10)+i; pstr++;}returns;}voidPalette_Init(void){LCD_Clear(0,0,320,240,WHITE); LCD_Clear(2,2,16*5,32,BLUE);LCD_DispStrCH(10,10,(uint8_t*)"·μ???÷ò3",RED); LCD_Clear(2,2+50,16*5,32,BLUE); LCD_DispStrCH(10,10+50,(uint8_t*)"?ù′?2?·?",RED); LCD_Clear(2,2+100,16*5,32,BLUE); LCD_DispStrCH(10,10+100,(uint8_t*)"·¢?ó2?·?",RED);}intJICHU_q=0;//?ù′?oˉêy??è?±ê????externfloatADC_ConvertedValueLocal_1;externfloatADC_ConvertedValueLocal_2;externuint16_tADC_LCD_NUM_Y;externfloatADC_DATE_jiaodu;//è??????èAD?μexternfloatPWM_in_dianji;//è???PWMê?è?2????μexternfloatADC_out_jiaodu;//è???PWMê?3??μintjiaodu=0;//???è?μ?a?a0-60?èint ERR=0;//ê?è?′í?ó±ê??//intEXTI_PC13_q=0;//ADCí¨??????£??ú???ò??í¨?ì2a×′ì?externu16period_cnt;/*******************************************************oˉêy??£oPalette_draw_point*?èê?£o????μ?????£?′¥???÷3ìDò*?Toó쨣?*ê?è?:Xpos --X·??ò????*Ypos --Y·??ò????*ê?3?£o?T*?ùày£oPalette_draw_point(100,100);*×¢òa£o*********************************************************/voidPalette_draw_point(uint16_tx,uint16_ty){ intque_ding=1,i,data_i,zuobiao_i; uint8_tdata[12]="741.8520963c"; uint8_tdata_1[3]=""; intanjian_unm=0;//?ü?ì°′??′?êy/*?-±ê??è??aoúé?*//*ó|ó?3ìDò*/ if(x>2&&x<69&&y>53&&y<82) { LCD_DispStrCH(100,10,(uint8_t*)"??è??ù′?2?·?3ìDò",RED); LCD_Clear(2,40,16*7,16*8,WHITE);//?á±???è?°′?¥ /*****************************/ LCD_DispStrCH(100,50,(uint8_t*)"éè?¨???è?μ",RED); LCD_DispStrCH(200,50,(uint8_t*)"?è",RED); LCD_DispStrCH(100,80,(uint8_t*)"êμ?ê???è?μ",RED); LCD_DispStrCH(200,80,(uint8_t*)"?è",RED); LCD_Clear(150-8,130-4,16*2,24,BLUE); LCD_DispStrCH(150,130,(uint8_t*)"?ó",RED); LCD_Clear(150-8,170-4,16*2,24,BLUE); LCD_DispStrCH(150,170,(uint8_t*)"??",RED); LCD_Clear(210-8,170-4,16*5,24,BLUE); LCD_DispStrCH(210,170,(uint8_t*)"??ê????è",RED); /********×óò3??μ?íaéè3?ê??ˉ3ìDò******/ //JICHU_q=0; ADC1_Init(); //TIM5_Cap_Init();//ê?è?2???TIM3_Mode_Config();//PWMê?3? while(1) { Get_touch_point(&display,Read_2046_2(),&touch_para); LCD_DisNum(100+(5*16),50,period_cnt,BLACK); if(display.x>134&&display.x<162&&display.y>127&&display.y<154)//?ó { if(period_cnt<359)//μèóúá?ê±?T·¨?? period_cnt=period_cnt+10;//×??ó2?è display.x=0;display.y=0; } if(display.x>134&&display.x<164&&display.y>172&&display.y<196)//?? { if(period_cnt>0)//μèóúá?ê±?T·¨?? period_cnt=period_cnt-10;//×???2?è display.x=0;display.y=0; } if(display.x>194&&display.x<273&&display.y>171&&display.y<199)//?ó { // DIANJI_t=0; //beats=(360*4096)/360; //TIM_Cmd(TIM2,ENABLE);//?a???¨ê±?÷ display.x=0;display.y=0; } } } if(x>2&&x<101&&y>10+60&&y<134) { LCD_DispStrCH(90,10,(uint8_t*)"??è?·¢?ó2?·?3ìDò",RED); LCD_Clear(2,40,16*7,16*8,WHITE);//?á±???è?°′?¥ /*******??ê??ü?ì£?á???ê?è??ò£?*/ LCD_DispCH(149+44,90-1,"?è",BLACK); LCD_Clear(175,90,16,12,BLACK);//R?μ?ò //LCD_DispChar(119+75,70,'%',BLACK);//°ù·?±è·?o? //LCD_Clear(175,70,19,12,BLACK);//°ù·?±è?ò LCD_Clear(160,120,140,175,BLUE);//à?é??é LCD_Clear(160,120,6,190,BLACK);//oúé?êúì? LCD_Clear(160+(1*46),120,6,190,BLACK); LCD_Clear(160+(2*46),120,6,190,BLACK); LCD_Clear(160+(3*46),120,6,190,BLACK); LCD_Clear(160,120,140,8,BLACK); LCD_Clear(160,150,140,8,BLACK);//oúé?oáì? LCD_Clear(160,180,140,8,BLACK); LCD_Clear(160,210,140,8,BLACK); LCD_DispCH(175,130,"??",BLACK); LCD_DispCH(175+(1*46),130,"°?",BLACK); LCD_DispCH(175+(2*46),130,"??",BLACK); LCD_DispCH(17
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國汽車芯片認證標準體系構(gòu)建與替代窗口期預(yù)測研究報告
- 2026年湛江市坡頭區(qū)城市管理和綜合執(zhí)法局公開招聘政府雇員(非編制人員)備考題庫及完整答案詳解一套
- 2025至2030中國現(xiàn)制茶飲供應(yīng)鏈標準化建設(shè)與加盟商管理優(yōu)化報告
- 中電建基礎(chǔ)局廊坊建設(shè)工程有限公司技能操作崗2026屆校園招聘備考題庫含答案詳解
- 2025-2030中國功能性飼料市場發(fā)展分析及市場趨勢與投資方向研究報告
- 中山市第八人民醫(yī)院(中山市人民醫(yī)院黃圃院區(qū))2026年衛(wèi)生專業(yè)技術(shù)人才招聘備考題庫及完整答案詳解1套
- 佛山市南海區(qū)人民醫(yī)院2026年度合同制專業(yè)技術(shù)人員(第一批)招聘備考題庫及答案詳解1套
- 大唐克騰煤制天然氣有限責(zé)任公司2026屆畢業(yè)生招聘備考題庫及一套答案詳解
- 2026年玉溪市生態(tài)環(huán)境局華寧分局編外辦公輔助(內(nèi)勤相關(guān))人員公開招聘備考題庫有答案詳解
- 2025-2030中國智能智能電磁爐控制系統(tǒng)行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 蘇州高新區(qū)(虎丘區(qū))市場監(jiān)督管理局公益性崗位招聘1人考試參考題庫及答案解析
- 北京通州產(chǎn)業(yè)服務(wù)有限公司招聘參考題庫完美版
- 企業(yè)安全隱患排查課件
- 2025版《煤礦安全規(guī)程》宣貫解讀課件(電氣、監(jiān)控與通信)
- 2025年國家開放大學(xué)《管理學(xué)基礎(chǔ)》期末機考題庫附答案
- 2025年人民網(wǎng)河南頻道招聘備考題庫參考答案詳解
- ESHRE子宮內(nèi)膜異位癥的診斷與治療指南(2025年)
- 急驚風(fēng)中醫(yī)護理查房
- 基于視頻圖像的大型戶外場景三維重建算法:挑戰(zhàn)、創(chuàng)新與實踐
- 2025年四川省高職單招模擬試題語數(shù)外全科及答案
- 2025年江蘇事業(yè)單位教師招聘體育學(xué)科專業(yè)知識考試試卷含答案
評論
0/150
提交評論