色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32的ADC詳解和代碼設計

GReq_mcu168 ? 來源:玩轉單片機 ? 作者:玩轉單片機 ? 2021-02-20 14:29 ? 次閱讀

01ADC簡介

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

STM32F207的數據手冊中下圖看到,STM32F207VC有3個精度為12bit的ADC控制器,有16個外部通道,而144腳的STM32F207Zx和176腳的STM32F207Ix因為帶PF腳,所以多8個通道,為24個外部通道。各通道的A/D轉換可以單次、連續、掃描或間斷執行,ADC轉換的結果可以左對齊或右對齊儲存在16位數據寄存器中。

fe6eeafe-71b8-11eb-8b86-12bb97331649.png

02STM32的ADC外設

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

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

fecd920c-71b8-11eb-8b86-12bb97331649.png

對應GPIO,我們從STM32F207數據手冊中看到,我們可以使用PC0作為ADC3的通道10。

0089603a-71b9-11eb-8b86-12bb97331649.png

這里需要說明的是,之前的文章使用其他外設時,比如《STM32PWM輸出》中,尋找對應的管腳時,我們都是從STM32F207數據手冊的Alternatefunctionmapping表中尋找,這是因為ADC對應的管腳使用的是Additionalfunctions,PWM對應的管腳使用的是Alternatefunctions。

區別是:

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

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

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

00e44496-71b9-11eb-8b86-12bb97331649.png

STM32標準外設庫中有如下代碼

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對應的就是Alternatefunctions:復用功能,GPIO_Mode_AN對應的就是Additionalfunctions:附加,輔助功能。

03STM32ADC框圖講解

下圖是STM32ADC的結構框圖,我們將其劃分為7個部分進行講解。

0122430e-71b9-11eb-8b86-12bb97331649.png

1、輸入電壓范圍

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

0163dfee-71b9-11eb-8b86-12bb97331649.png

2、輸入通道

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

3、轉換通道

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

規則通道

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

注入通道

注入通道是相對于規則通道的,注入通道可以在規則通道轉換時,強行插入轉換,相當于一個“中斷通道”吧。當有注入通道需要轉換時,規則通道的轉換會停止,優先執行注入通道的轉換,當注入通道的轉換執行完畢后,再回到之前規則通道進行轉換。最多4個通道,注入組和它的轉換順序在ADC_JSQR寄存器中選擇。注入組里轉化的總數應寫入ADC_JSQR寄存器的L[1:0]中。

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

規則通道轉換順序

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

注入通道轉換順序

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

0202410c-71b9-11eb-8b86-12bb97331649.png

需要注意的是,只有當JL=4的時候,注入通道的轉換順序才會按照JSQ1、JSQ2、JSQ3、JSQ4的順序執行。當JL《4時,注入通道的轉換順序恰恰相反,也就是執行順序為:JSQ4、JSQ3、JSQ2、JSQ1。

配置轉換順序的函數

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

04觸發源

ADC轉換的輸入、通道、轉換順序都已經說明了,但ADC轉換是怎么觸發的呢?就像通信協議一樣,都要規定一個起始信號才能傳輸信息,ADC也需要一個觸發信號來實行模/數轉換。

其一就是通過直接配置寄存器觸發,通過配置控制寄存器CR2的ADON位,寫1時開始轉換,寫0時停止轉換。在程序運行過程中只要調用庫函數,將CR2寄存器的ADON位置1就可以進行轉換,比較好理解。

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

05轉換周期

可獨立設置各通道采樣時間

ADC會在數個ADCCLK周期內對輸入電壓進行采樣,可使用ADC_SMPR1和ADC_SMPR2

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

總轉換時間的計算公式如下:

Tconv=采樣時間+12個周期

示例:

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

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

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

06數據寄存器

轉換完成后的數據就存放在數據寄存器中,但數據的存放也分為規則通道轉換數據和注入通道轉換數據的。

規則數據寄存器

規則數據寄存器負責存放規則通道轉換的數據,通過32位寄存器ADC_DR來存放。

注入數據寄存器

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

07中斷

可以產生4種中斷

0236aadc-71b9-11eb-8b86-12bb97331649.png

DMA溢出中斷

當配置了DMA,且DMA溢出時產生中斷

②規則通道轉換完成中斷

規則通道數據轉換完成之后,可以產生一個中斷,可以在中斷函數中讀取規則數據寄存器的值。這也是單通道時讀取數據的一種方法。

③注入通道轉換完成中斷

注入通道數據轉換完成之后,可以產生一個中斷,并且也可以在中斷中讀取注入數據寄存器的值,達到讀取數據的作用。

④模擬看門狗事件

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

08電壓轉換

轉換后的數據是一個12位的二進制數,我們需要把這個二進制數代表的模擬量(電壓)用數字表示出來。比如測量的電壓范圍是0~3.3V,轉換后的二進制數是x,因為12位ADC在轉換時將電壓的范圍大小(也就是3.3)分為4096(2^12)份,所以轉換后的二進制數x代表的真實電壓的計算方法就是:

y=3.3* x / 4096

09電路圖設計

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

02862152-71b9-11eb-8b86-12bb97331649.png

10代碼設計

ADC_Resolution:ADC 工作模式選擇,ADC分辨率ADC_ScanConvMode:ADC 掃描(多通道)或者單次(單通道)模式選擇ADC_ContinuousConvMode:ADC 單次轉換或者連續轉換選擇ADC_ExternalTrigConvEdge:ADC 外部觸發極性配置ADC_ExternalTrigConv:ADC 轉換觸發信號選擇ADC_DataAlign:ADC 數據寄存器對齊格式ADC_NbrOfConversion:ADC轉換通道數目

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

ADC_CommonInitTypeDef用來配置ADC_CCR寄存器的相關參數ADC外設和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);}

原文標題:STM32 ADC詳解

文章出處:【微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • adc
    adc
    +關注

    關注

    98

    文章

    6501

    瀏覽量

    544742
  • STM32
    +關注

    關注

    2270

    文章

    10901

    瀏覽量

    356196

原文標題:STM32 ADC詳解

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ADC高速采樣電路設計詳解STM32踩坑

    一、踩坑過程 最近用STM32F334做數字電源,用到了高速ADC采集電壓電流。設計的參考電壓VREF為3.3V,輸入信號經運放跟隨后直接接入單片機的采樣通道。一開始測試一切正常,但隨著輸入信號
    的頭像 發表于 12-02 09:27 ?741次閱讀
    <b class='flag-5'>ADC</b>高速采樣電路設計<b class='flag-5'>詳解</b>之<b class='flag-5'>STM32</b>踩坑

    十幾種格力空調故障代碼詳解

    十幾種格力空調故障代碼詳解,查表一目了然
    發表于 11-27 15:15 ?0次下載

    STM32ADC采樣及各式濾波算法實現

    本文為手把手教學ADC采樣及各式濾波算法的教程,本教程的MCU采用STM32F103ZET6。以HAL庫的ADC采樣函數為基礎進行教學,通過各式常見濾波的實驗結果進行分析對比,搭配VOFA+工具直觀的展示濾波效果。
    的頭像 發表于 10-28 10:51 ?2297次閱讀
    <b class='flag-5'>STM32</b>的<b class='flag-5'>ADC</b>采樣及各式濾波算法實現

    基于機智云移植STM32L496G代碼移植

    代碼詳解-機智云(gizwits.com)在移植的過程中遇到的一些問題,這里我將重構一下,大致內容跟文檔差不多,但是根據文檔的操作,會產生一些奇怪的報錯,這里可以根
    的頭像 發表于 09-20 08:05 ?431次閱讀
    基于機智云移植<b class='flag-5'>STM32</b>L496G<b class='flag-5'>代碼</b>移植

    第12章-ADC采集電壓和顯示 基于STM32ADC—電壓采集(詳細講解+HAL庫)

    第12章-ADC采集電壓和顯示 基于STM32ADC—電壓采集(詳細講解+HAL庫)
    的頭像 發表于 08-21 16:31 ?2609次閱讀
    第12章-<b class='flag-5'>ADC</b>采集電壓和顯示 基于<b class='flag-5'>STM32</b>的<b class='flag-5'>ADC</b>—電壓采集(詳細講解+HAL庫)

    STM32F103VE ADC采樣正弦波,程序阻塞如何處理?

    開發環境為keil uvsion3 v3.9 程序運行到cr4_fft_1024_stm32( X_out[0],adcin[0], 1024);就阻塞住了。 cr4_fft_1024_stm32
    發表于 05-15 07:23

    ADC的采樣定理 ADC的采樣過程詳解

    想要保證ADC的性能能夠發揮出來,在做ADC硬件設計的時候,需要注意一些事項。
    的頭像 發表于 05-13 18:05 ?7136次閱讀
    <b class='flag-5'>ADC</b>的采樣定理 <b class='flag-5'>ADC</b>的采樣過程<b class='flag-5'>詳解</b>

    STM32如何確定ADC的時鐘頻率?

    想請教一個STM32的AD問題:如何確定ADC的時鐘頻率(信號的采用頻率)? 首先:STM32手冊給出的 t=1.5,7.5,...239.5 是采樣保持的時間,對吧,再加上12.5個周期的純轉換
    發表于 04-23 07:52

    使用CubeMX生成STM32F103C8T6的DMA ADC代碼為什么無效?

    請問各位,我使用CubeMX生成STM32F103C8T6的DMA ADC代碼,工程配置請看附件,我運行如下代碼為什么無效: /* USER CODE BEGIN Includes
    發表于 03-29 06:08

    關于STM32 DMAMUX模塊具體的應用示例代碼

    有人通過公眾號微信留言,詢問是否有關于STM32 DMAMUX模塊具體的應用示例代碼。同時,個人也發現,雖然STM32片內的DMAMUX不是什么新模塊,似乎還是很多人并不太熟悉。這里借機聊聊這方面的內容,重點演示相關功能的實現,
    的頭像 發表于 03-25 09:15 ?2448次閱讀
    關于<b class='flag-5'>STM32</b> DMAMUX模塊具體的應用示例<b class='flag-5'>代碼</b>

    STM32G070_ADC如何設置參考電壓?

    STM32G070_ADC請教如何設置 參考電壓 Stm32CubeMx沒有設置參考電壓選項 HAL庫代碼里,也找了沒有對應的 比如設置參考電壓 為1.2V 或3V 請教如何設置?
    發表于 03-21 06:45

    調試STM32U575的ADC驅動,從單驅動調試OK情況下移植至業務代碼中出現ADC校準超時的原因?

    目前在調試STM32U575的ADC驅動,系統時鐘及ADC初始化接口相同,但是從單驅動調試OK情況下移植至業務代碼中出現ADC校準超時,有知
    發表于 03-18 07:03

    使用STM32H743-ADC設置PLL2為時鐘源為什么開啟不了?

    我使用stm32H743生成代碼,只使用一個ADC單通道來采集數據,時鐘設置如下所示 生成代碼之后,增加了輪詢模式和中斷模式,然后將它下載到如下所示的開發板(
    發表于 03-12 08:30

    基于STM32片內信號的ADC應用演示案例

    很多STM32芯片里往往內置了專用的ADC通道,比方用來測量Vrefint,VBAT的分壓或溫度傳感器的輸出電壓信號。
    的頭像 發表于 01-13 13:42 ?3602次閱讀
    基于<b class='flag-5'>STM32</b>片內信號的<b class='flag-5'>ADC</b>應用演示案例

    STM32ADC中斷的使用注意事項和優化建議

    STM32ADC中斷的使用注意事項和優化建議 STM32ADC(模擬數字轉換器)是STMicroelectronics開發的一款用于外部模擬信號轉換為數字信號的器件。在使用STM32ADC時,合理地
    的頭像 發表于 01-12 15:17 ?3462次閱讀
    主站蜘蛛池模板: 一本久道视频无线视频| 午夜天堂AV久久久噜噜噜| 男人网站在线观看| 亚洲国产成人精品无码区5566| 草莓视频免费在线观看| 伦理片在线线看手机版| 一个人免费视频在线观看高清版 | 越南美女内射BBWXZ| 九九热伊人| 亚洲综合AV在线在线播放| 国内精品伊人久久久影院| 亚洲 欧美 国产 综合五月天| 国产精品丰满人妻AV麻豆| 叔叔 电影完整版免费观看韩国| 成人在线不卡视频| 色色色999| 国产精品久久久久久久人人看| 偷窥欧美wc经典tv| 国产一区二区内射最近更新| 亚洲国产精品高清在线| 九色PORNY蝌蚪视频首页| 在线亚洲黄色| 免费视频久久只有精品| s8sp视频高清在线播放| 三级在线网址| 国产人妻人伦精品98| 亚洲午夜福利未满十八勿进| 久久精选视频| 99麻豆精品国产人妻无码| 日本人添下面的全过程| 国产热久久精| 影音先锋男人资源813.| 年轻的女职工在线观看| 丰满少妇69激懒啪啪无码| 亚洲 欧美 国产 综合 在线| 久久欧洲AV无码精品色午夜麻豆| 91亚洲 欧美 国产 制服 动漫| 让男人玩尿道的女人| 国产人成高清在线视频99| 在线视频一区二区三区在线播放| 啪啪后入内射日韩|