1.ADC是12位的一種逐次型模擬數字轉換器,所以進行存儲時只能存儲在16位數據寄存器中,不能低於12位。其中有16個外部信號源(ADCx_IN0--ADCx_IN15)和2個內部信號源(溫度傳感器、)
2.ADC時鍾--由時鍾控制器提供的ADCCLK時鍾(RCC_CFGR寄存器設置ADC時鍾分頻)和PCLK2(APB2時鍾)同步 。
3.每個通道可以分別用不同的時間采樣。
總轉換時間如下計算:
TCONV = 采樣時間+ 12.5個周期
當ADCCLK=14MHz,采樣時間為1.5周期 TCONV = 1.5 + 12.5 = 14周期 = 1μs
4.轉換可以由外部事件觸發(例如定時器捕獲, EXTI線)。 如果設置了EXTTRIG控制位, 則外部事件就能夠觸發轉換。
5.ADC寄存器
(1)ADC_CR2 控制寄存器
位23 位22 位20 |
TSVREFE: 溫度傳感器和VREFINT使能 SWSTART: 開始轉換規則通道 EXTTRIG: 規則通道的外部觸發轉換模式 |
位19:17 EXTSEL[2:0]: 選擇啟動規則通道組轉換的外部事件 | |
位11 位3 位2 位1 位0 |
ALIGN: 數據對齊 RSTCAL: 復位校准 (Reset calibration) CAL: A/D校准 (A/D Calibration) CONT: 連續轉換 ADON: 開/關A/D轉換器 |
(2)采樣時間寄存器 ADC_SMPRx --1,2分別是通道1和通道2的。
(3)ADC規則序列寄存器ADC_SQRx--查找數據手冊:進行設置通道轉換數目:ADC_SQR1的位23:20位,進行設置進行轉換順序即第幾個轉換:ADC_SQR1-ADC_SQR3。
L[3:0]:規則通道序列長度 (Regular channel sequence length) 這些位由軟件定義在規則通道轉換序列中的通道數目。 0000: 1個轉換 0001: 2個轉換 …… 1111: 16個轉換 |
6.ADC的一般配置過程:
1) 開啟 PA 口時鍾, 設置 PA3為模擬輸入。
STM32F103R8T6 的 ADC1 通道 3 在 PA3 上, 所以, 我們先要使能 PORTA 的時鍾, 然
后設置 PA3 為模擬輸入。
2) 使能 ADC1 時鍾, 並設置分頻因子。
通過 RCC 的 CFGR 寄存器設置 ADC1 的分頻因子。 分頻因子要確保 ADC1 的時鍾(
ADCCLK) 不要超過 14Mhz。
(1)RCC->APB2ENR (2)RCC->CFGR
3) 設置 ADC1 的工作模式。
設置獨立模式、 關閉掃描( 使用掃描) 、 單次( 連續) 轉換模式、 數據對齊方式
( 左對齊) 、 觸發方式選擇( 外部觸發-軟件觸發) 等都在這一步實現。
ADCx->CR1和ADCx->CR2
4) 設置 ADC1 規則序列的相關信息。
我們這里只有一個通道, 所以設置規則序列中通道數為 1:ADC1->SQR1 設置規則序列轉換順序:ADCx->SQRx
//*******-3個通道,轉換3個
ADC1->SQR1 |=(2<<20);
//*******IN3通道3放在規則組中第一個轉換,2--2,1--3
ADC1->SQR3 |=(3<<0);//3--通道編號
ADC1->SQR3 |=(2<<5);//2--通道編號
ADC1->SQR3 |=(1<<10);//1--通道編號
然后設置 ADC1 通道 3的采樣周期:ADCx->SMPRx
5) 開啟 AD 轉換器, 校准。
開啟 AD 轉換器, 復位校准, 等待復位結束, 開啟校准, 等待校准結束( 通過
ADC_CR2 寄存器控制) 。:ADCx->CR2
//復位校准
ADC1->CR2 |=(1<<3);
//等待校准寄存器被初始化
while(ADC1->CR2 &(1<<3));//初始化校准完成,自動為0,退出whiile
//A/D校准
ADC1->CR2 |=(1<<2);
//等待校准完成
while(ADC1->CR2&(1<<2));
6) 讀取 ADC 值。
啟動ADC 轉換:ADC1->CR2 |=(1<<22) 在轉換結束后, 讀取 ADC1_DR 里面的值就是了
void GZ_ADCValue(void)
{
#if reg_progream
u16 gz_value;//光照的值
//啟動規則通道轉換
ADC1->CR2 |=(1<<22);
//等待轉換完成
while((ADC1->SR &(1<<1))==0);
gz_value=ADC1->DR;
printf("gz_value=%d\r\n",gz_value);
}