日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM-32-ADC模拟数字转换(AD单通道转换)

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM-32-ADC模拟数字转换(AD单通道转换) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • ADC模擬數字轉換
  • 一、ADC模擬->數字轉換
    • 1. ADC的基本介紹
    • 2. ADC的輸入通道和兩個轉換單元
    • 3.ADC的觸發源
    • 4. ADC連續轉換or單次轉換,非掃描or掃描模式
    • 5. ADC的數據對齊
    • 6. ADC的轉換時間
  • 二、ADC的配置
    • 1. RCC開啟時鐘
    • 2. 配置GPIO
    • 3. 選擇規則組或注入組的輸入通道
    • 4.配置ADC初始化
    • 5.開關控制ADC
    • 6. 開啟軟件觸發ADC
    • 7. 校準ADC
    • 8. 讀取ADC轉換后的數據
    • 測試及程序的現象
  • 三、 總結


ADC模擬數字轉換

本文主要介紹STM32ADC模擬數字轉換,對STM32中的ADC資源外設做一個總結,也算是對前期知識的一個復習,其中包括AD單通道采集,AD多通道采集。


一、ADC模擬->數字轉換

1. ADC的基本介紹

ADC可以將模擬信號轉換為數字信號,是模擬電路到數字電路的橋梁。

STM32的ADC

當ADC對I/O的引腳讀取轉換時,讀取引腳上的電壓,轉換為一個數字數據,存放在ADC->DR寄存器里。這就完成了模擬到數字的轉換。我們只需要讀取ADC-DR寄存器中的值就可以獲取到轉換后的數字。同時產生一個EOC轉換結束標志位,可以通過這個標志觸發中斷。

下圖為ADC的時序圖:可以看到,ADC轉換結束后就產生了一個ADC轉換標志位EOC。

幾個重要特征:

  • 12位連續逼近型的ADC。這里的逐次逼近型指的是ADC的工作模式。12位指的是ADC的分辨率,一般使用多少位來表示,12位AD值,對應的范圍就是0-2^12-1。即0-4095,也就是轉換為數字信號所表示的范圍。
  • 1us的轉換時間。轉換時間即為轉換的頻率,1us表示從AD轉換開始到產生結果需要花費1us的時間。
  • 輸入電壓的范圍,0-3.3v。轉換的結果為0-4095。

2. ADC的輸入通道和兩個轉換單元

  • STM32里的ADC擁有18個輸入通道,其中包括16個外部通道2個內部的信號源
    • 16個外部通道,即16個GPIO口,可以直接接模擬信號,引腳直接測量電壓。
    • 2個內部的信號源,包括內部溫度傳感器和內部參考電壓。其中內部溫度傳感器可以測量cpu的溫度。內部參考電壓是一個1.2v左右的基準電壓,不隨外部電壓的變化而變化。
  • 兩個轉換單元即為規則組和注入組兩個轉換單元
  • 16個外部通道可以在任意多個通道上以任意順序進行的一系列轉換構成成組轉換。

    • 規則組由多達16個轉換組成。即規則組的通道有16個,可以在ADC連續轉換的模式下連續轉換16個通道。這個組最為常用。

    而且通常與DMA配合使用,即ADC轉換后的數據存放在ADC->DR寄存器里,當一個通道的數據被轉換后,存放在DR寄存器里之后,上一個數據沒有被讀走,下一個數據就會覆蓋上一次的數據。這樣就導致數據的丟失。

    • 注入組有4個通道,多用于突發事件,最多為4通道。

    可以看下方的圖,即為上方講解的ADC的輸入通道和兩個轉換單元。


    3.ADC的觸發源

    ADC的觸發源,包括硬件觸發和軟件觸發

    • 軟件觸發,軟件觸發可以直接使用軟件進行觸發,即在軟件中進行使用庫函數,所以在使用軟件觸發之后,ADC就可以開始進行轉換。一般沒有特別的需求,都使用的是軟件觸發。
    • 硬件觸發,包括注入組和規則組的信號。例如定時器捕獲,外部中斷引腳來觸發,以及定時器的各個通道,還有TRGO的定時器主模式的輸出所引發的觸發信號。

    4. ADC連續轉換or單次轉換,非掃描or掃描模式

    連續轉換or單次轉換

    主要是看ADC轉換后需不需要觸發源再次觸發通道,進行ADC轉換。

    • 連續轉換,指的是一次ADC轉換結束后并不會停止,而是立即開啟下一輪的轉換,然后一直持續下去。即只需要觸發一次,之后就可以一直轉換。
    • 單次轉換,在一次ADC轉換結束后需要再次觸發,才可以繼續進行ADC轉換。

    非掃描模式or掃描模式

    • 非掃描模式,在該模式下,轉換的通道只有序列1位置有效。即只有第一個通道有效,能夠進行ADC轉換
    • 掃描模式下,序列X位置是有效的,可以直接選擇多個序列進行ADC轉換,而且在選擇通道時可以重復,即序列X可以多選,在序列中可以選擇重復的通道。

    5. ADC的數據對齊

    大家都知道,數據寄存器為16位的寄存器。而ADC是12位

    ADC轉換結束后,產生的數據就是一個十二位的數據。這樣轉換完成后保存在ADC->DR數據寄存器里的值也就是一個十二位的數據。所以就產生了數據是左對齊還是右對齊。

    • 數據左對齊ADC->DR數據寄存器十六位,即高
      位數據為轉換后的ADC數據,低四位為0
      。相應的DR就比實際的結果大十六倍。
    • 數據右對齊ADC->DR數據寄存器的低12為ADC轉換后的數據,高四位為0.對應的DR就是ADC轉換后的數據。一般使用數據右對齊。

    6. ADC的轉換時間

    ADC轉換的步驟:采樣->保持->量化->編碼

    ADC轉換的時間即在量化編碼之前設置一個采樣開關,收集外部電壓。當外部電壓被存儲好后,斷開采樣開關,再進行AD轉換。(在量化編碼的過程中,電壓始終保持不變。)

    所以打開采樣開關收集外部電壓到斷開采樣開關進行AD轉換的時間就為ADC的轉換時間。

    其中總轉換時間:TCONV = 采樣時間+ 12.5個周期

    當ADCCLK=14MHz,采樣時間為1.5周期
    TCONV = 1.5 + 12.5 = 14周期 = 1μs


    二、ADC的配置

    經過了上述部分的學習,對ADC有了一個整體的了解,下面就是如何配置ADC,寫程序來實現ADC模擬到數字的轉換。

    1. RCC開啟時鐘

    首先我們需要開啟ADC、ADC分頻時鐘ADCCLK以及選擇通道對應的GPIO。

    RCC_ADCCLKConfig(RCC_PCLK2_Div6); //6分頻RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC分頻時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //開啟GPIOA時鐘

    注意ADC對應的GPIO口要根據手冊的引腳定義圖來配置。


    2. 配置GPIO

    這里我選擇ADC1的通道6,對應的GPIO口就是GPIOA6

    這里引腳的模式要配置為模擬輸入

    GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN; //模擬輸入GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6; //GPIOA6GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct);

    3. 選擇規則組或注入組的輸入通道

    選擇規則組的輸入通道,我這里選擇的是ADC1,ADC1的通道6,采樣時鐘為55,當配置其他通道時,同理。

    //配置ADC轉換通道 選擇ADC1通道6 序列1 采樣時鐘為55ADC_RegularChannelConfig(ADC1,ADC_Channel_6,1,ADC_SampleTime_55Cycles5);

    4.配置ADC初始化

    ADC的初始化,通過ADC_Init()完成。

    我們來說說,這幾個參數

    • ADC_ContinuousConvMode,ADC是否連續轉換?可選單次轉換(DISABLE)或者連續轉換(ENABLE)。
    • ADC_DataAlign,轉換后的數據對齊方式。可選左對齊或右對齊。
    • ADC_ExternalTrigConv 是否外部觸發ADC,可選擇硬件觸發或者軟件觸發。
    • ADC_Mode,ADC的模式,我們一般使用單ADC轉換。當然也可以使用雙ADC轉換。
    • ADC_ScanConvMode,ADC是否連續掃描?ADC的連續掃描可以和DMA配合使用,效果極佳!留在下篇。
    • ADC_NbrOfChannel,指定掃描模式下會用到幾個通道。這個參數在非掃描模式下,默認是序列1。這個參數僅在掃描模式下有用。
    //ADC初始化ADC_InitTypeDef ADC_InitStruct;ADC_StructInit(&ADC_InitStruct);ADC_InitStruct.ADC_ContinuousConvMode=ENABLE; //連續轉換 否 單次轉換ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right; //右對齊ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //外部中斷否ADC_InitStruct.ADC_Mode=ADC_Mode_Independent; //單ADC觸發ADC_InitStruct.ADC_NbrOfChannel=6; //選擇ADC1的6號通道ADC_InitStruct.ADC_ScanConvMode=DISABLE; //連續掃描 否 單次掃描ADC_Init(ADC1,&ADC_InitStruct);

    5.開關控制ADC

    開啟ADC,即使能ADC

    //ADC使能ADC_Cmd(ADC1,ENABLE);

    6. 開啟軟件觸發ADC

    一般都是選擇軟件觸發ADC,這里直接使用庫函數就可以啦。

    //軟件觸發ADC ADC_SoftwareStartConvCmd(ADC1,ENABLE);

    7. 校準ADC

    校準可大幅減小因內部電容器組的變化而造成的準精度誤差

    //校準ADCADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1)==SET);ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1)==SET);

    8. 讀取ADC轉換后的數據

    當經過了上述配置,ADC讀取端口的模擬輸入,將其轉換成了數字,存放在ADC->DR寄存器內。我們只需要讀取DR寄存器,就可以知道ADC轉換的值啦。

    uint16_t AD_GetValue(void) {while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET); //規則組轉換完成標志位 EOC為RESET時 轉換未完成 EOC為空,執行空循環return ADC_GetConversionValue(ADC1); }

    測試及程序的現象

    我選擇在串口調試數據,即把轉換后的數據發送給串口助手,讀取AD轉換后的數據。

    具體使用串口有關文章可以看我上一篇:STM32-串口通信(串口的接收和發送)

    程序現象

    可以看到AD轉換后的值有波動,產生跳變。


    三、 總結

    上述就是關于ADC模擬數字轉換的相關內容,是自己學習后的一個總結

    ADC轉換的功能非常強大,使用起來也很方便

    主要明確以下幾點

    1. ADC的通道,根據引腳定義表來選擇
    2. ADC的觸發源,軟件觸發or硬件觸發
    3. ADC的模式選擇,單次轉換or連續轉換。掃描模式or非掃描模式。
    4. EOC標志位的理解

    行文倉促,如有誤,歡迎指正。

    總結

    以上是生活随笔為你收集整理的STM-32-ADC模拟数字转换(AD单通道转换)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。