1.001.jpg (14.45 KB, 下載次數: 84)
下載附件
2017-7-12 23:00 上傳
電控學院課程設計(論文) 課程名稱:ARM課程設計 題 目:雙通道數據采集系統的設計 院 (系):電氣與控制工程學院 專業班級:自動化1002班 姓 名:李*斌 魚*輪 陳*姣 朱*甜 學 號:1106050209H6050218H6050201H6050203 指導教師:李紅巖 楊學存
第1章 緒論 1.1 ARM概述及其發展 ARM公司的IP核已經由ARM7,ARM9發展到今天的ARM11版本。ARM11囊括了Thumb-2,CoreSight,TrusZone 等眾多業界領先技術,同時由單一的處理器內核向多核發展,為高端的嵌入式應用提供了強大的處理平臺。高集成度SOC芯片的采用可以帶來一系列好處,諸如減少了外圍器件和PCB面積,提高系統抗干擾能力,縮小產品體積,降低功耗等。 ARM 公司是一家IP供應商,其核心業務是IP核以及相關工具的開發和設計。半導體廠商通過購買ARM公司的IP授權來生產自己的微處理器芯片。由此以來,處理器內核來自ARM公司、各芯片廠商結合自身已有的技術優勢以及芯片的市場定位等因數使芯片設計最優化,從而產生了一大批高度集成、各據特色的SOC芯片。例如Intel公司的XScale系列集成了LCD控制器、音頻編/解碼器,定位于智能PDA市場;Atmel公司的AT91系列片內集成了大容量 Flash和RAM、高精度A/D轉換器以及大量可編程I/O端口,特別適合于工業控制領域;Philips公司的LPC2000系列片內集成了128位寬的零等待Flash存儲器以及I2C, SPI,PWM,UART等傳統接口,極高的性價比使它對傳統的8/16位MCU提出了嚴峻的挑戰。本次設計仍使用的ARM7系列。 1.2 ARM微處理器 1.2.1 ARM微處理器的特點 ARM微處理器采用RISC指令集、使用大量寄存器、ARM/THUMB指令支持、三/五級流水線具有低功耗、低成本、高性能等特點。 1.2.2 ARM微處理器LPC2131概述及其構造 LPC2131簡介 LPC2131的內核是ARM7TDMI-S核,32位微處理器,采用馮·諾依曼結構(數據和指令混合編址)。 ARM7TDMI-S核采用三級流水線,還使用了一個被稱為Thumb(16位指令長度)的獨特結構化策略,適合那些對存儲器有限制或者需要較高代碼密度的大批量產品的應用。Thumb代碼僅為ARM代碼規模的65%,但是性能卻是連接到16位存儲器系統的相同ARM處理器性能的160%。 較小的封裝(LQFP64)和極低的功耗使LPC2131可理想的應用于小型系統中,如通信網關、協議轉換器、聲音辨別、低端成像、工業控制和醫療系統。 1.2.3.LPC2131特性:
1.002.jpg (24.2 KB, 下載次數: 98)
下載附件
2017-7-12 23:00 上傳
8KB片內SRAM; 32KB片內Flash,128位寬度接口/加速器實現高達60MHz的操作頻率; 8路10位A/D轉換器; 2個32位定時器(帶4路捕獲和4路比較通道),PWM單元(6路輸出)和看門狗; 2個UART,2個高速IIC接口(400Kb/s),SPI,SSP; 向量中斷控制器,可配置優先級和向量地址; 47個(P0.0-P0.23,P0.24-P0.31,P1.16-P1.31)可承受5V電壓的通用I/O口; 9個邊沿或者電平觸發的外部中斷引腳; 片內晶體振蕩電路支持頻率1-30MHz; 2個低功耗模式:空閑和掉電; ARM內部結構原理圖 單電源供電,含有上電復位(POR)和掉電檢測(BOD)電路,CPU操作電壓3.0-3.6V。 1.2.4.LPC2131最小系統 在LPC2131中,存儲系統為可以選擇的,這是由于許多面向嵌入式領域的嵌入式的微控制器的內部設計好了程序與數據的存儲器,存儲器的系統無需自己來設計,調試和測試的接口也不一定是必需需要的。
1.003.jpg (10.91 KB, 下載次數: 107)
下載附件
2017-7-12 23:00 上傳
最小系統原理圖 第3章 硬件電路設計 4 .1控制模塊 以ARM7LPC2131開發板為控制核心,無需再添加晶振及復位電路等外圍電路,其運算速率非常快,并且ARM7-LPC2131有6路PWM脈沖輸出,8路10位的A/D轉換和1個D/A轉換,2個帶4路捕獲和4路比較通道的32位定時器,1個2KB的Flash存儲器、看門狗,實時時鐘等,它不僅可以在系統編程,在內置的串行JTAG接口對存儲器進行編程,也可以在應用編程的過程中對存儲器進行編程。 晶顯示模塊12864具有四位或八位并行,兩線或三線串行等多種接線方式,內部具有簡體的中文字庫,液晶顯示的分辨率是128×64, 其內部含有8192個16 * 16點漢字和128個16 * 8點ASCII碼字符集。通過靈活的接線方式以及利用簡單的指令,能夠很方便地產生全中文的人機交互界面,可以顯示漢字,也可以顯示圖形。 液晶顯示模塊12864具有低電壓以及低功耗的特點。該液晶模塊同其它顯示圖形的點陣液晶模塊相比,具有硬件電路簡單,顯示程序更簡潔等諸多優點,并且該液晶顯示模塊價格較為便宜。可以采用熱敏電阻來實現溫度的測量,可滿足40攝氏度至90攝氏度測量范圍,但熱敏電阻精度、重復性、可靠性較差,對于檢測到的溫度的精確度不能夠得到保證。在本裝置中,要實現精度為0.1攝氏度溫度的車輛,采用熱敏電阻不嫩夠滿足求,故考慮采用數字溫度傳感器DS18B20。DS18B20 測量溫度,輸出信號全數字化,便于單片機處理及控制,單總線的數據傳輸,省去傳統的測溫方法的很多外圍電路,系統的結構可以做得較為緊湊
1.004.jpg (11.95 KB, 下載次數: 96)
下載附件
2017-7-12 23:00 上傳
圖3 DS18B20 電路
1.005.jpg (26.02 KB, 下載次數: 110)
下載附件
2017-7-12 23:00 上傳
4.2.12864顯示內部 第4章 軟件設計 系統的軟件設計包括程序的下載和調試,需要用到ADS集成開發環境和EASYJTAG-H仿真使用器。該仿真器是ARM公司開發出的標準的20腳JTAG仿真的簡易仿真器,實現了全速,單步和斷點等調試功能,采用ADS1.2集成開發的RDI協議,支持在AXD中直接固話程序到片內Flash。 EASYJTAG-H仿真器是符合ARM公司提出的標準20腳JTAG仿真調試接口的簡易仿真器。該仿真器采用ADS1.2集成開發環境的RDI協議。實現了單步、全速及斷點等調試功能,此外支持在AXD中直接固化程序到片內FLASH。H-JTAG 軟件具有如下特點:支持ARM7/ARM9,支持自動檢測和手動指定內核; 使用RDI 接口,支持SDT2.51、ADS1.2、REALVIEW 和IAR 集成開發環境;支持2 個硬件斷點或數量不限的軟件斷點; 支持ARM/Thumb 模式; 支持Little Endian & BIG Endian 模式; 支持Semihosting 調試; 支持Wiggler、SDT JTAG 和自定義接口。將計算機并口與EASYJTAG-H仿真器連接,并將仿真器JTAG口接頭插入EasyARM2131開發板的J3,再使用USB連接電纜與PC連接給開發板供電。通過H-JTAG Serve和 H-Flasher兩個工具對仿真器進行配置就可以用AXD軟件進行調試了。硬件調試及結果分析。硬件調試:硬件調試時,應先檢查印制板及焊接的質量是否符合要求,有無虛焊點及線路間有無短路、斷路。然后用萬用表測試或通電檢測,檢查無誤后,可通電檢查LCD液晶顯示器亮度情況,一般情況下取背光電壓為4~5.5V即可得到滿意的效果。采用編程器將程序寫入單片機,給電路板供電,觀察電路工作情況,再進行最終的處理。 4.1軟件實現方框圖 系統軟件采用C語言編程,程序詳情請參見附錄。 程序的流程圖如下:
1.006.jpg (12.77 KB, 下載次數: 97)
下載附件
2017-7-12 23:00 上傳
第5章 心得 李呈斌1106050209 我們組做的課題是多路數據采集,我主要負責硬件的焊接及調試。我們課題的基本功能是電壓的采集,拓展功能是將A/D轉換器的本身測量范圍0~3.3V擴展到10V,外加一個溫度測量。雖然實現功能都是基本的拓展功能,但從最初的沒有頭緒,到查資料,和組員之間互相探討學習,再到最后展現成品,整個過程都讓我學到了很多。 當然,在此次課程設計中,遇到了一些問題,但經過和組員的共同檢查,終于找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經驗不足。通過此次課程設計使我更加扎實的掌握了有關ARM方面的知識,實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。在以后的工作中,我會更注意自己知識的不足,及時的充足自己各個方面。 魚輪1106050218 數據采集系統是將采集傳感器輸出的溫度,流量等模擬信號轉換成計算機能識別的數字信號,我們組基于兩路電壓的采集之上擴展了A/D轉化器的測量范圍,以及溫度的采集,本次課程設計我主要負責部分軟件的編寫,以及原理圖的繪制。因為軟件不是我的特別強項,剛開始也是無從下手,查資料,請教老師和同學,慢慢的從中學到了很多,在后期的拓展功能,也能稍微的得心應手。兩周的時間,學到的東西很多,特別是此次軟件的編寫到功能的實現,讓我明白一定要不懈努力,不能遇到問題就想到要退縮,不能知難而退,那樣永遠不可能得到自己期待的結果。 通過本次設計,能使自己對所學知識有一個系統的認識和理解,不僅能夠熟練掌握繪圖軟件的基本操作,而且也讓我對軟件這一塊有了更深的學習,使自己的興趣大大提高,以后會多閱讀這方面的資料和書籍來提高自己的能力和經驗。 陳姣1106050201 兩周的課程設計,我們組的任務算是比較完美的完成,在預期的基本功能上拓展了我們自己的想法:擴大A/D轉換器的量程范圍,溫度的采集。此次的課設中,我們團隊從查資料,原理圖的繪制,硬件的焊接,軟件的編輯,到最后的成品,四個人都付出了自己的一份努力。我從最初對課題的不解,到成品運轉,整個流程,學到了很多的東西,當然,在設計的過程中遇到了很多問題,比如,焊接完成,在硬件檢測的時候,發現所需的電阻阻值與焊接上的電阻阻值不相符;在加拓展功能時,調試量程的誤差解決等等。總而言之,在此次ARM的課程設計中,知識的增長有很多,因為我們學到的東西不夠深奧,所以要勤看課本,多查資料,從基礎著手,一點一滴的積累,慢慢的應用到不同的領域中。還有,團隊的互助,雖然有時候也會意見不統一,但我們的團隊很有包容性,大家都很為對方考慮,努力把課題做到大家都滿意的程度。 朱新甜1106050203 在這次為期兩周課程設計的過程中,我深深的感觸到了團隊合作的重要性,尤其是在當今的社會工作中,一個人的力量在一個巨大的任務前是那么的渺小,必須靠多人合作才能共同完成。在設計規劃過程,我們小組四個人親密無間的合作,使得本次課程設計能夠非常順利地完成,在課程設計的過程中,每個人都能 按要求很好的完成分配給自己的任務,最后大家一起通過討論把所有任務串連起來完成總的設計任務。 通過本次課程設計,讓我很好的鍛煉了理論聯系實際,與具體項目、課題相結合開發、設計產品的能力。既讓我們懂得了怎樣將理論應用于實際,又讓我們懂得了在實踐中遇到的問題怎樣用理論去解決。在設計過程中,總是會遇到這樣或那樣的問題。有時一個問題可能會需要大家集體去查閱資料,做大量的工作,花大量的時間才能解決。通過不斷地發現問題,解決問題,自然而然,我的發現問題和解決問題的能力便在其中建立起來了。這都為以后的工作積累了經驗,同時也增強了我們解決問題的能力。非常感謝老師的指導,和同學的幫忙。 第6章 調試及實物照片:
1.007.jpg (13.12 KB, 下載次數: 89)
下載附件
2017-7-12 23:00 上傳
1.008.jpg (39.41 KB, 下載次數: 100)
下載附件
2017-7-12 23:00 上傳
1.009.jpg (24.75 KB, 下載次數: 117)
下載附件
2017-7-12 23:00 上傳
參考文獻: 【1】周立功,ARM嵌入式系統基礎教程【M】北京航空航天大學出版社,2008.9 【2】周明安,朱光忠,步進電機驅動技術發展及現狀【J】機電工程技術,2005 【3】許大中、賀益康,電機控制【M】杭州:浙江大學出版社,2002 【4】周立功、陳明計、陳渝,ARM嵌入式Linux系統構建與驅動開發范例【M】: 北京航空航天大學出版社,2006 致謝 值此論文完成之際,我要代表全組成員衷心的感謝給予我們關心和幫助的所有師長,同學和朋友們。而且,我們要特別感謝此次課程設計的李紅巖老師,在我們小組進行電路硬件和軟件設計的時候悉心的指導和無微不至的關懷給予了我們很大的幫助,是我們受益匪淺。他淵博的學識和平易近人的風范、嚴謹的治學態度和以身作則的高貴品質,不斷激勵我們奮進,在這里我們小組全體成員在這表示誠摯的謝意! 最后,感謝我的母校西安科技大學電氣與控制工程學院,希望她能越辦越強大,培養出更多的優秀人才! 附程序: - #include "config.h"
- #include "stdio.h"
- #include "18b20.h"
- #define CON_A (1<<8) ;
- #define CON_B (1<<9) ;
- #define E_CLK (1<<4) ; //clock input 同步時鐘輸入端
- #define RW_SID (1<<5) ; //data input/output 串行數據輸入、輸出端
- #define RS (1<<6) ;
- #define BEEP (1<<7) ;
- #define LED1 (1<<18) ;
- const uint32 KEY1 = 1 << 16;
- const uint32 KEY2 = 1 << 17;
- uint8 rcv_buf,rcv_new;
- char kcsj[] ="多路數據采集系統";
- char T[]="溫度: 攝式度";
- char tonga[]="通道1:";
- char tongb[]="通道2: ";
- char str1[6],str2[6],tem[3];
- /************************以下是12864液晶顯示器的子程序************************/
- void delay(uint32 dly)//延時函數
- {
- uint32 i;
- for ( ; dly>0; dly--)
- for (i=0; i<10; i++);
- }
-
- void SendByte(uint8 dat) //串行發送一字節數據
- {
- uint8 i;
- IO0SET|=RS;
- for(i=0;i<8;i++)
- {
- IO0CLR|=E_CLK ;
- delay(5);
- if(dat&0x80)
- {
- IO0SET|=RW_SID;delay(5);
- }
- else IO0CLR|=RW_SID;
- {
- IO0SET|=E_CLK;delay(5);
- }
- dat=dat<<1;
- }
- IO0CLR|=RS;
- }
-
- void SendCmd(uint8 dat) //寫控制命令
- {
- SendByte(0xF8); //11111,00,0 RW=0,RS=0 同步標志
- SendByte(dat&0xF0); //高四位
- SendByte((dat&0x0F)<<4); //低四位
- }
-
-
- void SendDat(uint8 dat) //寫顯示數據或單字節字符
- {
- SendByte(0xFA); //11111,01,0 RW=0,RS=1
- SendByte(dat&0xF0); //高四位
- SendByte((dat&0x0F)<<4); //低四位
- }
-
- void display(uint8 x_add, char * word) //液晶顯示函數
- {
- SendCmd(x_add); //1xxx,xxxx設定DDRAM7位地址xxx,xxxx到地址計數器AC
- while(*word!='')
- {
- SendDat(*(word++));
- }
- }
-
- void init_lcd(void) //初始化 12864_LCD
- {
-
- delay(100);
- SendCmd(0x30); //功能設置,一次送8位數據,基本指令集
- SendCmd(0x0C); //0000,1100 整體顯示,游標off,游標位置off
- SendCmd(0x01); //0000,0001 清DDRAM
- SendCmd(0x02); //0000,0010 DDRAM地址歸位
- }
-
- /****************以下是串口程序***************************************/
- void DelayNS (uint32 dly)
- {
- uint32 i;
-
- for ( ; dly>0; dly--)
- for (i=0; i<5000; i++);
- }
- /* 定義串口模式設置數據結構 */
- typedef struct UartMode
- {
- uint8 datab; // 字長度,5/6/7/8可選
- uint8 stopb; // 停止位,1/2可選
- uint8 parity; // 奇偶校驗位,0-無校驗,1-奇校驗,2-偶校驗
- }UARTMODE;
-
- void UART0_SendByte (uint8 dat)
- {
- U0THR = dat; // 要發送的數據
- }
-
- void UART0_SendBuf (char *ptr)
- {
- while(*ptr != '')
- {
- UART0_SendByte(*ptr++);
- }
- while ((U0LSR & 0x20) == 0); // 等待數據發送完畢
- }
-
- int8 UART0_Init (uint32 baud, UARTMODE set)
- {
- uint32 bak;
-
- /* 參數過濾 */
- if ((baud ==0 ) || (baud > 115200)) return (0);
- if ((set.datab <5) || (set.datab > 8)) return (0);
- if ((set.stopb == 0) || (set.stopb > 2)) return (0);
- if (set.parity > 4) return (0);
-
- /* 設置串口波特率 */
- U0LCR = 0x80; // DLAB = 1
- bak = (Fpclk >> 4) / baud;
- U0DLM = bak >> 8;
- U0DLL = bak & 0xFF;
-
- /* 設置串口模式 */
- bak = set.datab - 5; // 設置字長
- if (set.stopb == 2) bak |= 0x04; // 判斷是否為2位停止位
-
- if (set.parity != 0)
- {
- set.parity = set.parity - 1;
- bak |= 0x08;
- }
- bak |= set.parity << 4; // 設置奇偶校驗
- U0LCR = bak;
- U0FCR = 0x01; // 使能FIFO,并設置觸發點為8字節
- U0IER = 0x01; // 允許RBR中斷,即接收中斷
- return (1);
- }
- void __irq IRQ_UART0 (void)
- {
-
- if ((U0IIR & 0x0F) == 0x04) // 設置接收到新的數據標志
- rcv_new = 1;
- rcv_buf = U0RBR; // 讀取FIFO的數據,并清除中斷
- if(rcv_buf=='1')
- UART0_SendBuf(str1);
- else if(rcv_buf=='2')
- UART0_SendBuf(str2);
- else if(rcv_buf=='3')
- UART0_SendBuf(tem);
- VICVectAddr = 0x00; // 中斷處理結束
- }
- /****************以下是蜂鳴器程序***************************************/
- void beep(void)
- {
- uint8 i;
- for(i=0;i<3;i++)
- {
- DelayNS(100);
- IO0CLR|=BEEP;
- DelayNS(100);
- IO0SET|=BEEP;
- }
- }
-
-
- /****************以下是AD處理程序***************************************/
-
-
- uint32 ADC_vol(uint8 channel)
- {
- int flag;
- uint32 ADC_CE[20],ADC_Flag=0;
- for(flag=0;flag<20;flag++)
- {
- switch(channel)
- {
- case 1:AD0CR = (AD0CR&0x00FFFF00)|0x01|(1 << 24);break; // 設置通道1,并進行第一次轉換
- case 2:AD0CR = (AD0CR&0x00FFFF00)|0x02|(1 << 24);break; // 設置通道2,并進行第一次轉換
- }
- while ((AD0DR & 0x80000000) == 0); // 等待轉換結束
- AD0CR |= 1 << 24; // 再次啟動轉換
- while ((AD0DR & 0x80000000) == 0); // 等待轉換結束
- ADC_CE[flag] = AD0DR; // 讀取ADC結果
- ADC_CE[flag] = (ADC_CE[flag] >> 6) & 0x3ff;
- ADC_CE[flag] = ADC_CE[flag] * 3280;
- ADC_CE[flag]=ADC_CE[flag]/1024;
- ADC_Flag+=ADC_CE[flag];
- }
- ADC_Flag=ADC_Flag/20;
- return ADC_Flag;
- }
- void deal(char *p,uint32 ADC_Data)
- {
- if(ADC_Data<10000)
- {
- p[0]=ADC_Data/1000+0x30;
- p[1]='.';
- p[2]=ADC_Data%1000/100+0x30;
- p[3]=ADC_Data%1000%100/10+0x30;
- p[4]='V';
- p[5]='';
- }
- else
- {
- p[0]=ADC_Data/10000+0x30;
- p[1]=ADC_Data%10000/1000+0x30;
- p[2]='.';
- p[3]=ADC_Data%10000%1000/100+0x30;
- p[4]=ADC_Data%10000%1000%100/10+0x30;
- p[5]='V';
- }
- }
-
- /*****************************以下為主程序*****************************************************************/
-
- int main (void)
- {
- UARTMODE set;
- int start=0;
- int temp;
- uint32 ADC_Data;
- set.datab = 8;
- set.stopb = 1;
- set.parity = 0;
-
- PINSEL0 = 0xFFFF00005; // 設置I/O連接
- PINSEL1 = 0x15400000; // 功能選擇
- PINSEL2 = PINSEL2 & (~0x08);
- IO0SET = 0XFFFFFFFF;
- IO0DIR |= 0X00000FFF;
- IO1SET = 0XFFFF0000;
- IO1DIR = 0XFFFF0000; // 設置LED1控制口為輸出
- UART0_Init(115200, set); // 串口初始化
- init_lcd(); //液晶初始化
- display(0x80,kcsj);
- display(0x90,tonga);
- display(0x88,tongb);
- display(0x98,T);
- IRQEnable(); // 使能IRQ中斷
- /*使能UART0中斷*/
- VICIntSelect = 0x00000000; // 設置所有的通道為IRQ中斷
- VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高優先級
- VICVectAddr0 = (uint32)IRQ_UART0; // 設置UART0向量地址
- VICIntEnable = 1 << 0x06; // 使能UART0中斷
-
- AD0CR = (1 << 1) | // SEL=8,選擇通道3
- ((Fpclk / 1000000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,轉換時鐘為1MHz
- (0 << 16) | // BURST=0,軟件控制轉換操作
- (0 << 17) | // CLKS=0, 使用11clock轉換
- (1 << 21) | // PDN=1,正常工作模式
- (0 << 22) | // TEST1:0=00,正常工作模式
- (1 << 24) | // START=1,直接啟動ADC轉換
- (0 << 27); // 直接啟動ADC轉換時,此位無效
- DelayNS(10);
- ADC_Data = AD0DR; // 讀取ADC結果,并清除DONE標志位
- while (1)
- {
-
- temp=Do1Convert1();
- tem[0]=temp/100000+0x30;
- tem[1]=temp%100000/10000+0x30;
- tem[2]='';
- display(0X9b,tem);
-
- if ( (IO0PIN & KEY1) == 0)
- {
- DelayNS(10);
- if((IO0PIN & KEY1) ==0)
- {
- while((IO0PIN & KEY1) ==0);
- start=1;
- }
- }
-
- if((IO0PIN & KEY2) == 0)
- {
- DelayNS(10);
- if((IO0PIN & KEY2)==0)
- {
- while((IO0PIN & KEY2)==0);
- start=0;
- }
- }
- if(start==1)
- {
- ADC_Data=ADC_vol(1); //通道1
- if(ADC_Data>3200)
- {
- beep();
- IO1SET|=LED1;
- }
- else IO1CLR|=LED1;
- deal(str1,ADC_Data);
- display(0x93,str1);
-
-
- ADC_Data=ADC_vol(2); //通道2
- if(ADC_Data>3015)
- {
- beep();
- IO1SET|=LED1;
- ADC_Data=ADC_Data*10/3;
- }
- else if(2700<adc_data<=3015)
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
-
復制代碼
完整設計報告下載(word格式 可編輯):
基于ARM2331的多路雙通道數據采集報告.doc
(1.51 MB, 下載次數: 22)
2017-7-12 18:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|