第9章 單片機(jī)模數(shù)轉(zhuǎn)換器ADC 1 A/D轉(zhuǎn)換實(shí)驗(yàn)電路 2 使用單片機(jī)內(nèi)部的10位ADC轉(zhuǎn)換器 (1) ADC相關(guān)的特殊功能寄存器 (2) 實(shí)例代碼 1 A/D轉(zhuǎn)換實(shí)驗(yàn)電路 模數(shù)轉(zhuǎn)換就是將電路中連續(xù)變化的模擬電壓信號(hào)轉(zhuǎn)換為單片機(jī)可以識(shí)別的數(shù) 字信號(hào),簡(jiǎn)稱為A/D,實(shí)現(xiàn)模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)的器件稱為模數(shù)轉(zhuǎn)換器, 稱為ADC,ADC有專用的集成電路芯片,現(xiàn)在的新型單片機(jī)內(nèi)部一般也集成有 ADC模塊。
0.png (25.89 KB, 下載次數(shù): 190)
下載附件
2016-3-28 03:16 上傳
(1) ADC相關(guān)的特殊功能寄存器 1、 P1口模擬功能控制寄存器P1ASF,各位定義如表9-1所示,如果要使用相應(yīng) 口的ADC輸入功能,需將P1ASF特殊功能寄存器中的相應(yīng)位置為1,比如:P1ASF |= 0x02; // 開(kāi)啟P1.1口的ADC輸入功能。 表9-1 P1ASF(復(fù)位值為0000 0000B) 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 位名稱 | P17ASF | P16ASF | P15ASF | P14ASF | P13ASF | P12ASF | P11ASF | P10ASF |
2、ADC控制寄存器ADC_CONTR,各位定義如表9-2所示。 表9-2 ADC_CONTR(復(fù)位值為0000 0000B)
%E7%AC%AC9%E7%AB%A0--%E6%A8%A1%E6%95%B0%E8%BD%AC%E6%8D%A2%E5%99%A8adc-1.jpg (17.7 KB, 下載次數(shù): 178)
下載附件
2016-3-28 03:17 上傳
① ADC_POWER:ADC電源控制位。 0:關(guān)閉ADC電源。 1:打開(kāi)ADC電源。 ② SPEED1、SPEED0:ADC轉(zhuǎn)換速度控制位, 如表9-3所示,當(dāng)被采樣信號(hào)變化 頻率較高時(shí)應(yīng)使用高的轉(zhuǎn)換頻率(比如用ADC采樣電路波形實(shí)現(xiàn)簡(jiǎn)易的示波 器),當(dāng)對(duì)功耗限制嚴(yán)格時(shí)應(yīng)使用低的轉(zhuǎn)換頻率。 表9-3 ADC轉(zhuǎn)換速度控制
%E7%AC%AC9%E7%AB%A0--%E6%A8%A1%E6%95%B0%E8%BD%AC%E6%8D%A2%E5%99%A8adc-2.jpg (31.45 KB, 下載次數(shù): 179)
下載附件
2016-3-28 03:17 上傳
③ ADC_FLAG:A/D轉(zhuǎn)換結(jié)束標(biāo)志位。 A/D轉(zhuǎn)換完成后,ADC_FLAG = 1,可由該位申請(qǐng)產(chǎn)生中斷,或者由軟件查詢?cè)摌?biāo)志位判 斷A/D轉(zhuǎn)換是否結(jié)束,此標(biāo)志只能由軟件清零。 ④ ADC_START:A/D轉(zhuǎn)換啟動(dòng)控制位,ADC_START=1,啟動(dòng)轉(zhuǎn)換,轉(zhuǎn)換結(jié)束后為0。 ⑤ CHS2、CHS1、CHS0:模擬輸入通道選擇,如表所示。
%E7%AC%AC9%E7%AB%A0--%E6%A8%A1%E6%95%B0%E8%BD%AC%E6%8D%A2%E5%99%A8adc-3.jpg (41.87 KB, 下載次數(shù): 199)
下載附件
2016-3-28 03:17 上傳
3、ADC轉(zhuǎn)換結(jié)果寄存器 ADC_RES、ADC_RESL ADC_RES[7:0]存放高8位ADC結(jié)果,ADC_RESL[1:0]存放低2位ADC結(jié)果。 ADC轉(zhuǎn)換結(jié)果計(jì)算公式如下(Vin為模擬輸入電壓,Vcc為單片機(jī)實(shí)際供電電壓): Vin = Vcc ×(ADC_RES[7:0],ADC_RESL[1:0])/1023 9.2.2、實(shí)例代碼 9.2.2、實(shí)例代碼 例9.1 IAP15W4K58S4單片機(jī)A/D轉(zhuǎn)換程序,查詢方式,測(cè)量結(jié)果電壓值發(fā)送到計(jì)算機(jī)串口 助手顯示,波特率9600/22.1184MHz,當(dāng)使用配套實(shí)驗(yàn)板時(shí),需要將跳線帽“AD/串口2”插接 到AD處。 #include "UART.H" | // | 包含IAP15W4K58S4寄存器定義文件 | #define VCC 4.970 unsigned int ADC_P11() | // | 存放用萬(wàn)用表實(shí)測(cè)的單片機(jī)供電電壓 | { unsigned int i; | // | 用于軟件延時(shí)程序 | unsigned char status; | // | 用于判斷A/D轉(zhuǎn)換結(jié)束的標(biāo)志 | unsigned int AD_Dat=0; | // | 10位A/D轉(zhuǎn)換值 | unsigned char Tmp; | // | 臨時(shí)變量用于將A/D轉(zhuǎn)換出來(lái)的2個(gè)字節(jié)合成一個(gè)字節(jié) | ADC_CONTR|=0x80; | // | 開(kāi)ADC轉(zhuǎn)換器電源,第一次使用時(shí)要打開(kāi)內(nèi)部模擬電源 | for (i=0;i<10000;i++); | // | 適當(dāng)延時(shí)等待ADC轉(zhuǎn)換供電穩(wěn)定,一般延時(shí)1ms以內(nèi)即可, | P1ASF|=0x02; | // | 選擇P1.1作為ADC轉(zhuǎn)換通道,0x02= 0000 0010 |
ADC_CONTR=0xE1; // 選擇P1.1作為ADC轉(zhuǎn)換通道,最高轉(zhuǎn)換速度,清轉(zhuǎn)換完成標(biāo)志。 for (i=0;i<1000;i++); // 如果是多通道模擬量進(jìn)行A/D轉(zhuǎn)換,則更換A/D轉(zhuǎn)換通道后要延時(shí)200μs ADC_CONTR|=0x08; // 啟動(dòng) A/D 轉(zhuǎn)換,ADC_START=1。 status=0; while(status==0) // 等待A/D轉(zhuǎn)換結(jié)束。 { status=ADC_CONTR&0x10; // 判斷ADC_FLAG是否等于1,0x10=0001 0000B。 } ADC_CONTR&=0xE7; // 將ADC_FLAG清0,0xE7=1110 0111B,ADC_FLAG=0,ADC_START=0。 AD_Dat = ADC_RES; // 默認(rèn)高字節(jié)高8位。 AD_Dat <<= 2; Tmp = ADC_RESL; // 默認(rèn)低字節(jié)低2位。 Tmp &= 0x03; // 屏蔽無(wú)關(guān)位 AD_Dat |= Tmp; // 高低字節(jié)拼接成一個(gè)10位數(shù)。 return AD_Dat; } void main(void) { float Vin; // 存放計(jì)算出來(lái)的外部輸入電壓 unsigned int ADvalue; // 存放A/D轉(zhuǎn)換返回的結(jié)果 UART_init(); // 串口初始化9600/22.1184MHz printf("串口初始化完畢"); while(1) { ADvalue=ADC_P11(); // 采樣P1.1口模擬輸入電壓 Vin=VCC*ADvalue/1023; // 注意是1023才正確 printf("%.3f ",Vin); delay500ms(); } // 若不用串口顯示,此行可設(shè)置斷點(diǎn)仿真觀察結(jié)果 }
|