1. 程式人生 > >stm32 ADC學習

stm32 ADC學習

理解 str 外部 tro etime version 必須 uint8_t don

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學習