【世界獨家】嵌入式:AD接口設計

2023-01-06 11:15:36 來源:51CTO博客

S3C2410A的A/D轉換器

S3C2410A的A/D轉換器包含一個8通道的模擬輸入轉換器,可以將模擬輸入信號(帶有采樣保持器)轉換成10位數字編碼。在AD轉換時鐘為2.5MHz時,其最大轉換率為500KSPS,輸入電壓范圍是0~3.3V。 A/D轉換器的AIN5、AIN7還可以與控制腳nYPON(正的Y軸開關控制)、YMON (負的Y軸開關控制) 、nXPON (正的X軸開關控制)和XMON (負的X軸開關控制)配合,實現觸摸屏輸入功能;

四線電阻式觸摸屏接口基礎知識

四線電阻式觸摸屏組成及工作原理

下圖為四線電阻式觸摸屏截面圖及在X電極對上施加確定的電壓后,X方向導電層不同位置電壓示意圖。


【資料圖】

下圖給出了上導電層X+、X-電極、下導電層Y+、Y-電極的位置。下圖(a)和下圖(b)分別表示,確定觸點位置時,要先在X+、X-電極對施加電壓,Y+、Y-電極對不施加電壓;然后在Y+、Y-電極對施加電壓,X+、X-電極對不施加電壓。

四線電阻式觸摸屏接口主要操作

接口主要操作包括:有觸摸動作時首先控制X+、X-電極對施加電壓,Y+電極與A/D轉換器連接、Y-電極對地高阻,讀A/D轉換值得到觸點的X坐標;然后控制Y+、Y-電極對施加電壓,X+電極與A/D轉換器連接,X-電極對地高阻,讀A/D轉換值值得到觸點的Y坐標;另外還有檢測觸摸動作,產生中斷請求等操作。

與A/D轉換相關的寄存器

ADC控制寄存器(ADCCON)ADC觸摸屏控制寄存器(ADCTSC)ADC啟動延時寄存器(ADCDLY)ADC轉換數據寄存器(ADCDATn)

為了正確使用A/D轉換器,需要設置A/D轉換器的時鐘,還有A/D轉換器的工作模式設置和輸入通道選擇,這都是通過ADCCON寄存器來設置的。然后置位ADCCON寄存器的ENABLE_START位來控制啟動A/D轉換,讀ADCCON寄存器的ECFLG位來判斷A/D轉換是否已經結束。當一次A/D轉換結束后,通過讀ADCDAT0寄存器來取得A/D轉換結果,寄存器的低10位數據有效;

A/D接口編程實例

舉例:使用串口延長線把 S3C2410的串口與PC機的COM1連接,設置串口波持率為115200, 8位數據位,無奇偶校驗位,1位停止位。 調整W1、W2改變測量的電壓,觀察PC機上的“超級終端”主窗口顯示電壓值是否正確。

程序清單
#include  "config.h"http:// 定義用于保存ADC結果的變量uint32  adc0, adc1;// 定義顯示緩沖區char  disp_buf[50];  // 定義ADC轉換時鐘 (2MHz) #define  ADC_FREQ  (2*1000000)
/*************************************************************************************** Function name: ReadAdc** Descriptions: ADC轉換函數          ** Input: ch 轉換通道(0--7)** Output: 返回轉換結果*************************************************************************************/uint32  ReadAdc(uint32 ch){       int i;    ch = ch & 0x07;     // 參數過濾         rADCCON = (1<<14)|((PCLK/ADC_FREQ - 1)<<6)|(ch<<3)|(0<<2)|(0<<1)|(0<<0);    // PRSCEN=1,使能分頻器    // PRSCVL=(PCLK/ADC_FREQ - 1),即ADC轉換時鐘為ADC_FREQ    // SEL_MUX=ch,設置ADC通道       // STDBM=0,標準轉換模式    // READ_START=0,禁止讀(操作后)啟動ADC    // ENABLE_START=0,不啟動ADC         rADCTSC = rADCTSC & (~0x03);   // 普通ADC模式(非觸摸屏)    for(i=0; i<100; i++);    rADCCON = rADCCON | (1<<0);       // 啟動ADC        while(rADCCON & 0x01);          // 等待ADC啟動            while(!(rADCCON & 0x8000));     // 等待ADC完成    return (rADCDAT0 & 0x3ff);      // 返回轉換結果}
int  main(void){        int   vin0, vin1;    UART_Select(0);         // 選擇UART0    UART_Init();            // 初始化UART0     while(1)    {           // 進行A/D轉換          adc0 = ReadAdc(0);        adc1 = ReadAdc(1);              // 通過串口輸出顯示        vin0 = (adc0*3300) / 1024;  // 讀算實際電壓值 (mV)        vin1 = (adc1*3300) / 1024;        sprintf(disp_buf, "AIN0 is %d mV,  AIN1 is %d mV \n", vin0, vin1);        UART_SendStr(disp_buf);             // 延時        DelayNS(20);    }               return(0);}

運行結果:

參考文獻:

孟祥蓮.嵌入式系統原理及應用教程(第2版)[M].北京:清華大學出版社,2017.

楊宗德. 嵌入式ARM系統原理與實例開發 [M].北京:北京大學出版社,2007.

S3C2410 Datasheet

標簽: 開關控制 控制寄存器 模擬輸入

上一篇:每日熱訊!Python網絡編程之TCP服務端程序開發
下一篇:每日時訊!EasyX繪制多邊形