溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

STM32 ADC是什么

發(fā)布時間:2021-12-27 11:03:11 來源:億速云 閱讀:181 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章給大家分享的是有關(guān)STM32 ADC是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

01、ADC簡介

ADC是Analog-to-DigitalConverter的縮寫。指模/數(shù)轉(zhuǎn)換器或者模擬/數(shù)字轉(zhuǎn)換器。是指將連續(xù)變量的模擬信號轉(zhuǎn)換為離散的數(shù)字信號的器件。典型的模擬數(shù)字轉(zhuǎn)換器將模擬信號轉(zhuǎn)換為表示一定比例電壓值的數(shù)字信號。

從STM32F207的數(shù)據(jù)手冊中下圖看到,STM32F207VC有3個精度為12bit的ADC控制器,有16個外部通道,而144腳的STM32F207Zx和176腳的STM32F207Ix因?yàn)閹F腳,所以多8個通道,為24個外部通道。各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷執(zhí)行,ADC轉(zhuǎn)換的結(jié)果可以左對齊或右對齊儲存在16位數(shù)據(jù)寄存器中。

STM32 ADC是什么

02、STM32的ADC外設(shè)

上面說到,STM32F207有3個12bit的ADC控制器,下文將以ADC3的通道10講解。

首先我們確認(rèn)下ADC外設(shè)所在的地址總線,從STM32F207數(shù)據(jù)手冊中下圖看到,ADC屬于APB2總線下,APB2時鐘頻率是60MHz。具體STM32如果通過外部25M晶振得到的60MHz的APB2,請看《STM32F207時鐘系統(tǒng)解析》。

STM32 ADC是什么

對應(yīng)GPIO,我們從STM32F207數(shù)據(jù)手冊中看到,我們可以使用PC0作為ADC3的通道10。

STM32 ADC是什么

這里需要說明的是,之前的文章使用其他外設(shè)時,比如《STM32PWM輸出》中,尋找對應(yīng)的管腳時,我們都是從STM32F207數(shù)據(jù)手冊的Alternatefunctionmapping表中尋找,這是因?yàn)锳DC對應(yīng)的管腳使用的是Additionalfunctions,PWM對應(yīng)的管腳使用的是Alternatefunctions。

區(qū)別是:

Additionalfunctions:附加,輔助功能,引腳被連接到其他模塊使用,使用時直接普通配置即可,例如ADC的采用輸入通道,配置為模擬輸入。

Alternate functions:復(fù)用功能,即將IO口用作普通輸入輸出以外的功能,例如串口輸入輸出,使用時需要配置復(fù)用模式。

在之前的文章《STM32GPIO詳解》中有如下介紹。

STM32 ADC是什么

STM32標(biāo)準(zhǔn)外設(shè)庫中有如下代碼

typedef enum
{   
    GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */  
    GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */  
    GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */  
    GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
}GPIOMode_TypeDef;

其中GPIO_Mode_AF對應(yīng)的就是Alternate functions:復(fù)用功能,GPIO_Mode_AN對應(yīng)的就是Additional functions:附加,輔助功能。

03、STM32ADC框圖講解

下圖是STM32ADC的結(jié)構(gòu)框圖,我們將其劃分為7個部分進(jìn)行講解。

STM32 ADC是什么

1、輸入電壓范圍

ADC所能測量的電壓范圍就是VREF-≤ VIN ≤ VREF+,把VSSA 和VREF-接地,把VREF+和VDDA 接3V3,得到ADC的輸入電壓范圍為:0~3.3V。

STM32 ADC是什么

2、輸入通道

ADC的信號時通過輸入通道進(jìn)入單片機(jī)內(nèi)部的,單片機(jī)通過ADC模塊將模擬信號轉(zhuǎn)換為數(shù)字信號。上圖標(biāo)記②的部分顯示了外部的16個通道,連接的GPIO,對應(yīng)的關(guān)系如上面講解的,需要在STM32F207數(shù)據(jù)手冊的STM32F20xpin and ball definitions表格中尋找。實(shí)際上STM32還有內(nèi)部通道,ADC1的通道 16連接到了芯片內(nèi)部的溫度傳感器,Vrefint 連接到了通道17。ADC2的模擬通道 16和 17連接到了內(nèi)部的VSS。

3、轉(zhuǎn)換通道

外部的16個通道在轉(zhuǎn)換時又分為規(guī)則通道和注入通道,其中規(guī)則通道最多有16路,注入通道最多有4路(注入通道貌似使用不多),下面簡單介紹一下倆種通道:

規(guī)則通道

規(guī)則通道顧名思義就是,最平常的通道、也是最常用的通道,平時的ADC轉(zhuǎn)換都是用規(guī)則通道實(shí)的。規(guī)則通道和它的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇,規(guī)則組轉(zhuǎn)換的總數(shù)應(yīng)寫入ADC_SQR1寄存器的L[3:0]中。

注入通道

注入通道是相對于規(guī)則通道的,注入通道可以在規(guī)則通道轉(zhuǎn)換時,強(qiáng)行插入轉(zhuǎn)換,相當(dāng)于一個“中斷通道”吧。當(dāng)有注入通道需要轉(zhuǎn)換時,規(guī)則通道的轉(zhuǎn)換會停止,優(yōu)先執(zhí)行注入通道的轉(zhuǎn)換,當(dāng)注入通道的轉(zhuǎn)換執(zhí)行完畢后,再回到之前規(guī)則通道進(jìn)行轉(zhuǎn)換。最多4個通道,注入組和它的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里轉(zhuǎn)化的總數(shù)應(yīng)寫入ADC_JSQR寄存器的L[1:0]中。

一個ADC控制器有多個通道,這就涉及使用多個通道進(jìn)行轉(zhuǎn)換就涉及到一個先后順序的問題了,畢竟規(guī)則轉(zhuǎn)換通道只有一個數(shù)據(jù)寄存器。多個通道的使用順序分為倆種情況:規(guī)則通道的轉(zhuǎn)換順序和注入通道的轉(zhuǎn)換順序。

規(guī)則通道轉(zhuǎn)換順序

規(guī)則通道中的轉(zhuǎn)換順序由三個寄存器控制:SQR1、SQR2、SQR3,它們都是32位寄存器。SQR寄存器控制著轉(zhuǎn)換通道的數(shù)目和轉(zhuǎn)換順序,只要在對應(yīng)的寄存器位SQx中寫入相應(yīng)的通道,這個通道就是第x個轉(zhuǎn)換,通過SQR1寄存器就能了解其轉(zhuǎn)換順序在寄存器上的實(shí)現(xiàn)了。

注入通道轉(zhuǎn)換順序

和規(guī)則通道轉(zhuǎn)換順序的控制一樣,注入通道的轉(zhuǎn)換也是通過注入寄存器來控制,只不過只有一個JSQR寄存器來控制,控制關(guān)系如下:

STM32 ADC是什么

需要注意的是,只有當(dāng)JL=4的時候,注入通道的轉(zhuǎn)換順序才會按照J(rèn)SQ1、JSQ2、JSQ3、JSQ4的順序執(zhí)行。當(dāng)JL<4時,注入通道的轉(zhuǎn)換順序恰恰相反,也就是執(zhí)行順序?yàn)椋篔SQ4、JSQ3、JSQ2、JSQ1。

配置轉(zhuǎn)換順序的函數(shù)

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel,uint8_t Rank, uint8_t ADC_SampleTime)

04、觸發(fā)源

ADC轉(zhuǎn)換的輸入、通道、轉(zhuǎn)換順序都已經(jīng)說明了,但ADC轉(zhuǎn)換是怎么觸發(fā)的呢?就像通信協(xié)議一樣,都要規(guī)定一個起始信號才能傳輸信息,ADC也需要一個觸發(fā)信號來實(shí)行模/數(shù)轉(zhuǎn)換。

其一就是通過直接配置寄存器觸發(fā),通過配置控制寄存器CR2的ADON位,寫1時開始轉(zhuǎn)換,寫0時停止轉(zhuǎn)換。在程序運(yùn)行過程中只要調(diào)用庫函數(shù),將CR2寄存器的ADON位置1就可以進(jìn)行轉(zhuǎn)換,比較好理解。

另外,還可以通過內(nèi)部定時器或者外部IO觸發(fā)轉(zhuǎn)換,也就是說可以利用內(nèi)部時鐘讓ADC進(jìn)行周期性的轉(zhuǎn)換,也可以利用外部IO使ADC在需要時轉(zhuǎn)換,具體的觸發(fā)由控制寄存器CR2決定。

05、轉(zhuǎn)換周期

可獨(dú)立設(shè)置各通道采樣時間

ADC會在數(shù)個ADCCLK周期內(nèi)對輸入電壓進(jìn)行采樣,可使用ADC_SMPR1和ADC_SMPR2

寄存器中的SMP[2:0]位修改周期數(shù)。每個通道均可以使用不同的采樣時間進(jìn)行采樣。

總轉(zhuǎn)換時間的計(jì)算公式如下:

    Tconv=采樣時間+12個周期

示例:

    ADCCLK = 30 MHz且采樣時間=3個周期時:

    Tconv= 3+12=15個周期=0.5us (APB2為60MHz時)

最小采樣時間0.42us(ADC時鐘=36MHz,采樣周期為3周期下得到)。

06、數(shù)據(jù)寄存器

轉(zhuǎn)換完成后的數(shù)據(jù)就存放在數(shù)據(jù)寄存器中,但數(shù)據(jù)的存放也分為規(guī)則通道轉(zhuǎn)換數(shù)據(jù)和注入通道轉(zhuǎn)換數(shù)據(jù)的。

規(guī)則數(shù)據(jù)寄存器

規(guī)則數(shù)據(jù)寄存器負(fù)責(zé)存放規(guī)則通道轉(zhuǎn)換的數(shù)據(jù),通過32位寄存器ADC_DR來存放。

注入數(shù)據(jù)寄存器

注入通道轉(zhuǎn)換的數(shù)據(jù)寄存器有4個,由于注入通道最多有4個,所以注入通道轉(zhuǎn)換的數(shù)據(jù)都有固定的存放位置,不會跟規(guī)則寄存器那樣產(chǎn)生數(shù)據(jù)覆蓋的問題。 ADC_JDRx是 32位的,低 16位有效,高 16位保留,數(shù)據(jù)同樣分為左對齊和右對齊,具體是以哪一種方式存放,由ADC_CR2的 11 位ALIGN 設(shè)置。

07、中斷

可以產(chǎn)生4種中斷

STM32 ADC是什么

①DMA溢出中斷

當(dāng)配置了DMA,且DMA溢出時產(chǎn)生中斷

②規(guī)則通道轉(zhuǎn)換完成中斷

規(guī)則通道數(shù)據(jù)轉(zhuǎn)換完成之后,可以產(chǎn)生一個中斷,可以在中斷函數(shù)中讀取規(guī)則數(shù)據(jù)寄存器的值。這也是單通道時讀取數(shù)據(jù)的一種方法。

③注入通道轉(zhuǎn)換完成中斷

注入通道數(shù)據(jù)轉(zhuǎn)換完成之后,可以產(chǎn)生一個中斷,并且也可以在中斷中讀取注入數(shù)據(jù)寄存器的值,達(dá)到讀取數(shù)據(jù)的作用。

④模擬看門狗事件

當(dāng)輸入的模擬量(電壓)不再閾值范圍內(nèi)就會產(chǎn)生看門狗事件,就是用來監(jiān)視輸入的模擬量是否常。

08、電壓轉(zhuǎn)換

轉(zhuǎn)換后的數(shù)據(jù)是一個12位的二進(jìn)制數(shù),我們需要把這個二進(jìn)制數(shù)代表的模擬量(電壓)用數(shù)字表示出來。比如測量的電壓范圍是0~3.3V,轉(zhuǎn)換后的二進(jìn)制數(shù)是x,因?yàn)?2位ADC在轉(zhuǎn)換時將電壓的范圍大?。ㄒ簿褪?.3)分為4096(2^12)份,所以轉(zhuǎn)換后的二進(jìn)制數(shù)x代表的真實(shí)電壓的計(jì)算方法就是:

y=3.3* x / 4096

09、電路圖設(shè)計(jì)

電路圖很簡單,可以在ADC引腳上輸入不同的電壓,也可以直接方便的使用滑動變阻器實(shí)現(xiàn)不同的電壓變化。

STM32 ADC是什么

10、代碼設(shè)計(jì)

ADC外設(shè)配置的結(jié)構(gòu)體

typedef struct
{
  uint32_t ADC_Resolution;                /*!< Configures the ADC resolution dual mode. 
                                               This parameter can be a value of @ref ADC_resolution */                                   
  FunctionalState ADC_ScanConvMode;       /*!< Specifies whether the conversion 
                                               is performed in Scan (multichannels) 
                                               or Single (one channel) mode.
                                               This parameter can be set to ENABLE or DISABLE */ 
  FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion 
                                               is performed in Continuous or Single mode.
                                               This parameter can be set to ENABLE or DISABLE. */
  uint32_t ADC_ExternalTrigConvEdge;      /*!< Select the external trigger edge and
                                               enable the trigger of a regular group. 
                                               This parameter can be a value of 
                                               @ref ADC_external_trigger_edge_for_regular_channels_conversion */
  uint32_t ADC_ExternalTrigConv;          /*!< Select the external event used to trigger 
                                               the start of conversion of a regular group.
                                               This parameter can be a value of 
                                               @ref ADC_extrenal_trigger_sources_for_regular_channels_conversion */
  uint32_t ADC_DataAlign;                 /*!< Specifies whether the ADC data  alignment
                                               is left or right. This parameter can be 
                                               a value of @ref ADC_data_align */
  uint8_t  ADC_NbrOfConversion;           /*!< Specifies the number of ADC conversions
                                               that will be done using the sequencer for
                                               regular channel group.
                                               This parameter must range from 1 to 16. */
}ADC_InitTypeDef;

ADC_Resolution:ADC 工作模式選擇,ADC分辨率

ADC_ScanConvMode:ADC 掃描(多通道)或者單次(單通道)模式選擇

ADC_ContinuousConvMode:ADC 單次轉(zhuǎn)換或者連續(xù)轉(zhuǎn)換選擇

ADC_ExternalTrigConvEdge:ADC 外部觸發(fā)極性配置

ADC_ExternalTrigConv:ADC 轉(zhuǎn)換觸發(fā)信號選擇

ADC_DataAlign:ADC 數(shù)據(jù)寄存器對齊格式

ADC_NbrOfConversion:ADC轉(zhuǎn)換通道數(shù)目

typedef struct
{
    uint32_t ADC_Mode;//多重ADC模式選擇
    uint32_t ADC_Prescaler;  //ADC預(yù)分頻                             
    uint32_t ADC_DMAAccessMode;   //DMA訪問模式       
    uint32_t ADC_TwoSamplingDelay; //2個采樣階段之間的延遲      
}ADC_CommonInitTypeDef;

ADC_CommonInitTypeDef用來配置ADC_CCR寄存器的相關(guān)參數(shù)

ADC外設(shè)和DMA配置代碼

/**
  * @brief  ADC3 channel10 with DMA configuration
  * @param  None
  * @retval None
  */
void ADC3_CH10_DMA_Config(void)
{
  ADC_InitTypeDef       ADC_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  DMA_InitTypeDef       DMA_InitStructure;
  GPIO_InitTypeDef      GPIO_InitStructure;
 
  /* Enable ADC3, DMA2 and GPIO clocks ****************************************/
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
 
  /* DMA2 Stream0 channel2 configuration **************************************/
  DMA_InitStructure.DMA_Channel = DMA_Channel_2;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 1;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);
 
  /* Configure ADC3 Channel10 pin as analog input ******************************/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
  /* ADC Common Init **********************************************************/
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);
 
  /* ADC3 Init ****************************************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC3, &ADC_InitStructure);
 
  /* ADC3 regular channel7 configuration *************************************/
  ADC_RegularChannelConfig(ADC3, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);
 
 /* Enable DMA request after last transfer (Single-ADC mode) */
  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
 
  /* Enable ADC3 DMA */
  ADC_DMACmd(ADC3, ENABLE);
 
  /* Enable ADC3 */
  ADC_Cmd(ADC3, ENABLE);
}

代碼下載驗(yàn)證測試

STM32 ADC是什么

感謝各位的閱讀!關(guān)于“STM32 ADC是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

adc
AI