目錄
一、實驗目的
二、電路連接
三、實驗執行(五步)
1.初始化ADC的IO引腳
2.配置ADC的時鐘,注意要小于14MHz
3.根據ADC的編程接口? 實現初始化ADC的基本參數
4.配置常規序列并閉合觸發輸入開關
5.閉合總開關、啟動并讀取轉換結果
四、代碼
一、實驗目的
使用ADC實現:根據光敏傳感器的光照強弱去得到不同的輸入電壓對應的量化結果碼(使用軟件觸發常規序列的執行),既而根據得到的量化值*分辨率得到不同的電壓 然后去實現板載燈的亮滅(因為日光燈照度一般10lux,其對應的AO輸出電壓為1.5V,所以以1.5V為邊界實現板載燈的亮滅)。
?
二、電路連接
三、實驗執行(五步)
ADC的執行(五步):初始化ADCIO、配置時鐘、ADC_Init、配置常規序列/注入序列、閉合觸發輸入開關和總開關
1.初始化ADC的IO引腳
2.配置ADC的時鐘,注意要小于14MHz
3.根據ADC的編程接口? 實現初始化ADC的基本參數
其中,值得注意的是:EOC和JEOC標志位,EOC是end of convert,另一個是Inject開頭的
常規序列的第一個是配置常規序列的內容,即配置哪個通道,采樣時間多少
連續模式:一旦啟動 ADC,它會 不停地對同一個通道采樣和轉換,轉換完一輪馬上開始下一輪,像水龍頭開著一樣,結果源源不斷。----針對一個通道
對齊方式:一般選擇右對齊,方便計算
外部觸發這里選擇軟件觸發
雙ADC表示是否使用兩個ADC來執行操作
通道數:表示你要使用幾個通道,這里是只使用1個
掃描模式:如果你配置了 多個通道,ADC 會按照你設定的順序 一個接一個地采樣、轉換。
例如:先測通道 0,再測通道 1,再測通道 2……直到結束一輪。------針對多個通道
4.配置常規序列并閉合觸發輸入開關
首先配置序列計劃,參數依次是ADC名稱,選擇第幾個通道,在序列計劃在排第幾,采樣時間(注意這個采用時間 給的是默認是一些固定的時間參數,這里選擇與光敏傳感器(10.24)最接近的13cycle)
之后閉合觸發輸入的開關? 以及閉合ADC總開關
5.閉合總開關、啟動并讀取轉換結果
?先清楚標志位
發送軟件觸發的輸入信號
當標志位從0-1表示常規序列完成了,注意不是一次轉換完成,而是一次常規序列都完成了?
讀取這個值,并把這個值轉為近似的電壓,做后續操作
四、代碼
#include "stm32f10x.h"
#include "Delay.h"
#include "usart.h"
void App_GPIO_Init(void);
void App_ADC_Init(void);int main(void)
{//使用ADC實現軟件觸發的單通道轉換//ADC初始化 //其中注意輸入電壓的內阻已經得到,并且因此得到的采樣時間是10.24cycleApp_GPIO_Init();App_ADC_Init();while(1){//先清零EOC標志位ADC_ClearFlag(ADC1,ADC_FLAG_EOC);while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);uint16_t res=ADC_GetConversionValue(ADC1); float volt=res*(3.3f/4095);if(volt>1.5){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);}else{GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);}}
}
void App_GPIO_Init(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitTypeDef GPIO_InitStruct={0};GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);}
void App_ADC_Init(){//首先就是初始化ADC的IORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct={0};GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化后開啟時鐘RCC_ADCCLKConfig(RCC_PCLK2_Div6);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//初始化ADCADC_InitTypeDef ADC_InitStruct={0};ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;ADC_InitStruct.ADC_NbrOfChannel=1;ADC_InitStruct.ADC_ScanConvMode=DISABLE;ADC_Init(ADC1,&ADC_InitStruct);//配置常規序列ADC_RegularChannelConfig(ADC1,0,1,ADC_SampleTime_13Cycles5);ADC_ExternalTrigConvCmd(ADC1,ENABLE);//開啟總開關ADC_Cmd(ADC1,ENABLE);}