stm32之ADC(規則通道)


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)
CALA/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)
這些位由軟件定義在規則通道轉換序列中的通道數目。
00001個轉換
00012個轉換
……
111116個轉換

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);

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM