stm32 ADC學習
stm32 ADC 簡介
stm32的ADC是 12位逐次逼近型 模擬數字轉換器;它包括18個通道,可以用來測量16個外部通道和2個內部通道.ADC轉換的結果存放在16位數據寄存器(ADC規則數據寄存器,ADC_DR 和 ADC註入數據寄存器,ADC_JDCx)中,這個數據寄存器可以設置對齊方式為左對齊或右對齊.
規則通道組和註入通道組
註入通道可打斷規則通道的轉換
所謂規則通道組和註入通道組其實應該就是通道的分組吧,按照OOP的思想來理解,通道組是一個基類,註入通道組和規則通道組派生自通道組這個基類,通道組這個基類中包含了一個保存各個通道的數組.
為什麽要對通道進行分組呢,這個有待深究,以後再說.
ADC相關的寄存器
ADC_CR1
各個位描述如下圖:
- scan位:
設置掃描模式,1為使用掃描模式,0則關閉.掃描模式下,有ADC_SQRx或ADC_JSQRx寄存器選中的通道被轉換,此時如果設置了EOCIE或JEOCIE,則只有在最後一個通道轉換完畢後才會產生EOC或JEOC中斷 DUALMOD位:
設置ADC的操作模式,詳細的看下面的來自<>截圖
ADC_CR2
各個位描述如下圖:
- ADON位:用於開關AD轉換器
- CONT位:用於設置是否進行連續轉換,使用單次轉換CONT位必須設置為0.
EXTSEL[2:0]:用於選擇啟動規則轉換組轉換的外部事件
如果需要使用軟件觸發,就將這三個位設置為 111
ADC采樣事件寄存器(ADC_SMPR1和ADC_SMPR2)
各個位描述如下圖:
這兩個寄存器用來設置通道0~17的采樣時間,每個通道要占3位.
對於每個要轉換的通道,采樣時間盡量長一點,以獲得較高的準確度,但是會降低ADC的轉換速率.ADC的轉換時間可以由以下公式計算:
Tconv = 采樣時間 + 12.5周期
ADC規則序列寄存器(ADC_SQR1~3)
這幾個寄存器功能都差不多,不一一詳細說明了.
L[3:0]:用於存儲規則序列的長度
ADC數據寄存器(ADC_DR)
這個沒什麽好說的,用來存放AD轉換後的結果
要註意可以通過ADC_CR2的ALIGN位設置這個寄存器是左對齊還是右對齊
ADC狀態寄存器(ADC_SR)
沒啥好說的,保存了各種狀態,看圖吧.
通過庫函數配置ADC1通道1進行AD轉換
1.外設使能
STM32F103ZET6的ADC通道1在PA1上所以我們先要使能 PORTA的時鐘 和 ADC1時鐘,然後設置 PA1為模擬輸入.
2.復位ADC1,同時設置ADC1的分頻因子
開啟了ADC1的時鐘後,要復位ADC1,將ADC1的全部寄存器重設位缺省值,然後通過RCC_CFGR設置ADC1的分頻因子,並且分頻因子要確保ADC1的時鐘不超過14MHz!
ADC復位函數:
ADC_DeInit();
設置分配因子的庫函數
RCC_ADCCLKConfig(RCC_PCLK2_DIV6);
3.初始化ADC1參數,設置ADC1的工作模式以及規則序列的相關信息.
ADC初始化函數:
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
4.使能ADC並校準
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
//使能指定的ADC
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
//復位校準
void ADC_StartCalibration(ADC_TypeDef* ADCx);
//執行ADC校準
while(ADC_GetResetCalibrationStatus(...));
//等待復位校準結束
while(ADC_GetCalibrationStatus(...));
//等待AD校準結束
5.設置規則序列1裏面的通道,讀取ADC的值
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
//設置規則序列通道以及采樣周期
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
//軟件開啟ADC轉換
while(!ADC_GetFlagStatus(ADCx,ADC_FLAG_EOC));
//等待轉換結束
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
//獲取轉換結果數據
stm32 ADC學習