1?ADC簡介
ADC(Analog-Digital Converter)模擬-數字轉換器
ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量,建立模擬電路到數字電路的橋梁
STM32是數字電路,只有高低電平,沒有幾V電壓的概念,想讀取電壓值,就需要借助ADC模數轉換器了。DAC則是相反的功能。
12位逐次逼近型ADC,1us轉換時間
分辨率:一般用多少位來表示,0?~ 2 ^ 12 - 1(量化結果0~4095)
轉換時間:也是轉換頻率,從轉換開始到產生結果需要花1us時間,即轉換頻率是1MHz
輸入電壓范圍:0~3.3V,轉換結果范圍:0~4095
線性對應
18個輸入通道,可測量16個外部和2個內部信號源
16個GPIO口、內部溫度傳感器(測量CPU的溫度)和內部參考電壓(1.2V的基準電壓)
規則組和注入組兩個轉換單元
模擬看門狗自動監測輸入電壓范圍
STM32F103C8T6 ADC資源:ADC1、ADC2,10個外部輸入通道
1.1?逐次逼近型ADC
ADC0809的內部結構圖,獨立的8位逐次逼近型ADC芯片。
左邊是8路輸入通道,通過通道選擇開關,選中一路,輸入到比較器前進行轉換;下面是地址鎖存和譯碼(想選中哪個通道,就把通道號放在這三個引腳上,再給一個鎖存信號,上面對應的通路開關就可以自動撥好了,相當于38譯碼器)
比較器有兩個輸入端,一個是待測電壓,另一個是DAC(數模轉換器)的電壓輸出端;如果DAC輸出的電壓比較大,就調小DAC數據;如果DAC輸出的電壓比較小,就增大DAC數據;直到DAC輸出的電壓和外部通道輸入的電壓近似相等,這樣DAC輸入的數據就是外部電壓的編碼數據了,這就是DAC的實現原理。一般使用二分法調節。
1.2?ADC框圖
具體的
有溫度傳感器、內部參考電壓,總共18個輸入通道,接到模擬多路開關,其輸出接到模數轉換器,即逐次比較,轉換結果放在數據寄存器里。
普通的的流程是:多路開關選中某一個通道,開始轉換,等待轉換完成,取出結果。
這里比較高級,可以同時選中多個,而且在轉換的時候,還分成了兩個組,規則通道組和注入通道組,其中規則組可以一次性最多選擇16個通道,注入組一次最多選擇4個通道。規則組的數據寄存器只能存儲一個結果,如果不想之前的結果被覆蓋,那在轉換完成之后,要盡快把結果拿走(使用DMA轉運數據);注入組可以存4個結果,不用擔心數據覆蓋。
左下角是觸發轉換部分,對于STM32的ADC,觸發ADC開始轉換的信號有兩種:一種是軟件觸發,程序中調用一條代碼;另一種是硬件觸發,就是這些觸發源。上面是注入組觸發源,下面是規則組觸發源。這些觸發源主要來自定時器,有定時器的各個通道,還有TRGO定時器主模式的輸出。定時器可以通向ADC、DAC這些外設,用于觸發轉換。因為ADC經常需要過一個固定的時間段轉換一次,正常的思路是:用定時器,每隔1ms申請一次中斷,在中斷里手動開始一次轉換;但是頻繁進中斷對程序是有影響的,所以對這種需要頻繁進中斷,并且在中斷里只完成簡單的工作的情況,一般都會有硬件的支持。還可以選擇外部中斷引腳來觸發轉換。
VREF+、VREF-是ADC的參考電壓,決定了ADC的輸入電壓范圍,VDDA、VSSA是ADC的供電引腳,一般情況下VREF+接VDDA,VREF-接VSSA。
右邊這里是ADCCLK是ADC的時鐘,是用于驅動內部逐次比較的時鐘,這個時鐘來自ADC的預分頻器,而ADC預分頻器來自RCC的。
模擬看門狗里面可以存儲閾值高限和閾值底限,如果指定了模擬看門狗,并且指定了看門的通道,越限之后,它就會亂叫,在上面申請一個模擬看門狗中斷,最后通向NVIC。
對于規則組和注入組,轉換完成之后,也會有一個EOC轉換完成的信號,EOC是規則組的完成信號,JEOC是注入組完成的信號,這兩個信號會在狀態寄存器里置一個標志位,讀取這個標志位就可以知道是不是轉換完成了;同時這兩個標志位也可以去到NVIC,申請中斷,如果開啟了NVIC對應的通道,它們就會觸發中斷。
1.3?ADC基本結構
左邊是輸入通道,16個GPIO口外加兩個內部通道,然后進入AD轉換器。AD轉換器里有兩個組,一個是規則組,一個是注入組,規則組最多選擇16個通道,注入組最多選擇4個通道,然后轉換的結果存在AD數據寄存器里,其中規則組只有一個數據寄存器,而注入組有4個數據寄存器。下面有觸發控制,觸發控制可以選擇軟件觸發和硬件觸發,硬件觸發主要是來自定時器,當然也可以選擇外部中斷的引腳;右邊是來自RCC的ADC時鐘CLOCK,ADC逐次比較的功能就是這個時鐘推動的。然后上面可以布置一個模擬看門狗用于檢測轉換結果的范圍,如果超出設定的閾值,就通過中斷輸出控制,向NVIC申請中斷。另外規則組和注入組完成之后會有個EOC信號,它會置一個標志位,當然也可以通向NVIC。右下角有個開關控制,在庫函數中就是ADC_Cmd,用于給ADC上電的。
1.4?輸入通道
通道 | ADC1 | ADC2 | ADC3 |
通道0 | PA0 | PA0 | PA0 |
通道1 | PA1 | PA1 | PA1 |
通道2 | PA2 | PA2 | PA2 |
通道3 | PA3 | PA3 | PA3 |
通道4 | PA4 | PA4 | PF6 |
通道5 | PA5 | PA5 | PF7 |
通道6 | PA6 | PA6 | PF8 |
通道7 | PA7 | PA7 | PF9 |
通道8 | PB0 | PB0 | PF10 |
通道9 | PB1 | PB1 | |
通道10 | PC0 | PC0 | PC0 |
通道11 | PC1 | PC1 | PC1 |
通道12 | PC2 | PC2 | PC2 |
通道13 | PC3 | PC3 | PC3 |
通道14 | PC4 | PC4 | |
通道15 | PC5 | PC5 | |
通道16 | 溫度傳感器 | ||
通道17 | 內部參考電壓 |
ADC通道和引腳復用的關系。
ADC12_IN0的意思是ADC1和ADC2的IN0都是在PA0上的。以此類推。雙ADC模式。
1.5?規則組的轉換模式
在ADC初始化中會有兩個參數,一個是選擇單次轉換還是連續轉換;另一個是掃描模式還是非掃描
1.5.1?單次轉換,非掃描模式
這個列表就是規則組里面的菜單,有16個空位。可以在這里寫入要轉換的通道,比如通道2,在非掃描的模式下,這個菜單就只有第一個序列1的位置有效。這時菜單同時選中一組的方式就退化成簡單地選中一個的方式了,在這里可以在序列1的位置指定想轉換的通道,比如通道2,然后觸發轉換,ADC就會對通道2進行模數轉換,過一小段時間后,轉換完成,轉換結果放在數據寄存器里,同時給EOC標志位置1,整個轉換過程就結束了。判斷EOC標志位來確定轉換是否完成。如果想再啟動一次轉換,那就需要再觸發一次,轉換結束,置EOC標志位,讀結果。如果想換一個通道轉換,那就在轉換之前把第一個位置的通道2改成其他通道,再啟動轉換就可以了。這就是單次轉換、非掃描的轉換模式。
1.5.2?連續轉換,非掃描模式
首先還是非掃描模式。所以菜單列表就只用第一個,然后與上一個單次轉換不同的是它在一次轉換結束后不會停止,而是立刻開始下一輪的轉換,然后一直持續下去。只觸發一次就可以轉換了。
好處是:開始轉換之后不需要等待一段時間,因為一直在轉換,所以也不需要手動開始轉換,也不用判斷是否結束,想要讀AD值的時候,直接從寄存器取就是了。
1.5.3?單次轉換,掃描模式
單次轉換,每觸發一次,轉換結束后,就會停下來。掃描模式會用到菜單列表,選擇通道,可以任意指定,可以重復,初始化結構體中有個參數指定通道數目。這里為了防止數據被覆蓋,就需要用DMA及時將數據挪走,7個通道轉換完成之后,產生EOC信號,轉換結束。再觸發下一次,開始新的轉換。
1.5.4?連續轉換,掃描模式
在上一個模式的基礎上變了,就是一次轉換完成后,立刻開始下一次轉換。
還有間斷模式,每隔幾個轉換,暫停一次需要再次觸發才能繼續。
1.6?觸發控制
這個表是規則組的觸發源,有來自定時器的信號,也有來自外部引腳/片上外設的信號,具體需要AFIO重映射。還有軟件觸發。這些觸發信號通過右邊寄存器的位來完成。
1.7?數據對齊
ADC是12位的,但是數據寄存器是16位的,因此存在一個數據對齊的問題
數據右對齊(一般是這個)
數據左對齊
有點像大端模式,小端模式
1.8?轉換時間
AD轉換的步驟:采樣,保持,量化,編碼
STM32 ADC的總轉換時間為:TCONV = 采樣時間 + 12.5個ADC周期(12位)
例如:當ADCCLK=14MHz,采樣時間為1.5個ADC周期
TCONV = 1.5 + 12.5 = 14個ADC周期 = 1μs
1.9?校準
ADC有一個內置自校準模式。校準可大幅減小因內部電容器組的變化而造成的準精度誤差。校準期間,在每個電容器上都會計算出一個誤差修正碼(數字值),這個碼用于消除在隨后的轉換中每個電容器上產生的誤差
建議在每次上電后執行一次校準
啟動校準前, ADC必須處于關電狀態超過至少兩個ADC時鐘周期
1.10?硬件電路
第一個是電位器產生一個可調的電壓,這里電位器的兩個固定端,一個接3.3,一個接GND,這樣中間的滑動端就可以輸出一個0~3.3的可調電壓輸出了。這里可以接ADC的輸入通道,比如PA0口;滑動端往上滑時,電壓增大,往下滑時,電壓減小。阻值不宜太小。
第二個是傳感器輸出電壓的電路,一般是光敏電阻、熱敏電阻、紅外接收管、麥克風等。串聯分壓,當傳感器阻值變小時,下拉作用變強,輸出端電壓就下降;反之,輸出端電壓增大。
第三個是電壓轉換電路,比如想測0~5V的VIN電壓,但是ADC只能接收0~3.3V的電壓,分壓。
手冊