<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 模擬技術(shù) > 設計應用 > ARM開(kāi)發(fā)步步深入之掌握ADC和觸摸屏

ARM開(kāi)發(fā)步步深入之掌握ADC和觸摸屏

作者: 時(shí)間:2016-12-09 來(lái)源:網(wǎng)絡(luò ) 收藏

  實(shí)驗目的:通過(guò)串口顯示輸入的電壓值及采集按下觸摸屏的(x,y)坐標值借此掌握S3C2410的和觸摸屏的使用。

本文引用地址:http://dyxdggzs.com/article/201612/341376.htm

  實(shí)驗環(huán)境及說(shuō)明:恒頤S3C2410開(kāi)發(fā)板H2410。H24X0E擴展板上AIN0~AIN1輸出懸空,通過(guò)外接可變電阻電路采樣電壓值;外接的觸摸屏接口實(shí)現擴展觸摸屏完成相應操作本實(shí)驗基于夏普3.5英寸LQ035Q7DB02。

  實(shí) 驗思路:開(kāi)發(fā)板上電啟動(dòng)后,自動(dòng)將NandFlash開(kāi)始的4K數據復制到SRAM中,然后跳轉到0地址開(kāi)始執行。關(guān)閉看門(mén)狗、初始化SDRAM及 NandFlash控制器、設置MPLL來(lái)改變FCLK、HCLK、PCLK的值,設置堆棧,復制4KB后的16KB數據到SDRAM,之后進(jìn)入main 函數中進(jìn)行及觸摸屏的測試。

  知識掌握:(模數轉換器)和Touch Screen(觸摸屏)。

  ★S3C2410 ADC和TouchScreen概述:S3C2410內置1個(gè)8信道的10bit模數轉換器,該ADC能以500KSPS的采樣速率將外部的模擬信號轉換 為10位的二進(jìn)制數字量。同時(shí)ADC部分能與CPU的觸摸屏控制器協(xié)同工作,完成對觸摸屏絕對地址的測量。ADC和TouchScreen共用一個(gè)A/D 轉換器,ADC可同時(shí)采樣8路模擬輸入信號,使用觸摸屏時(shí),AIN[7]、AIN[5]被用來(lái)測量XP/YP的電平,剩余的六個(gè)引腳可用來(lái)做一般ADC輸 入。2410ADC和觸摸屏功能框圖如下:

  ★ADC和TouchScreen控制器的工作模式:

  ●ADC普通轉換模式(Normal Converson Mode)---普通轉換模式(AUTO_PST=0,XY_PST=0)是用來(lái)進(jìn)行一般的ADC轉換之用的,例如通過(guò)ADC測量電池電壓等等。

  ● 獨立X/Y軸坐標轉換模式(Separate X/Y Position Conversion Mode)---獨立X/Y軸坐標轉換模式其實(shí)包含了X軸模式和Y軸模式2種模式。 首先進(jìn)行X軸的坐標轉換(AUTO_PST=0,XY_PST=1),X軸的轉換資料會(huì )寫(xiě)到ADCDAT0寄存器的XPDAT中,等待轉換完成后,觸摸屏 控制器會(huì )產(chǎn)生相應的中斷。 然后進(jìn)行Y軸的坐標轉換(AUTO_PST=0,XY_PST=2),Y軸的轉換資料會(huì )寫(xiě)到ADCDAT1寄存器的YPDAT中,等待轉換完成后,觸摸屏 控制器會(huì )產(chǎn)生相應的中斷。

  ●自動(dòng)X(jué)/Y軸坐標轉換模式(Auto X/Y Position Conversion Mode)---自動(dòng)X(jué)/Y軸坐標轉換模式(AUTO_PST=1,XY_PST=0)將會(huì )自動(dòng)地進(jìn)行X軸和Y軸的轉換操作,隨后產(chǎn)生相應的中斷。

  ● 中斷等待模式(Wait for InterruptMode)---在系統等待"Pen Down",即觸摸屏按下的時(shí)候,其實(shí)是處于中斷等待模式。一旦被按下,實(shí)時(shí)產(chǎn)生"INT_TC"中斷信號。每次發(fā)生此中斷都,X軸和Y軸坐標轉換資料都 可以從相應的資料寄存器中讀出。

  ●閑置模式(Standby Mode)---在該模式下轉換資料寄存器中的值都被保留為上次轉換時(shí)的資料。

  ★ADC兩種啟動(dòng)方式:以手工啟動(dòng)和讀結果時(shí)就自動(dòng)地啟動(dòng)下一次轉換;以查詢(xún)狀態(tài)位和發(fā)中斷方式獲知轉換是否結束。ADC的操作只涉及3個(gè)寄存器:

  ●ADCCON--- 設置ADCCON寄存器,選擇輸入信號通道,設置A/D轉換器的時(shí)鐘(A/D時(shí)鐘=PCLK/(PRSCVL+1))。A/D時(shí)鐘最大為2.5MHz,且 應小于PCLK的1/5;設置ADCCON寄存器,啟動(dòng)轉換(設置READ_START位則讀轉換數據(讀ADCDAT0寄存器)時(shí)即啟動(dòng)下一次轉換;否 則可通過(guò)設置ENABLE_START位來(lái)啟動(dòng)A/D轉換);ADCCON各位含義(ENABLE_START---置1啟動(dòng)ADC轉換,置0無(wú)操作; RESR_START---置1允許讀操作啟動(dòng)ADC轉換,置0禁止讀操作啟動(dòng)ADC轉換; STDBM---置1將ADC置為閑置狀態(tài)(模式),置0將ADC置為正常操作狀態(tài);SEL_MUX---選擇需要進(jìn)行轉換的ADC信道; PRSCV---ADC轉換時(shí)鐘預分頻參數;PRSCEN---ADC轉換時(shí)鐘使能; ECFLG---ADC轉換完成標志位(只讀)。為1ADC轉換結束,為0ADC轉換進(jìn)行中)。

  ●ADCTSC---設置ADCTSC寄存器,使 用設為普通轉換模式,不使用觸摸屏功能;ADCTSC各位含義(XY_PST---對X/Y軸手動(dòng)測量模式進(jìn)行選擇;AUTO_PST---X/Y軸的自 動(dòng)轉換模式使能位;PULL_UP---XP端的上拉電阻使能位;XP_SEN---設置nXPON輸出狀態(tài);XM_SEN---設置XMON輸出狀 態(tài);YP_SEN---設置nYPON輸出狀態(tài);YM_SEN---設置YMON輸出狀態(tài))。

  ●ADCDAT0---完成ADC轉換后,讀取 ADCDAT0寄存器獲得數值(如果使用查詢(xún)方式,則可不斷讀取ADCCON寄存器的ECFLG位來(lái)確定是否轉換結束;否則可以使用INT_ADC中斷, 發(fā)生INT_ADC中斷時(shí)表示轉換結束);ADCDAT0各位含義(XPDATA---X軸轉換資料寄存器;XY_PST---選擇X/Y軸自動(dòng)轉換模 式;AUTO_PST---X/Y軸自動(dòng)轉換使能位;UPDOWN---選擇中斷等待模式的類(lèi)型。為0按下產(chǎn)生中斷,為1釋放產(chǎn)生中斷)。

  ★觸摸屏操作還涉及到以下兩個(gè)寄存器:

  ●ADCDLY---ADC轉換周期等待定時(shí)器。

  ●ADCDAT1---同ADCDAT0。

  關(guān)鍵代碼解析:

  ★head.S頭文件來(lái)初始化,設置SDRAM,將程序復制到SDRAM,然后跳到SDRAM繼續執行

  .equ MEM_CTL_BASE, 0x48000000

  .text

  .global _start

  _start:

  @中斷向量表處理函數,只給出復位和普通中斷模式的處理函數,其它異常未使用

  b Reset

  ...

  b HandleIRQ

  @0x1c: 快中斷模式的向量地址

  HandleFIQ:

  b HandleFIQ

  Reset: @復位處理

  bl disable_watch_dog @關(guān)門(mén)喂狗

  bl mem_control_setup @設置存儲控制器

  ldr sp, =4096 @設置棧指針,以下C函數調用前需要設好棧

  bl init_clock @設置MPLL,改變FCLK、HCLK、PCLK

  bl init_nand @初始化NandFlash

  @將NandFlash中地址4096開(kāi)始的代碼復制到SDRAM中

  ldr r0, =0x30000000 @目標地址=0x30000000,SDRAM起始地址

  mov r1, #4096 @源地址=4096,連接時(shí)代碼在4096開(kāi)始處

  mov r2, #16*1024 @復制長(cháng)度=16K,對于本實(shí)驗足夠

  bl read_nand @調用C函數read_nand

  bl clean_bss @清除bss段

  msr cpsr_c, #0xd2 @進(jìn)入中斷模式

  ldr sp, =0x31000000 @設置中斷模式棧指針

  msr cpsr_c, #0xdf @進(jìn)入系統模式

  ldr sp, =0x34000000 @設置系統模式棧指針

  ldr lr, =ret_initirq @設置返回地址

  ldr pc, =init_irq @初始化中斷

  ret_initirq:

  msr cpsr_c, #0x5f @設置I-bit=0,開(kāi)IRQ中斷

  ldr lr, =halt_loop @設置返回地址

  ldr pc, =main @調用main函數

  halt_loop:

  b halt_loop

  ★main.c文件實(shí)現實(shí)現串口選擇ADC和TouchScreen操作,主要代碼:

  #include

  #include

  #include 

  int main()

  {

  char c;

  init_uart0(); //波特率115200,8N1(8個(gè)數據位,無(wú)校驗位,1個(gè)停止位)

  while (1)

  {

  printf("rn~~~~~~ Test ADC and Touch Screem ~~~~~~rn");

  printf("[A] Test ADCnr");

  printf("[T] Test Touch Screemnr");

  printf("Enter your selection: ");

  c = getc();

  putc(c);

  switch (c)

  {

  case 'a':

  case 'A':

  {

  Test_Adc();//操作ADC

  break;

  }

  case 't':

  case 'T':

  {

  Test_Ts();//操作TouchScreen

  break;

  ...

  }

  ★adc_ts.c ADC和觸摸屏的測試函數,主要代碼:

  ...

  /*

  * 使用查詢(xún)方式讀取A/D轉換值。

  * 輸入參數ch: 模擬信號通道,取值為0~7

  */

  static int ReadAdc(int ch)

  {

  //選擇模擬通道,使能預分頻功能,設置A/D轉換器的時(shí)鐘 = PCLK/(49+1)

  ADCCON = PRESCALE_EN | PRSCVL(49) | ADC_INPUT(ch);

  //清除位[2],設為普通轉換模式

  ADCTSC &= ~(1<<2);

  //設置位[0]為1,啟動(dòng)A/D轉換

  ADCCON |= ADC_START;

  //當A/D轉換真正開(kāi)始時(shí),位[0]會(huì )自動(dòng)清0

  while (ADCCON & ADC_START);

  //檢測位[15],當它為1時(shí)表示轉換結束

  while (!(ADCCON & ADC_ENDCVT));

  //讀取數據

  return (ADCDAT0 & 0x3ff);

  }

  /*

  * 測試ADC。通過(guò)A/D轉換,測量可變電阻器的電壓值

  */

  void Test_Adc(void)

  {

  int vol0, vol1;

  printf("Measuring the voltage of AIN0 and AIN1, press any key to exitnr");

  while (!awaitkey(0)) // 串口無(wú)輸入,則不斷測試

  {

  vol0 = (ReadAdc(0)*3)/1024; // 計算電壓值

  vol1 = (ReadAdc(1)*3)/1024; // 計算電壓值

  printf("AIN0 = %d AIN1 = %dr", vol0,vol1);

  }

  printf("n");

  }

  static void Isr_Tc(void)

  {

  if (ADCDAT0 & 0x8000) //ADCDAT0[15]為1表示觸摸屏被松開(kāi)

  {

  printf("rnStylus Up!!nr");

  //wait_down_int(); //進(jìn)入"等待中斷模式",等待觸摸屏被按下

  }

  else

  {

  printf("rnStylus Down: ");

  mode_auto_xy(); //進(jìn)入自動(dòng)(連續)X/Y軸坐標轉換模式

  ADCCON |= ADC_START; //設置位[0]為1,啟動(dòng)A/D轉換

  }

  // 清INT_TC中斷

  ...

  }

  static void Isr_Adc(void)

  {

  printf("xdata = %4d, ydata = %4drn",(int)(ADCDAT0 & 0x3ff),(int)(ADCDAT1 & 0x3ff));

  //wait_down_int(); //進(jìn)入"等待中斷模式",等待觸摸屏被松開(kāi)

  //清INT_ADC中斷

  ...

  }

  void AdcTsIntHandle(void)

  {

  if (SUBSRCPND & BIT_SUB_TC)

  Isr_Tc();

  if (SUBSRCPND & BIT_SUB_ADC)

  Isr_Adc();

  }

  /*

  *測試觸摸屏,打印觸點(diǎn)坐標

  */

  void Test_Ts(void)

  {

  isr_handle_array[ISR_ADC_OFT] = AdcTsIntHandle; // 設置ADC中斷服務(wù)程序

  INTMSK &= ~BIT_ADC; //開(kāi)啟ADC總中斷

  INTSUBMSK &= ~BIT_SUB_TC; //開(kāi)啟INT_TC中斷,即觸摸屏被按下或松開(kāi)時(shí)產(chǎn)生中斷

  INTSUBMSK &= ~BIT_SUB_ADC; //開(kāi)啟INT_ADC中斷,即A/D轉換結束時(shí)產(chǎn)生中斷

  //使能預分頻功能,設置A/D轉換器的時(shí)鐘 = PCLK/(49+1)

  ADCCON = PRESCALE_EN | PRSCVL(49);

  /*

  *采樣延時(shí)時(shí)間 = (1/3.6864M)*50000 = 13.56ms

  *即按下觸摸屏后,再過(guò)13.56ms才采樣

  */

  ADCDLY = 50000;

  wait_down_int();/*進(jìn)入“等待中斷模式”,等待觸摸屏被按下*/

  printf("Touch the screem to test, press any key to exit!nr");

  getc();

  // 屏蔽ADC中斷

  ...

  }



關(guān)鍵詞: ARM ADC

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>