嵌入式系統(tǒng)開發(fā)基礎(chǔ)教程-基于STM32F103系列課件第11章-模擬數(shù)字轉(zhuǎn)換ADC_第1頁
嵌入式系統(tǒng)開發(fā)基礎(chǔ)教程-基于STM32F103系列課件第11章-模擬數(shù)字轉(zhuǎn)換ADC_第2頁
嵌入式系統(tǒng)開發(fā)基礎(chǔ)教程-基于STM32F103系列課件第11章-模擬數(shù)字轉(zhuǎn)換ADC_第3頁
嵌入式系統(tǒng)開發(fā)基礎(chǔ)教程-基于STM32F103系列課件第11章-模擬數(shù)字轉(zhuǎn)換ADC_第4頁
嵌入式系統(tǒng)開發(fā)基礎(chǔ)教程-基于STM32F103系列課件第11章-模擬數(shù)字轉(zhuǎn)換ADC_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

模擬數(shù)字轉(zhuǎn)換ADC微信公眾號:講編程的高老師11模擬數(shù)字轉(zhuǎn)換ADC微信公眾號:講編程的高老師111本章目標(biāo)了解ADC的概念掌握STM32F103xx中ADC的結(jié)構(gòu)和功能掌握ADC的配置方法掌握使用庫函數(shù)編程進(jìn)行單通道電壓信號采集的方法本章目標(biāo)了解ADC的概念目錄/Contents11.1ADC原理概述11.2ADC庫函數(shù)11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓采集11.4小結(jié)目錄/Contents11.1ADC原理概述11.2ADC庫目錄/Contents11.1ADC原理概述一、ADC概述二、ADC的主要模塊及其工作模式目錄/Contents11.1ADC原理概述一、ADC概述二ADC概述采用各量級同時并行比較,各位輸出碼也是同時并行產(chǎn)生,所以轉(zhuǎn)換速度快。并聯(lián)比較型ADC的缺點(diǎn)是成本高、功耗大。并聯(lián)比較型ADC它逐個產(chǎn)生比較電壓,逐次與輸入電壓分別比較,以逐漸逼近的方式進(jìn)行模數(shù)轉(zhuǎn)換,比并聯(lián)比較型ADC的轉(zhuǎn)換速度慢。STM32F10xxx系列產(chǎn)品片內(nèi)集成ADC主要是逐次逼近型ADC。逐次逼近型ADC它先對輸入采樣電壓和基準(zhǔn)電壓進(jìn)行兩次積分,獲得與采樣電壓平均值成正比的時間間隔,同時用計數(shù)器對標(biāo)準(zhǔn)時鐘脈沖計數(shù)。它的優(yōu)點(diǎn)是抗干擾能力強(qiáng),穩(wěn)定性好;而缺點(diǎn)是轉(zhuǎn)換速度低。雙積分型ADCADC能夠分辨量化的最小信號的能力,分辨率用二進(jìn)制位數(shù)表示。例如一個10位的ADC,其所能分辨的最小量化電平為參考電平(滿量程)的

。也就是說分辨率越高,就能把滿量程里的電平分出更多的份數(shù)(10bit是把滿量程分成了210份),得到的轉(zhuǎn)換結(jié)果就越精確,得到的數(shù)字信號再用DAC轉(zhuǎn)換回去就越接近原輸入的模擬值。ADC的分辨率

ADC概述采用各量級同時并行比較,各位輸出碼也是同時并行產(chǎn)生ADC的架構(gòu)ADC所有的器件都是圍繞中間的模擬至數(shù)字轉(zhuǎn)換器部分(ADC)展開的。左端為VREF+、VREF-等ADC參考電壓,ADCx_IN0~ADCx_IN15為ADC的輸入信號通道,在STM32芯片上表現(xiàn)為某些GPIO引腳。輸入信號經(jīng)過這些通道被送到ADC部件,ADC部件需要受到觸發(fā)信號才開始進(jìn)行轉(zhuǎn)換,如EXTI外部觸發(fā)、定時器觸發(fā),也可以使用軟件觸發(fā)。ADC部件接收到觸發(fā)信號之后,在ADCCLK時鐘的驅(qū)動下對輸入通道的信號進(jìn)行采樣,并進(jìn)行模數(shù)轉(zhuǎn)換,其中ADCCLK是來自ADC預(yù)分頻器的。ADC部件轉(zhuǎn)換后的數(shù)值被保存到一個16位的規(guī)則通道數(shù)據(jù)寄存器(或注入通道數(shù)據(jù)寄存器)之中,我們可以通過CPU指令或DMA把它讀取到內(nèi)存(編碼過程中就是把它賦給設(shè)置的某個變量)中。模數(shù)轉(zhuǎn)換之后,可以觸發(fā)DMA請求,或者觸發(fā)ADC的轉(zhuǎn)換結(jié)束事件。如果配置了模擬看門狗,并且采集得到的電壓大于閾值,會觸發(fā)看門狗中斷。通過編寫控制程序可以讓嵌入式系統(tǒng)完成很多靈活的任務(wù)。ADC的架構(gòu)ADC所有的器件都是圍繞中間的模擬至數(shù)字轉(zhuǎn)換器部ADC電源名稱信號類型說明VREF+輸入,模擬參考正極ADC參考電壓正極,2.4V≤VREF+

≤VDDAVDDA輸入,模擬電源等效于VDD的模擬電源且:2.4V≤VDDA≤VDD(3.6V)VREF-

輸入,模擬參考負(fù)極ADC參考電壓負(fù)極,VREF-=VSSAVSSA輸入,模擬電源地等效于VSS的模擬電源地ADC的參考電壓是通過VREF+和VREF-提供的。引腳數(shù)100以上的型號,才有ADC參考電壓引腳,其余型號的ADC參考電壓使用芯片內(nèi)部參考電壓,沒有引到片外。參考電壓是AD轉(zhuǎn)換的比較基準(zhǔn),為了保證AD轉(zhuǎn)換結(jié)果的準(zhǔn)確性,對參考電壓的準(zhǔn)確性和穩(wěn)定性要求都比較高。表中列出了ADC電源相關(guān)的各引腳含義及使用說明。ADC電源名稱信號類型說明VREF+輸入,模擬參考正極ADCADC通道和轉(zhuǎn)換順序ADC1ADC2ADC3通道0PA0PA0PA0通道1PA1PA1PA1通道2PA2PA2PA2通道3PA3PA3PA3通道4PA4PA4PF6通道5PA5PA5PF7通道6PA6PA6PF8通道7PA7PA7PF9通道8PB0PB0PF10通道9PB1PB1通道10PC0PC0PC0通道11PC1PC1PC1通道12PC2PC2PC2通道13PC3PC3PC3通道14PC4PC4通道15PC5PC5通道16內(nèi)部溫度傳感器通道17內(nèi)部參照電壓

ADC有18個通道,可測量16個外部和2個內(nèi)部信號源。框圖中的ADCx_IN0、ADCx_IN1、……、ADCx_IN15就是ADC的16個外部通道物理引腳16個外部通道又分為規(guī)則通道和注入通道,其中規(guī)則通道最多16路,注入通道最多4路。規(guī)則通道組可類比于順序運(yùn)行的程序。規(guī)則通道和它的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇,規(guī)則組轉(zhuǎn)換的總數(shù)應(yīng)寫入ADC_SQR1寄存器的L[3:0]中。注入通道組可類比于中斷服務(wù)函數(shù),在規(guī)則通道轉(zhuǎn)換的過程中插入注入通道組的轉(zhuǎn)換,注入通道組轉(zhuǎn)換完畢后再進(jìn)行剩余規(guī)則通道的轉(zhuǎn)換。注入組和它的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里轉(zhuǎn)換的總數(shù)應(yīng)寫入ADC_JSQR寄存器的L[1:0]中。STM32F1的ADC各通道可以單次轉(zhuǎn)換模式執(zhí)行,連續(xù)轉(zhuǎn)換模式執(zhí)行,或者掃描轉(zhuǎn)換模式執(zhí)行。ADC通道和轉(zhuǎn)換順序ADC1ADC2ADC3通道0PA0PA串行通信的硬件連接ADC只執(zhí)行一次轉(zhuǎn)換。該模式既可通過設(shè)置ADC_CR2寄存器的ADON位啟動,也可通過外部觸發(fā)啟動。當(dāng)一個規(guī)則通道轉(zhuǎn)換完成后:轉(zhuǎn)換數(shù)據(jù)被儲存在16位ADC_DR寄存器中;EOC(轉(zhuǎn)換結(jié)束)標(biāo)志被置位;如果設(shè)置了EOCIE,則產(chǎn)生中斷。當(dāng)一個注入通道轉(zhuǎn)換完成后:轉(zhuǎn)換數(shù)據(jù)被儲存在16位的ADC_DRJ1寄存器中;JEOC(注入轉(zhuǎn)換結(jié)束)標(biāo)志被置位;如果設(shè)置了JEOCIE位,則產(chǎn)生中斷。單次轉(zhuǎn)換模式在連續(xù)轉(zhuǎn)換模式中,當(dāng)前一通道轉(zhuǎn)換完成,馬上就啟動下一通道的轉(zhuǎn)換。此模式可通過外部觸發(fā)啟動或通過設(shè)置ADC_CR2寄存器上的ADON位啟動。當(dāng)一個規(guī)則通道轉(zhuǎn)換完成后,轉(zhuǎn)換數(shù)據(jù)儲存在16位的ADC_DR寄存器中;EOC(轉(zhuǎn)換結(jié)束)標(biāo)志被設(shè)置;如果設(shè)置了EOCIE,則產(chǎn)生中斷。當(dāng)一個注入通道轉(zhuǎn)換完成后:轉(zhuǎn)換數(shù)據(jù)被儲存在16位的ADC_DRJ1寄存器中;JEOC(注入轉(zhuǎn)換結(jié)束)標(biāo)志被設(shè)置;如果設(shè)置了JEOCIE位,則產(chǎn)生中斷。連續(xù)轉(zhuǎn)換模式用來掃描一組模擬通道。掃描模式可通過設(shè)置ADC_CR1寄存器的SCAN位來選擇。一旦這個位被設(shè)置,ADC掃描所有被ADC_SQRX寄存器(對規(guī)則通道)或ADC_JSQR(對注入通道)選中的所有通道。在每個組的每個通道上執(zhí)行單次轉(zhuǎn)換。在每個轉(zhuǎn)換結(jié)束時,同一組的下一個通道被自動轉(zhuǎn)換。如果設(shè)置了CONT位,轉(zhuǎn)換不會在選擇組的最后一個通道上停止,而是再次從選擇組的第一個通道繼續(xù)轉(zhuǎn)換。如果設(shè)置了DMA位,在每次EOC后,DMA控制器把規(guī)則組通道的轉(zhuǎn)換數(shù)據(jù)傳輸?shù)絊RAM中。而注入通道轉(zhuǎn)換的數(shù)據(jù)總是存儲在ADC_JDRx寄存器中。掃描轉(zhuǎn)換模式串行通信的硬件連接ADC只執(zhí)行一次轉(zhuǎn)換。該模式既可通過設(shè)置A轉(zhuǎn)換時間ADC輸入時鐘ADC_CLK由PCLK2(APB2時鐘)經(jīng)過分頻產(chǎn)生。不要讓ADC時鐘超過14MHz,否則可能導(dǎo)致轉(zhuǎn)換結(jié)果不準(zhǔn)確。ADC使用若干個ADC_CLK周期對輸入電壓進(jìn)行采樣,采樣周期數(shù)目可以通過ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位設(shè)置。每個通道可以分別用不同的時間采樣??傓D(zhuǎn)換時間的計算:TCONV=采樣時間+12.5個周期例如:當(dāng)ADC_CLK=14MHz,采樣時間為1.5周期,則TCONV=1.5+12.5=14周期=1μs轉(zhuǎn)換時間ADC輸入時鐘ADC_CLK由PCLK2(APB2時目錄/Contents11.1ADC原理概述11.2ADC庫函數(shù)11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓采集11.4小結(jié)目錄/Contents11.1ADC原理概述11.2ADC庫目錄/Contents11.2ADC庫函數(shù)一、ADC常用庫函數(shù)二、利用庫函數(shù)設(shè)置和使用ADC的一般步驟目錄/Contents11.2ADC庫函數(shù)一、ADC常用庫函串行通信的硬件連接voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);作用:配置ADC模式、掃描模式、單次連續(xù)模式、外部觸發(fā)方式、對齊方式、規(guī)則序列長度。初始化函數(shù)voidADC_Cmd(ADC_TypeDef*ADCx,FunctionalStateNewState);作用:配置ADC使能。使能函數(shù)voidADC_SoftwareStartConvCmd(ADC_TypeDef*ADCx,FunctionalStateNewState);作用:ADC使能軟件轉(zhuǎn)換(在ADC_Init函數(shù)中,外部觸發(fā)方式選擇none)。軟件轉(zhuǎn)換函數(shù)voidADC_RegularChannelConfig(ADC_TypeDef*ADCx,uint8_tADC_Channel,uint8_tRank,uint8_tADC_SampleTime);作用:配置某個ADC控制器的某個通道以某種采樣率置于規(guī)則組的某一位(對應(yīng)函數(shù)的四個參數(shù):ADC控制器名、ADC通道名、規(guī)則組的第n個、采樣率)。規(guī)則通道配置函數(shù)uint16_tADC_GetConversionValue(ADC_TypeDef*ADCx);作用:獲得某個ADC控制器的軟件轉(zhuǎn)換結(jié)果。獲取轉(zhuǎn)換結(jié)果函數(shù)串行通信的硬件連接voidADC_Init(ADC_Typ利用庫函數(shù)設(shè)置和使用ADC的一般步驟STM32F103xx的ADC通道1在PA1上,所以,先要使能PORTA的時鐘,然后設(shè)置PA1為模擬輸入。使能GPIOA和ADC時鐘用RCC_APB2PeriphClockCmd函數(shù),設(shè)置PA1的輸入方式,使用GPIO_Init函數(shù)即可。第一步:開啟PA口和ADC1時鐘,設(shè)置PA1為模擬輸入1RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//使能ADC1,GPIOA時鐘1GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//指定引腳2GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入3GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA利用庫函數(shù)設(shè)置和使用ADC的一般步驟STM32F103xx的利用庫函數(shù)設(shè)置和使用ADC的一般步驟設(shè)置單次轉(zhuǎn)換模式、觸發(fā)方式選擇、數(shù)據(jù)對齊方式等都在這一步實現(xiàn)。這些在庫函數(shù)中是通過函數(shù)ADC_Init實現(xiàn)的,其定義為:voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);從函數(shù)定義可以看出,第一個參數(shù)是指定ADC號。第二個參數(shù)是通過設(shè)置結(jié)構(gòu)體成員變量的值來設(shè)定參數(shù)。第二步:初始化ADC1參數(shù),設(shè)置ADC1的工作模式以及規(guī)則序列的相關(guān)信息1 ADC_InitTypeDefADC_InitStructure;//ADC初始化結(jié)構(gòu)體變量2 ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC1和ADC2工作在獨(dú)立模式3 ADC_InitStructure.ADC_ScanConvMode= DISABLE;//單通道4 ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//ADC轉(zhuǎn)換工作在連續(xù)模式5 ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//由軟件控制轉(zhuǎn)換,不使用外部觸發(fā)6 ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//轉(zhuǎn)換數(shù)據(jù)右對齊7 ADC_InitStructure.ADC_NbrOfChannel=1;//轉(zhuǎn)換通道數(shù)為18 ADC_Init(ADC1,&ADC_InitStructure);//初始化ADC利用庫函數(shù)設(shè)置和使用ADC的一般步驟設(shè)置單次轉(zhuǎn)換模式、觸發(fā)方利用庫函數(shù)設(shè)置和使用ADC的一般步驟分頻因子要確保ADC1的時鐘(ADCCLK)不要超過14Mhz。這里設(shè)置分頻因子為8,時鐘為72/8=9MHz第三步:設(shè)置ADC1分頻因子,確定工作時鐘1RCC_ADCCLKConfig(RCC_PCLK2_Div8);//配置ADC時鐘為CLK2的8分頻,72/8=9MHz第四步:設(shè)置ADC轉(zhuǎn)換通道順序及采樣時間1ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);//ADC1選擇通道1,順序為1,采樣時間239.5個周期第五步:配置使能ADC轉(zhuǎn)換完成中斷(如果需要ADC中斷處理才執(zhí)行這個步驟)1ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//轉(zhuǎn)換結(jié)束后產(chǎn)生中斷利用庫函數(shù)設(shè)置和使用ADC的一般步驟分頻因子要確保ADC1的利用庫函數(shù)設(shè)置和使用ADC的一般步驟如果沒有經(jīng)過校準(zhǔn),AD轉(zhuǎn)換結(jié)果是不準(zhǔn)確的。在校準(zhǔn)期間,在每個電容器上都會計算出一個誤差修正碼(數(shù)字值),這個碼用于消除在隨后的轉(zhuǎn)換中每個電容器上產(chǎn)生的誤差。校準(zhǔn)可大幅減小因內(nèi)部電容器組的變化而造成的準(zhǔn)精度誤差。建議在每次上電后都進(jìn)行一次自校準(zhǔn)。1ADC_Cmd(ADC1,ENABLE);//開啟ADC1第七步:ADC校準(zhǔn)1ADC_ResetCalibration(ADC1);//初始化(復(fù)位)ADC1校準(zhǔn)寄存器2while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)初始化完成3ADC_StartCalibration(ADC1);//開始ADC1校準(zhǔn)4while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)完成第六步:使能ADC利用庫函數(shù)設(shè)置和使用ADC的一般步驟如果沒有經(jīng)過校準(zhǔn),AD轉(zhuǎn)利用庫函數(shù)設(shè)置和使用ADC的一般步驟用軟件啟動一次轉(zhuǎn)換并且讀取轉(zhuǎn)換結(jié)果的方法如下:第八步:ADC轉(zhuǎn)換結(jié)果的讀取1ADC_SoftwareStartConvCmd(ADC1,ENABLE);//軟件啟動ADC1的轉(zhuǎn)換 2while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待轉(zhuǎn)換結(jié)束3returnADC_GetConversionValue(ADC1); //返回最近一次轉(zhuǎn)換結(jié)果利用庫函數(shù)設(shè)置和使用ADC的一般步驟用軟件啟動一次轉(zhuǎn)換并且讀目錄/Contents11.1ADC原理概述11.2ADC庫函數(shù)11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓采集11.4小結(jié)目錄/Contents11.1ADC原理概述11.2ADC庫目錄/Contents11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓采集一、目標(biāo)二、電路設(shè)計三、程序代碼四、仿真效果目錄/Contents11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓案例目標(biāo)實現(xiàn):使用STM32F103R6采集可變電阻上的電壓信號,并通過計算,把當(dāng)前ADC轉(zhuǎn)換值和電壓值顯示在LCD1602液晶顯示屏上。并對照電壓表的讀數(shù),驗證ADC的準(zhǔn)確性。案例目標(biāo)實現(xiàn):使用STM32F103R6采集可變電阻上的電壓仿真電路LCD1是LM016L元件,其功能與常見的LCD1602液晶顯示屏相同。STM32F103xx單片機(jī)通過ADC1的通道1(PA1引腳)采集電壓值。仿真電路LCD1是LM016L元件,其功能與常見的LCD16代碼實現(xiàn)代碼實現(xiàn)adc.h//Filename:adc.h#include"vartypes.h"

#ifndef__ADC_H#define__ADC_H

voidADC1_GPIO_Config(void);voidADC_Config(void);uint16_tGet_Adc(void);uint16_tGet_Adc_Average(Int08Utimes);

#endif

adc.h//Filename:adc.hadc.c//1 //Filename:adc.c2 #include"includes.h"3 4 voidADC1_GPIO_Config(void)//ADC引腳初始化配置5 {6 …//略(詳見書中正文)11 }12 13 voidADC_Config(void)//adc初始化配置14 { 15 ADC_InitTypeDefADC_InitStructure;//ADC初始化結(jié)構(gòu)體變量16 …略(詳見書中正文)26 ADC_Cmd(ADC1,ENABLE);//開啟ADC127 28 /*程序運(yùn)行于Protues時,校準(zhǔn)會導(dǎo)致無限等待,不要校準(zhǔn)。運(yùn)行于實際硬件時,應(yīng)加以校準(zhǔn)29 ADC_ResetCalibration(ADC1);//初始化(復(fù)位)ADC1校準(zhǔn)寄存器30 while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)初始化完成31 ADC_StartCalibration(ADC1);//開始ADC1校準(zhǔn)32 while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)完成33 */34 }35 36 Int16UGet_Adc(void)//獲得ADC轉(zhuǎn)換值37 {38 ADC_SoftwareStartConvCmd(ADC1,ENABLE);//軟件啟動ADC1的轉(zhuǎn)換39 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待轉(zhuǎn)換結(jié)束40 returnADC_GetConversionValue(ADC1);//返回最近一次轉(zhuǎn)換結(jié)果41 }42 43 Int16UGet_Adc_Average(Int08Utimes)//獲得指定通道多次AD轉(zhuǎn)換結(jié)果的平均值44 {45 Int32Utemp_val=0;46 Int08Ui;47 for(i=0;i<times;i++) 48 temp_val+=Get_Adc(ch);//累加49 50 returntemp_val/times;//返回平均值51 } ADC1_GPIO_Config(void)//ADC引腳初始化配置ADC_Config(void)//adc初始化配置程序運(yùn)行于Protues時,校準(zhǔn)會導(dǎo)致無限等待,不要校準(zhǔn)。運(yùn)行于實際硬件時,應(yīng)加以校準(zhǔn)Get_Adc(void)//獲得ADC轉(zhuǎn)換值Get_Adc_Average(Int08Utimes)//獲得指定通道多次AD轉(zhuǎn)換結(jié)果的平均值adc.c//1 //Filename:adc.cADC1main.c1 //Filename:main.c2 #include"includes.h" 4 intmain(void)5 {…//略(詳見書中正文)15 LCD1602_ShowStr(1,0,"ADC_Value=0000",14);//從第“1”+1格開始,顯示在第“0”+1行,長度是1416 LCD1602_ShowStr(1,1,"Voltage=0.00V",13);//從第“1”+1格開始,顯示在第“1”+1行,長度是13 18 while(1)19 {adc_value=Get_Adc_Average(10);//10次轉(zhuǎn)換的平均值21 adc_thousands=adc_value/1000;//獲得ADC轉(zhuǎn)換值的千位22 temp=adc_value%1000;//刪除千位及以上的位23 adc_hundreds=temp/100;//獲得ADC轉(zhuǎn)換值的百位24 temp=adc_value%100;//刪除百位及以上的位25 adc_tens=temp/10;//獲得ADC轉(zhuǎn)換值的十位26 adc_ones=adc_value%10;//獲得ADC轉(zhuǎn)換值的個位27 LCD_ShowNum(11,0,adc_thousands);//第“11”+1格,第“0”+1行,顯示ADC轉(zhuǎn)換值的千位28 LCD_ShowNum(12,0,adc_hundreds);//第13格,第1行,顯示ADC轉(zhuǎn)換值的百位29 LCD_ShowNum(13,0,adc_tens);//第14格,第1行,顯示ADC轉(zhuǎn)換值的十位30 LCD_ShowNum(14,0,adc_ones);//第15格,第1行,顯示ADC轉(zhuǎn)換值的個位

32 voltage=(float)adc_value*5.0/4095;//注意:在實際硬件電路中,Vref+不得超過3.3V,“5.0”應(yīng)改為Vref+的實際值33 temp=voltage*1000;34 thousandths=temp%10;//獲得電壓值的千分位35 if(thousandths>=5)36 voltage=voltage+0.01;//百分位四舍五入37 ones_place=voltage/1;//獲得電壓值的個位38 temp=voltage*10;39 tenths=temp%10;//獲得電壓值的十分位40 temp=voltage*100;41 hundredths=temp%10;//獲得電壓值的百分位42 LCD_ShowNum(9,1,ones_place);//第10格,第2行,顯示電壓值個位43 LCD_ShowNum(11,1,tenths);//第12格,第2行,顯示電壓值十位44 LCD_ShowNum(12,1,hundredths);//第13格,第2行,顯示電壓值千位} }在main函數(shù)中調(diào)用usart初始化函數(shù),配置波特率為9600bps。在while循環(huán)中,用USART_GetFlagStatus函數(shù)查詢USART1是否接收到數(shù)據(jù),如果接收到數(shù)據(jù),調(diào)用USART_ReceiveData數(shù)據(jù)把數(shù)據(jù)傳到Receive_byte變量。接收到的數(shù)據(jù)傳送完成之后,把讀數(shù)據(jù)寄存器非空標(biāo)志清除。調(diào)用了USART_SendData函數(shù)向外發(fā)送一個字符(Receive_byte變量中的內(nèi)容),把接收到的數(shù)據(jù)重新發(fā)送出去。執(zhí)行發(fā)送后,等待發(fā)送完成標(biāo)志。最后把剛接收到的數(shù)據(jù)轉(zhuǎn)換為顯示碼,從PB端口輸出。main.c1 //Filename:main.c在mai仿真運(yùn)行效果AD轉(zhuǎn)換值顯示于液晶屏的第一行,換算后的電壓值顯示在液晶屏的第二行。可以多次修改RV2的電位百分比,獲得不同的電壓值。仿真運(yùn)行效果AD轉(zhuǎn)換值顯示于液晶屏的第一行,換算后的電壓值顯目錄/Contents11.1ADC原理概述11.2ADC庫函數(shù)11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓采集11.4小結(jié)目錄/Contents11.1ADC原理概述11.2ADC庫本章小結(jié)本章主要內(nèi)容介紹了ADC的結(jié)構(gòu)、庫函數(shù)、配置和讀取的方法。給出一個電壓采集和顯示的實際案例。注意:在STM32F103xx硬件平臺和Proteus8.6SP2仿真平臺上的對比測試,可發(fā)現(xiàn)仿真平臺中STM32F103xx的ADC功能目前還存在一定的局限性,表現(xiàn)在ADC校準(zhǔn)操作時會導(dǎo)致無限等待。因此,為仿真目的而編寫的工程不要進(jìn)行校準(zhǔn)。當(dāng)工程運(yùn)用于實際硬件時,應(yīng)加以校準(zhǔn)。本章小結(jié)本章主要內(nèi)容介紹了ADC的結(jié)構(gòu)、庫函數(shù)、配置和讀取的謝謝觀賞微信公眾號:講編程的高老師謝謝觀賞微信公眾號:講編程的高老師30模擬數(shù)字轉(zhuǎn)換ADC微信公眾號:講編程的高老師11模擬數(shù)字轉(zhuǎn)換ADC微信公眾號:講編程的高老師1131本章目標(biāo)了解ADC的概念掌握STM32F103xx中ADC的結(jié)構(gòu)和功能掌握ADC的配置方法掌握使用庫函數(shù)編程進(jìn)行單通道電壓信號采集的方法本章目標(biāo)了解ADC的概念目錄/Contents11.1ADC原理概述11.2ADC庫函數(shù)11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓采集11.4小結(jié)目錄/Contents11.1ADC原理概述11.2ADC庫目錄/Contents11.1ADC原理概述一、ADC概述二、ADC的主要模塊及其工作模式目錄/Contents11.1ADC原理概述一、ADC概述二ADC概述采用各量級同時并行比較,各位輸出碼也是同時并行產(chǎn)生,所以轉(zhuǎn)換速度快。并聯(lián)比較型ADC的缺點(diǎn)是成本高、功耗大。并聯(lián)比較型ADC它逐個產(chǎn)生比較電壓,逐次與輸入電壓分別比較,以逐漸逼近的方式進(jìn)行模數(shù)轉(zhuǎn)換,比并聯(lián)比較型ADC的轉(zhuǎn)換速度慢。STM32F10xxx系列產(chǎn)品片內(nèi)集成ADC主要是逐次逼近型ADC。逐次逼近型ADC它先對輸入采樣電壓和基準(zhǔn)電壓進(jìn)行兩次積分,獲得與采樣電壓平均值成正比的時間間隔,同時用計數(shù)器對標(biāo)準(zhǔn)時鐘脈沖計數(shù)。它的優(yōu)點(diǎn)是抗干擾能力強(qiáng),穩(wěn)定性好;而缺點(diǎn)是轉(zhuǎn)換速度低。雙積分型ADCADC能夠分辨量化的最小信號的能力,分辨率用二進(jìn)制位數(shù)表示。例如一個10位的ADC,其所能分辨的最小量化電平為參考電平(滿量程)的

。也就是說分辨率越高,就能把滿量程里的電平分出更多的份數(shù)(10bit是把滿量程分成了210份),得到的轉(zhuǎn)換結(jié)果就越精確,得到的數(shù)字信號再用DAC轉(zhuǎn)換回去就越接近原輸入的模擬值。ADC的分辨率

ADC概述采用各量級同時并行比較,各位輸出碼也是同時并行產(chǎn)生ADC的架構(gòu)ADC所有的器件都是圍繞中間的模擬至數(shù)字轉(zhuǎn)換器部分(ADC)展開的。左端為VREF+、VREF-等ADC參考電壓,ADCx_IN0~ADCx_IN15為ADC的輸入信號通道,在STM32芯片上表現(xiàn)為某些GPIO引腳。輸入信號經(jīng)過這些通道被送到ADC部件,ADC部件需要受到觸發(fā)信號才開始進(jìn)行轉(zhuǎn)換,如EXTI外部觸發(fā)、定時器觸發(fā),也可以使用軟件觸發(fā)。ADC部件接收到觸發(fā)信號之后,在ADCCLK時鐘的驅(qū)動下對輸入通道的信號進(jìn)行采樣,并進(jìn)行模數(shù)轉(zhuǎn)換,其中ADCCLK是來自ADC預(yù)分頻器的。ADC部件轉(zhuǎn)換后的數(shù)值被保存到一個16位的規(guī)則通道數(shù)據(jù)寄存器(或注入通道數(shù)據(jù)寄存器)之中,我們可以通過CPU指令或DMA把它讀取到內(nèi)存(編碼過程中就是把它賦給設(shè)置的某個變量)中。模數(shù)轉(zhuǎn)換之后,可以觸發(fā)DMA請求,或者觸發(fā)ADC的轉(zhuǎn)換結(jié)束事件。如果配置了模擬看門狗,并且采集得到的電壓大于閾值,會觸發(fā)看門狗中斷。通過編寫控制程序可以讓嵌入式系統(tǒng)完成很多靈活的任務(wù)。ADC的架構(gòu)ADC所有的器件都是圍繞中間的模擬至數(shù)字轉(zhuǎn)換器部ADC電源名稱信號類型說明VREF+輸入,模擬參考正極ADC參考電壓正極,2.4V≤VREF+

≤VDDAVDDA輸入,模擬電源等效于VDD的模擬電源且:2.4V≤VDDA≤VDD(3.6V)VREF-

輸入,模擬參考負(fù)極ADC參考電壓負(fù)極,VREF-=VSSAVSSA輸入,模擬電源地等效于VSS的模擬電源地ADC的參考電壓是通過VREF+和VREF-提供的。引腳數(shù)100以上的型號,才有ADC參考電壓引腳,其余型號的ADC參考電壓使用芯片內(nèi)部參考電壓,沒有引到片外。參考電壓是AD轉(zhuǎn)換的比較基準(zhǔn),為了保證AD轉(zhuǎn)換結(jié)果的準(zhǔn)確性,對參考電壓的準(zhǔn)確性和穩(wěn)定性要求都比較高。表中列出了ADC電源相關(guān)的各引腳含義及使用說明。ADC電源名稱信號類型說明VREF+輸入,模擬參考正極ADCADC通道和轉(zhuǎn)換順序ADC1ADC2ADC3通道0PA0PA0PA0通道1PA1PA1PA1通道2PA2PA2PA2通道3PA3PA3PA3通道4PA4PA4PF6通道5PA5PA5PF7通道6PA6PA6PF8通道7PA7PA7PF9通道8PB0PB0PF10通道9PB1PB1通道10PC0PC0PC0通道11PC1PC1PC1通道12PC2PC2PC2通道13PC3PC3PC3通道14PC4PC4通道15PC5PC5通道16內(nèi)部溫度傳感器通道17內(nèi)部參照電壓

ADC有18個通道,可測量16個外部和2個內(nèi)部信號源??驁D中的ADCx_IN0、ADCx_IN1、……、ADCx_IN15就是ADC的16個外部通道物理引腳16個外部通道又分為規(guī)則通道和注入通道,其中規(guī)則通道最多16路,注入通道最多4路。規(guī)則通道組可類比于順序運(yùn)行的程序。規(guī)則通道和它的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇,規(guī)則組轉(zhuǎn)換的總數(shù)應(yīng)寫入ADC_SQR1寄存器的L[3:0]中。注入通道組可類比于中斷服務(wù)函數(shù),在規(guī)則通道轉(zhuǎn)換的過程中插入注入通道組的轉(zhuǎn)換,注入通道組轉(zhuǎn)換完畢后再進(jìn)行剩余規(guī)則通道的轉(zhuǎn)換。注入組和它的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里轉(zhuǎn)換的總數(shù)應(yīng)寫入ADC_JSQR寄存器的L[1:0]中。STM32F1的ADC各通道可以單次轉(zhuǎn)換模式執(zhí)行,連續(xù)轉(zhuǎn)換模式執(zhí)行,或者掃描轉(zhuǎn)換模式執(zhí)行。ADC通道和轉(zhuǎn)換順序ADC1ADC2ADC3通道0PA0PA串行通信的硬件連接ADC只執(zhí)行一次轉(zhuǎn)換。該模式既可通過設(shè)置ADC_CR2寄存器的ADON位啟動,也可通過外部觸發(fā)啟動。當(dāng)一個規(guī)則通道轉(zhuǎn)換完成后:轉(zhuǎn)換數(shù)據(jù)被儲存在16位ADC_DR寄存器中;EOC(轉(zhuǎn)換結(jié)束)標(biāo)志被置位;如果設(shè)置了EOCIE,則產(chǎn)生中斷。當(dāng)一個注入通道轉(zhuǎn)換完成后:轉(zhuǎn)換數(shù)據(jù)被儲存在16位的ADC_DRJ1寄存器中;JEOC(注入轉(zhuǎn)換結(jié)束)標(biāo)志被置位;如果設(shè)置了JEOCIE位,則產(chǎn)生中斷。單次轉(zhuǎn)換模式在連續(xù)轉(zhuǎn)換模式中,當(dāng)前一通道轉(zhuǎn)換完成,馬上就啟動下一通道的轉(zhuǎn)換。此模式可通過外部觸發(fā)啟動或通過設(shè)置ADC_CR2寄存器上的ADON位啟動。當(dāng)一個規(guī)則通道轉(zhuǎn)換完成后,轉(zhuǎn)換數(shù)據(jù)儲存在16位的ADC_DR寄存器中;EOC(轉(zhuǎn)換結(jié)束)標(biāo)志被設(shè)置;如果設(shè)置了EOCIE,則產(chǎn)生中斷。當(dāng)一個注入通道轉(zhuǎn)換完成后:轉(zhuǎn)換數(shù)據(jù)被儲存在16位的ADC_DRJ1寄存器中;JEOC(注入轉(zhuǎn)換結(jié)束)標(biāo)志被設(shè)置;如果設(shè)置了JEOCIE位,則產(chǎn)生中斷。連續(xù)轉(zhuǎn)換模式用來掃描一組模擬通道。掃描模式可通過設(shè)置ADC_CR1寄存器的SCAN位來選擇。一旦這個位被設(shè)置,ADC掃描所有被ADC_SQRX寄存器(對規(guī)則通道)或ADC_JSQR(對注入通道)選中的所有通道。在每個組的每個通道上執(zhí)行單次轉(zhuǎn)換。在每個轉(zhuǎn)換結(jié)束時,同一組的下一個通道被自動轉(zhuǎn)換。如果設(shè)置了CONT位,轉(zhuǎn)換不會在選擇組的最后一個通道上停止,而是再次從選擇組的第一個通道繼續(xù)轉(zhuǎn)換。如果設(shè)置了DMA位,在每次EOC后,DMA控制器把規(guī)則組通道的轉(zhuǎn)換數(shù)據(jù)傳輸?shù)絊RAM中。而注入通道轉(zhuǎn)換的數(shù)據(jù)總是存儲在ADC_JDRx寄存器中。掃描轉(zhuǎn)換模式串行通信的硬件連接ADC只執(zhí)行一次轉(zhuǎn)換。該模式既可通過設(shè)置A轉(zhuǎn)換時間ADC輸入時鐘ADC_CLK由PCLK2(APB2時鐘)經(jīng)過分頻產(chǎn)生。不要讓ADC時鐘超過14MHz,否則可能導(dǎo)致轉(zhuǎn)換結(jié)果不準(zhǔn)確。ADC使用若干個ADC_CLK周期對輸入電壓進(jìn)行采樣,采樣周期數(shù)目可以通過ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位設(shè)置。每個通道可以分別用不同的時間采樣??傓D(zhuǎn)換時間的計算:TCONV=采樣時間+12.5個周期例如:當(dāng)ADC_CLK=14MHz,采樣時間為1.5周期,則TCONV=1.5+12.5=14周期=1μs轉(zhuǎn)換時間ADC輸入時鐘ADC_CLK由PCLK2(APB2時目錄/Contents11.1ADC原理概述11.2ADC庫函數(shù)11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓采集11.4小結(jié)目錄/Contents11.1ADC原理概述11.2ADC庫目錄/Contents11.2ADC庫函數(shù)一、ADC常用庫函數(shù)二、利用庫函數(shù)設(shè)置和使用ADC的一般步驟目錄/Contents11.2ADC庫函數(shù)一、ADC常用庫函串行通信的硬件連接voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);作用:配置ADC模式、掃描模式、單次連續(xù)模式、外部觸發(fā)方式、對齊方式、規(guī)則序列長度。初始化函數(shù)voidADC_Cmd(ADC_TypeDef*ADCx,FunctionalStateNewState);作用:配置ADC使能。使能函數(shù)voidADC_SoftwareStartConvCmd(ADC_TypeDef*ADCx,FunctionalStateNewState);作用:ADC使能軟件轉(zhuǎn)換(在ADC_Init函數(shù)中,外部觸發(fā)方式選擇none)。軟件轉(zhuǎn)換函數(shù)voidADC_RegularChannelConfig(ADC_TypeDef*ADCx,uint8_tADC_Channel,uint8_tRank,uint8_tADC_SampleTime);作用:配置某個ADC控制器的某個通道以某種采樣率置于規(guī)則組的某一位(對應(yīng)函數(shù)的四個參數(shù):ADC控制器名、ADC通道名、規(guī)則組的第n個、采樣率)。規(guī)則通道配置函數(shù)uint16_tADC_GetConversionValue(ADC_TypeDef*ADCx);作用:獲得某個ADC控制器的軟件轉(zhuǎn)換結(jié)果。獲取轉(zhuǎn)換結(jié)果函數(shù)串行通信的硬件連接voidADC_Init(ADC_Typ利用庫函數(shù)設(shè)置和使用ADC的一般步驟STM32F103xx的ADC通道1在PA1上,所以,先要使能PORTA的時鐘,然后設(shè)置PA1為模擬輸入。使能GPIOA和ADC時鐘用RCC_APB2PeriphClockCmd函數(shù),設(shè)置PA1的輸入方式,使用GPIO_Init函數(shù)即可。第一步:開啟PA口和ADC1時鐘,設(shè)置PA1為模擬輸入1RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//使能ADC1,GPIOA時鐘1GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//指定引腳2GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入3GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA利用庫函數(shù)設(shè)置和使用ADC的一般步驟STM32F103xx的利用庫函數(shù)設(shè)置和使用ADC的一般步驟設(shè)置單次轉(zhuǎn)換模式、觸發(fā)方式選擇、數(shù)據(jù)對齊方式等都在這一步實現(xiàn)。這些在庫函數(shù)中是通過函數(shù)ADC_Init實現(xiàn)的,其定義為:voidADC_Init(ADC_TypeDef*ADCx,ADC_InitTypeDef*ADC_InitStruct);從函數(shù)定義可以看出,第一個參數(shù)是指定ADC號。第二個參數(shù)是通過設(shè)置結(jié)構(gòu)體成員變量的值來設(shè)定參數(shù)。第二步:初始化ADC1參數(shù),設(shè)置ADC1的工作模式以及規(guī)則序列的相關(guān)信息1 ADC_InitTypeDefADC_InitStructure;//ADC初始化結(jié)構(gòu)體變量2 ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC1和ADC2工作在獨(dú)立模式3 ADC_InitStructure.ADC_ScanConvMode= DISABLE;//單通道4 ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//ADC轉(zhuǎn)換工作在連續(xù)模式5 ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//由軟件控制轉(zhuǎn)換,不使用外部觸發(fā)6 ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//轉(zhuǎn)換數(shù)據(jù)右對齊7 ADC_InitStructure.ADC_NbrOfChannel=1;//轉(zhuǎn)換通道數(shù)為18 ADC_Init(ADC1,&ADC_InitStructure);//初始化ADC利用庫函數(shù)設(shè)置和使用ADC的一般步驟設(shè)置單次轉(zhuǎn)換模式、觸發(fā)方利用庫函數(shù)設(shè)置和使用ADC的一般步驟分頻因子要確保ADC1的時鐘(ADCCLK)不要超過14Mhz。這里設(shè)置分頻因子為8,時鐘為72/8=9MHz第三步:設(shè)置ADC1分頻因子,確定工作時鐘1RCC_ADCCLKConfig(RCC_PCLK2_Div8);//配置ADC時鐘為CLK2的8分頻,72/8=9MHz第四步:設(shè)置ADC轉(zhuǎn)換通道順序及采樣時間1ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);//ADC1選擇通道1,順序為1,采樣時間239.5個周期第五步:配置使能ADC轉(zhuǎn)換完成中斷(如果需要ADC中斷處理才執(zhí)行這個步驟)1ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//轉(zhuǎn)換結(jié)束后產(chǎn)生中斷利用庫函數(shù)設(shè)置和使用ADC的一般步驟分頻因子要確保ADC1的利用庫函數(shù)設(shè)置和使用ADC的一般步驟如果沒有經(jīng)過校準(zhǔn),AD轉(zhuǎn)換結(jié)果是不準(zhǔn)確的。在校準(zhǔn)期間,在每個電容器上都會計算出一個誤差修正碼(數(shù)字值),這個碼用于消除在隨后的轉(zhuǎn)換中每個電容器上產(chǎn)生的誤差。校準(zhǔn)可大幅減小因內(nèi)部電容器組的變化而造成的準(zhǔn)精度誤差。建議在每次上電后都進(jìn)行一次自校準(zhǔn)。1ADC_Cmd(ADC1,ENABLE);//開啟ADC1第七步:ADC校準(zhǔn)1ADC_ResetCalibration(ADC1);//初始化(復(fù)位)ADC1校準(zhǔn)寄存器2while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)初始化完成3ADC_StartCalibration(ADC1);//開始ADC1校準(zhǔn)4while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)完成第六步:使能ADC利用庫函數(shù)設(shè)置和使用ADC的一般步驟如果沒有經(jīng)過校準(zhǔn),AD轉(zhuǎn)利用庫函數(shù)設(shè)置和使用ADC的一般步驟用軟件啟動一次轉(zhuǎn)換并且讀取轉(zhuǎn)換結(jié)果的方法如下:第八步:ADC轉(zhuǎn)換結(jié)果的讀取1ADC_SoftwareStartConvCmd(ADC1,ENABLE);//軟件啟動ADC1的轉(zhuǎn)換 2while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待轉(zhuǎn)換結(jié)束3returnADC_GetConversionValue(ADC1); //返回最近一次轉(zhuǎn)換結(jié)果利用庫函數(shù)設(shè)置和使用ADC的一般步驟用軟件啟動一次轉(zhuǎn)換并且讀目錄/Contents11.1ADC原理概述11.2ADC庫函數(shù)11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓采集11.4小結(jié)目錄/Contents11.1ADC原理概述11.2ADC庫目錄/Contents11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓采集一、目標(biāo)二、電路設(shè)計三、程序代碼四、仿真效果目錄/Contents11.3應(yīng)用案例:ADC實現(xiàn)單通道電壓案例目標(biāo)實現(xiàn):使用STM32F103R6采集可變電阻上的電壓信號,并通過計算,把當(dāng)前ADC轉(zhuǎn)換值和電壓值顯示在LCD1602液晶顯示屏上。并對照電壓表的讀數(shù),驗證ADC的準(zhǔn)確性。案例目標(biāo)實現(xiàn):使用STM32F103R6采集可變電阻上的電壓仿真電路LCD1是LM016L元件,其功能與常見的LCD1602液晶顯示屏相同。STM32F103xx單片機(jī)通過ADC1的通道1(PA1引腳)采集電壓值。仿真電路LCD1是LM016L元件,其功能與常見的LCD16代碼實現(xiàn)代碼實現(xiàn)adc.h//Filename:adc.h#include"vartypes.h"

#ifndef__ADC_H#define__ADC_H

voidADC1_GPIO_Config(void);voidADC_Config(void);uint16_tGet_Adc(void);uint16_tGet_Adc_Average(Int08Utimes);

#endif

adc.h//Filename:adc.hadc.c//1 //Filename:adc.c2 #include"includes.h"3 4 voidADC1_GPIO_Config(void)//ADC引腳初始化配置5 {6 …//略(詳見書中正文)11 }12 13 voidADC_Config(void)//adc初始化配置14 { 15 ADC_InitTypeDefADC_InitStructure;//ADC初始化結(jié)構(gòu)體變量16 …略(詳見書中正文)26 ADC_Cmd(ADC1,ENABLE);//開啟ADC127 28 /*程序運(yùn)行于Protues時,校準(zhǔn)會導(dǎo)致無限等待,不要校準(zhǔn)。運(yùn)行于實際硬件時,應(yīng)加以校準(zhǔn)29 ADC_ResetCalibration(ADC1);//初始化(復(fù)位)ADC1校準(zhǔn)寄存器30 while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)初始化完成31 ADC_StartCalibration(ADC1);//開始ADC1校準(zhǔn)32 while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)完成33 */34 }35 36 Int16UGet_Adc(void)//獲得ADC轉(zhuǎn)換值37 {38 ADC_SoftwareStartConvCmd(ADC1,ENABLE);//軟件啟動ADC1的轉(zhuǎn)換39 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待轉(zhuǎn)換結(jié)束40 returnADC_GetConversionValue(ADC1);//返回最近一次轉(zhuǎn)換結(jié)果41 }42 43 Int16UGet_Adc_Average(Int08Utimes)//獲得指定通道多次AD轉(zhuǎn)換結(jié)果的平均值44 {45 Int32Utemp_val=0;46 Int08Ui;47 for(i=0;i<times;i++) 48 temp_val+=Get_Adc(ch);//累加49 50 returntemp_val/times;//返回平均值51 } ADC1_GPIO_Config(void)//ADC引腳初始化配置ADC_Config(void)//adc初始化配置程序運(yùn)行于Protues時,校準(zhǔn)會導(dǎo)致無限等待,不要校準(zhǔn)。運(yùn)行于實際硬件時,應(yīng)加以校準(zhǔn)Get_Adc(void)//獲得ADC轉(zhuǎn)換值Get_Adc_Average(Int08Utimes)//獲得指定通道多次AD轉(zhuǎn)換結(jié)果的平均值adc.c//1 //Filename:adc.cADC1main.c1 //Filename:main.c2 #include"includes.h" 4 intmain(void)5 {…//略(詳見書中正文)15 LCD1602_ShowStr(1,0,"

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論