代碼如下
#include "debug.h"? ? ? ? ? ? ? ? // Device header
/**
? * 函? ? 數(shù):AD初始化
? * 參? ? 數(shù):無
? * 返 回 值:無
? */
void AD_Init(void)
{
? ? /*開啟時(shí)鐘*/
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);? ? //開啟ADC1的時(shí)鐘
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);? ?//開啟GPIOA的時(shí)鐘
? ? /*設(shè)置ADC時(shí)鐘*/
? ? RCC_ADCCLKConfig(RCC_PCLK2_Div6);? ? ? ? ? ? ? ? ? ? ? ?//選擇時(shí)鐘6分頻,ADCCLK = 72MHz / 6 = 12MHz
? ? /*GPIO初始化*/
? ? GPIO_InitTypeDef GPIO_InitStructure;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_3;
? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_Init(GPIOA, &GPIO_InitStructure);? ? ? ? ? ? ? ? ? //將PA0、PA1、PA2和PA3引腳初始化為模擬輸入
? ? /*不在此處配置規(guī)則組序列,而是在每次AD轉(zhuǎn)換前配置,這樣可以靈活更改AD轉(zhuǎn)換的通道*/
? ? /*ADC初始化*/
? ? ADC_InitTypeDef ADC_InitStructure;? ? ? ? ? ? ? ? ? ? ? //定義結(jié)構(gòu)體變量
? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;? ? ? //模式,選擇獨(dú)立模式,即單獨(dú)使用ADC1
? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;? //數(shù)據(jù)對(duì)齊,選擇右對(duì)齊
? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部觸發(fā),使用軟件觸發(fā),不需要外部觸發(fā)
? ? ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;? ? ?//連續(xù)轉(zhuǎn)換,失能,每轉(zhuǎn)換一次規(guī)則組序列后停止
? ? ADC_InitStructure.ADC_ScanConvMode = DISABLE;? ? ? ? ? ?//掃描模式,失能,只轉(zhuǎn)換規(guī)則組的序列1這一個(gè)位置
? ? ADC_InitStructure.ADC_NbrOfChannel = 1;? ? ? ? ? ? ? ? ?//通道數(shù),為1,僅在掃描模式下,才需要指定大于1的數(shù),在非掃描模式下,只能是1
? ? ADC_Init(ADC1, &ADC_InitStructure);? ? ? ? ? ? ? ? ? ? ?//將結(jié)構(gòu)體變量交給ADC_Init,配置ADC1
? ? /*ADC使能*/
? ? ADC_Cmd(ADC1, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //使能ADC1,ADC開始運(yùn)行
? ? /*ADC校準(zhǔn)*/
? ? ADC_ResetCalibration(ADC1);? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//固定流程,內(nèi)部有電路會(huì)自動(dòng)執(zhí)行校準(zhǔn)
? ? while (ADC_GetResetCalibrationStatus(ADC1) == SET);
? ? ADC_StartCalibration(ADC1);
? ? while (ADC_GetCalibrationStatus(ADC1) == SET);
}
/**
? * 函? ? 數(shù):獲取AD轉(zhuǎn)換的值
? * 參? ? 數(shù):ADC_Channel 指定AD轉(zhuǎn)換的通道,范圍:ADC_Channel_x,其中x可以是0/1/2/3
? * 返 回 值:AD轉(zhuǎn)換的值,范圍:0~4095
? */
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);? ?//在每次轉(zhuǎn)換前,根據(jù)函數(shù)形參靈活更改規(guī)則組的通道1
? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);? ? ? ? ? ? ? ? ?//軟件觸發(fā)AD轉(zhuǎn)換一次
? ? while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //等待EOC標(biāo)志位,即等待AD轉(zhuǎn)換結(jié)束
? ? return ADC_GetConversionValue(ADC1);? ? ? ? ? ? ? ? ? ? //讀數(shù)據(jù)寄存器,得到AD轉(zhuǎn)換的結(jié)果
}