目錄
一、ADC簡介
二、逐次逼近型ADC
三、ADC基本結構圖
四、規則組的四種轉換模式
五、轉換時間
對GPIO來說,它只能讀取引腳的高低電平,使用了ADC模數轉化器之后,就可以對高電平和低電平之間的任意電壓進行量化,最終用一個變量來表示,讀取這個變量,就能得到引腳輸入的具體電壓是多少了。
ADC模數轉化器就相當于一個電壓表,把引腳的電壓值測出來,放入一個變量中,這就是ADC的作用。
一、ADC簡介
模擬-數字轉換器簡稱ADC(Analog-Digital Converter),它可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量,建立模擬電路到數字電路的橋梁。
數字-模擬轉換器簡稱DAC,可以將數字變量轉化成模擬電壓,主要應用于波形生成(信號發生器、音頻解碼芯片)等。
PWM的功能與DAC相似,它只有完全導通和完全斷開兩種狀態,在這兩種狀態上都沒有功率損耗,所以在直流電機調速這種大功率的應用場景,使用PWM來等效模擬量,是比DAC更好的選擇,且PWM電路更簡單,而且更常用。
STM32中的ADC是12位逐次逼近型ADC,1us轉換時間。
ADC還有兩個關鍵參數,分別是分辨率和轉換時間(轉換頻率)。
分辨率就是用多少位來表示,這里12位,分辨率的表示范圍就是0~2^(12-1),即量化結果的范圍是0~4095,位數越高,量化結果越精細,對應分辨率就越高。
AD轉換是需要一小段時間的,這里1us表示從AD轉換開始到產生結果,需要花費1us的時間,對應AD的轉換頻率是1MHz,這個就是STM32的最快轉換頻率。
輸入電壓范圍:0~3.3V,轉換結果范圍:0~4095
輸入電壓一般要求是在芯片供電的正極和負極之間變化,輸入0-3.3V,經過AD轉換后,就得到最小值0,最大值4095,中間也都是一一對應的線性關系。
ADC模數轉換器共有16個輸入通道,可測量16個外部和2個內部信號源。
16個外部信號源就是16個GPIO口,在引腳上直接接模擬信號就可以,不需要任何額外的電路,引腳就可以測量電壓值。
兩個內部信號源分別是內部溫度傳感器和內部參考電壓。
溫度傳感器可以測量CPU的溫度,內部參考電壓是一個1.2V左右的基準電壓,這個基準電壓不會隨外部供電變化而變化,如果芯片的供電不是標準的3.3V,測量外部引腳的電壓就會錯誤,這時就可以讀取基準電壓進行校準,就能得到正確的電壓值了。
STM32F103C8T6 ADC資源:ADC1、ADC2,10個外部輸入通道,兩個內部信號源溫度傳感器和內部參考電壓都在ADC1上。
ADC12_IN0的意思是ADC1和ADC2的IN0都在PA0引腳上。
二、逐次逼近型ADC
輸入部分:給地址鎖存和譯碼一個通道的地址,就能讓通道選擇開關,選擇其中一個通道打開。
比較部分:通過電壓比較器,它可以判斷兩個輸入信號電壓的大小關系,輸出一個高低電平,指示電壓誰大誰小。它的兩個輸入端,一個是外部通道輸入未知編碼的電壓,一個是DAC輸出已知編碼的電壓,它倆同時輸入到比較器,進行大小判斷。如果DAC輸出的電壓比較大,就調小DAC數據;如果DAC輸出電壓比較小,就調大DAC數據,直到DAC輸出電壓和外部通道輸入的電壓近似相等,這樣DAC輸入的數據就是外部電壓的編碼數據了,這個電壓調節的過程就是逐次逼近寄存器SAR來完成的。
為了最快找到未知電壓的編碼,通常是采用二分法來進行查找,比如8位的ADC,那編碼就是0~255,第一次輸入時,就給255的一半128進行比較,如果DAC大了,第二次比較就給128的一半64進行比較,以此類推。這些比較數據正好是二進制的每一位位權,這個判斷過程就相當于是從高位到低位依次判斷是1還是0的過程。
三、ADC基本結構圖
左邊是輸入通道,包括16個GPIO外部輸入通道和兩個內部通道。
進入AD轉換器后,里面有兩個組,分別是規則組和注入組,規則組最多可以同時選中16個通道進行比較,但是只能轉換輸出其中一個通道內的數據,因此規則組可以配合DMA數據轉運來使用,DMA可以轉運選中的其他多個通道內的數據,防止數據被覆蓋。
注入組最多可以同時選擇4個通道進行比較,也能同時輸出4個通道內的數據到AD數據寄存器。
觸發控制提供開始轉換信號,它有軟件觸發(調用函數)和硬件觸發(定時器和外部中斷)。
上面可以布置一個模擬看門狗,用于監測轉換結果的范圍,如果超出設定的閾值,就通過中斷輸出控制,向NVIC申請中斷。
規則組和注入組轉換完成后,會有一個EOC信號,它會置一個標志位,最終也可以向NVIC申請中斷。
最后右下角還有一個開關控制,在庫函數中就是ADC_Cmd函數,用于給ADC上電。
AD初始化步驟:
(1)開啟RCC時鐘,包括ADC和GPIO;
(2)ADC的時鐘,ADCCLK需要配置一下;
(3)配置GPIO,改成輸入模式;
(4)配置多路開關,把左邊通道接入到右邊的規則組列表中;
(5)配置ADC轉換器;
(6)調用ADC_Cmd函數,開啟ADC;
(7)對ADC進行校準,來減少誤差。
四、規則組的四種轉換模式
1、單次轉換,非掃描模式
上圖列表就是規則組里能選中的通道,在非掃描模式下,這個列表只有第一個序列1的位置有效,規則組同時選中一組(16個通道)就退化為簡單地選中一個地方式了,序列1的位置可以指定想要轉換的通道,觸發后,ADC就會對這個通道2進行模數轉換,過一小段時間后,轉換結果就會放在數據寄存器中,同時給EOC標志位置1。如果需要再轉換,就得再次觸發ADC進行模數轉換。
2、連續轉換,非掃描模式
它與上一種方式的不同之處在于,在一次轉換結束之后,它的轉換不會停止,而是立刻開始下一輪的轉換,一直持續下去。
3、單次轉換,掃描模式
這里也是單次轉換,因此再每次轉換后,都會停下來,需要觸發才能開始。
這個掃描模式可以同時選擇多個通道,通道數量也是可以指定的,觸發之后,它就會依照序列號,依次對通道進行AD轉換,轉換結果都放在數據寄存器了,為了防止數據被覆蓋,需要用DMA及時將數據挪走。7個通道轉換完成后,才會產生EOC標志位置1,轉換結束。然后需要轉換,得再次觸發ADC進行模數轉換。
4、連續轉換,掃描模式
這個模式功能跟上個模式一致,就是觸發一次就會自動一直觸發,會一直連續轉換。
在掃描模式得情況下,還有一種模式,叫間斷模式,它的作用是在掃描過程中,每隔幾個轉換,就暫停一次,需要再次觸發,才能繼續。
ADC1和ADC2的外部觸發方式,其中包括定時器觸發、外部引腳觸發和軟件觸發,選擇哪種觸發方式,通過控制最右邊寄存器可以選擇對應方式。
五、轉換時間
AD轉換的步驟包括采樣保持、量化編碼兩步。
采樣保持:在量化編碼前,需要設置一個采樣開關,打開采樣開關,收集外部電壓,比如可以用一個小容量的電容存儲這個電壓,存儲好了以后,斷開采樣開關,再進行后面的量化編碼,這樣在量化編碼期間,電壓就能夠始終保持不變,這樣才能精確地定位未知電壓的位置;
采樣保持的過程中,需要閉合采樣開關,過一段時間再斷開,這里就會產生一個采樣時間。
量化編碼:是ADC逐次比較(AD模數轉換)的過程,這個需要花一段時間,位數越多,花費的時間就越長。
STM32 ADC的總轉換時間為:T_CONV = 采樣時間 + 12.5個ADC周期
采樣時間就是采樣保持花費的時間,采樣時間越大,越能避免一些毛刺信號的干擾,轉換時間也會相應延長;
12.5個ADC周期是量化編碼花費的時間,ADC是12位的,因此需要花費12個周期,這里0.5個周期是一些其他事情花費的時間。
例如:當ADCCLK=14MHz,采樣時間為1.5個ADC周期。T_CONV = 1.5 + 12.5 = 14個ADC周期?
ADC周期就是從RCC分頻過來的ADCCLK,ADCCLK最大為14MHz。
轉換時間= N個ADC周期/ADCCLK = 14/14MHz = 1us