ADC特點:
12位逐次逼近型的模擬數(shù)字轉(zhuǎn)換器
最多帶3個ADC控制器
最多支持18個通道,可最多測量16個外部和2個內(nèi)部信號源
支持單次和連續(xù)轉(zhuǎn)換模式
通道0到通道n的自動掃描模式
自動校準(zhǔn)
采樣間隔可以按通道編程
規(guī)則通道和注入通道均有外部觸發(fā)選項
轉(zhuǎn)換結(jié)果支持左對齊或右對齊方式存儲在16位數(shù)據(jù)寄存器
ADC轉(zhuǎn)換時間:最大轉(zhuǎn)換速率1us。(最大轉(zhuǎn)換速度為1MHz,在ADCCLK=14M,采樣周期為1.5個ADC時鐘下得到。)
ADC供電要求:2.4V-3.6V
ADC輸入范圍:VREF- ≤ VIN ≤ VREF+
ADC引腳:如下圖所示:
注:只有144引腳的STM32才有PF腳。ADC引腳:Vref+模擬參考+極;Vref-模擬參考-極;Vdda模擬電源;Vssa模擬電源地;其中Vdda和Vssa分別接Vdd和Vss。
規(guī)則通道組:相當(dāng)于正常運行程序,最多16個通道
注入通道組:相當(dāng)于中斷。最多4個通道,在執(zhí)行規(guī)則通道組轉(zhuǎn)換過程中,如果遇到注入通道組則先去執(zhí)行注入通道組,執(zhí)行完返回繼續(xù)執(zhí)行規(guī)則通道組。
注:STM32F1的ADC的各通道可以單次,連續(xù),掃描或者間斷模式執(zhí)行;不要讓ADC時鐘超過14MHz,否則可能不準(zhǔn)。
CODE:實驗?zāi)康模篈DC1的通道1(PA1)進(jìn)行單次轉(zhuǎn)化。
//adc.c#include"adc.h"#include"delay.h"http://初始化ADC//這里我們僅以規(guī)則通道為例//我們默認(rèn)將開啟通道0~3voidAdc_Init(void){ADC_InitTypeDefADC_InitStructure;GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//使能ADC1通道時鐘RCC_ADCCLKConfig(RCC_PCLK2_Div6);//設(shè)置ADC分頻因子672M/6=12,ADC最大時間不能超過14M//PA1作為模擬通道輸入引腳GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入引腳GPIO_Init(GPIOA,&GPIO_InitStructure);ADC_DeInit(ADC1);//復(fù)位ADC1ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在獨立模式ADC_InitStructure.ADC_ScanConvMode=DISABLE;//模數(shù)轉(zhuǎn)換工作在單通道模式ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//模數(shù)轉(zhuǎn)換工作在單次轉(zhuǎn)換模式ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//轉(zhuǎn)換由軟件而不是外部觸發(fā)啟動ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC數(shù)據(jù)右對齊ADC_InitStructure.ADC_NbrOfChannel=1;//順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目ADC_Init(ADC1,&ADC_InitStructure);//根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器ADC_Cmd(ADC1,ENABLE);//使能指定的ADC1ADC_ResetCalibration(ADC1);//使能復(fù)位校準(zhǔn)while(ADC_GetResetCalibrationStatus(ADC1));//等待復(fù)位校準(zhǔn)結(jié)束ADC_StartCalibration(ADC1);//開啟AD校準(zhǔn)while(ADC_GetCalibrationStatus(ADC1));//等待校準(zhǔn)結(jié)束//ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC1的軟件轉(zhuǎn)換啟動功能}//獲得ADC值//ch:通道值0~3u16Get_Adc(u8ch){//設(shè)置指定ADC的規(guī)則組通道,一個序列,采樣時間ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);//ADC1,ADC通道,采樣時間為239.5周期ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC1的軟件轉(zhuǎn)換啟動功能while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待轉(zhuǎn)換結(jié)束returnADC_GetConversionValue(ADC1);//返回最近一次ADC1規(guī)則組的轉(zhuǎn)換結(jié)果}u16Get_Adc_Average(u8ch,u8times){u32temp_val=0;u8t;for(t=0;t