一.ADC的基礎(chǔ)概念
1.什么是ADC
① ADC全稱為Analog-to-Digital Converter,中文名稱為模數(shù)轉(zhuǎn)換器。ADC是一種將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)的電路設(shè)備,它在電子系統(tǒng)中扮演著非常重要的角色。
② 模擬信號(hào)是以連續(xù)的方式變化的信號(hào),例如聲音、溫度等,而數(shù)字信號(hào)是以離散的方式表示的信號(hào),它是由“0”和“1”兩種狀態(tài)組成。ADC將模擬信號(hào)的大小和時(shí)間上的連續(xù)性轉(zhuǎn)化為數(shù)字信號(hào)來進(jìn)行處理,因此在很多電子系統(tǒng)中都需要使用ADC。
③ ADC通常由四個(gè)主要部分組成:采樣、量化、編碼和輸出緩沖。采樣部分將連續(xù)的模擬信號(hào)轉(zhuǎn)換成離散的信號(hào),量化部分將離散的信號(hào)轉(zhuǎn)換成具有固定間隔的數(shù)字化電信號(hào),編碼部分將固定間隔的數(shù)字化電信號(hào)轉(zhuǎn)化為可存儲(chǔ)、傳輸和處理的二進(jìn)制形式,輸出緩沖區(qū)將數(shù)字信號(hào)放大并存儲(chǔ)在輸出端口,便于外部電路讀取。
④ ADC的精度通常通過量化位數(shù)來表示。量化位數(shù)越高,ADC的精度和分辨率會(huì)越好,但相應(yīng)的芯片價(jià)格和功耗也會(huì)越高。不同的電子系統(tǒng)需要使用不同精度的ADC來滿足需要。
⑤ 總之,ADC是電子系統(tǒng)中重要的基礎(chǔ)組成部分,它將模擬信號(hào)轉(zhuǎn)化為對(duì)數(shù)字信號(hào),實(shí)現(xiàn)了從現(xiàn)實(shí)世界到數(shù)字世界的轉(zhuǎn)換,為數(shù)字電路的應(yīng)用提供了可能。
作用:將模擬信號(hào)轉(zhuǎn)換為數(shù)字信息
轉(zhuǎn)換過程:采樣–>量化–>編碼–>輸出緩沖
2.在單片機(jī)中我們一般使用ADC技術(shù)來做什么?
① 在單片機(jī)中,我們使用ADC技術(shù)來實(shí)現(xiàn)模擬量的數(shù)字化采集。
② 單片機(jī)內(nèi)部集成有ADC模塊,我們可以通過配置單片機(jī)的寄存器操作,將外部的模擬信號(hào)輸入到ADC輸入端口,ADC會(huì)將其轉(zhuǎn)換成數(shù)字信號(hào),并將結(jié)果保存在特定的寄存器中。通過讀取這些寄存器的值,我們就可以得到正在測量的模擬量的數(shù)字化值。
③ 單片機(jī)中常使用ADC技術(shù)的應(yīng)用包括溫度和濕度測量、光強(qiáng)度檢測、電壓和電流測量、電池電量測量等。在這些應(yīng)用中,ADC會(huì)將模擬量信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),然后通過單片機(jī)內(nèi)部的處理器進(jìn)行處理、分析、存儲(chǔ)等操作,實(shí)現(xiàn)各種不同的智能化應(yīng)用。
3.怎么查看單片機(jī)的某一個(gè)引腳是否具有ADC功能
單片機(jī)的某一個(gè)引腳是否具有該ADC功能,需要結(jié)合數(shù)據(jù)手冊(cè)進(jìn)行查詢,一般查詢芯片數(shù)據(jù)手冊(cè)中的Table 5. Medium-density STM32F103xx pin definitions 表格,下圖是STM32F103xx芯片的引腳信息表截圖。
4.ADC采集和引腳數(shù)據(jù)的讀取有什么區(qū)別
ADC采集和引腳數(shù)據(jù)的讀取有以下幾個(gè)不同之處:
① 采集方式不同:ADC采集是通過ADC模塊對(duì)模擬信號(hào)的采樣和轉(zhuǎn)換,而引腳數(shù)據(jù)的讀取是通過直接讀取引腳的電平狀態(tài)來獲取數(shù)字信號(hào)。
② 數(shù)據(jù)類型不同:ADC采集的結(jié)果是模擬信號(hào)的數(shù)字化結(jié)果,通常是一個(gè)整型數(shù)值(例如10位的ADC采集結(jié)果就是一個(gè)0-1023的整數(shù)),而引腳數(shù)據(jù)的讀取是數(shù)字信號(hào)(高電平和低電平)。
③ 精度不同:ADC采集的精度和分辨率通常比引腳數(shù)據(jù)的讀取要高。ADC的精度和分辨率通常是通過芯片的參數(shù)來限定的,在一定的參考電壓下,可以實(shí)現(xiàn)更高的精度和分辨率。而引腳數(shù)據(jù)的讀取通常只能讀取到高電平和低電平兩種狀態(tài),精度比ADC低。
④ 用途不同:ADC主要用于模擬信號(hào)的數(shù)字化處理,通常用于傳感器采集、電壓測量等場景。而引腳數(shù)據(jù)的讀取通常用于控制IO設(shè)備、讀取開關(guān)狀態(tài)、讀取數(shù)字信號(hào)等場景。
⑤ 需要注意的是,在某些場景下,ADC采集和引腳數(shù)據(jù)的讀取是有聯(lián)系的。例如,通過ADC采集對(duì)某個(gè)傳感器的模擬信號(hào)進(jìn)行數(shù)字轉(zhuǎn)換后,將數(shù)字量作為引腳輸出,用于控制其他設(shè)備的開關(guān)狀態(tài)。在這種情況下,ADC采集和引腳數(shù)據(jù)的讀取就是相互關(guān)聯(lián)的。
5.單片機(jī)內(nèi)部采用的是數(shù)字信號(hào),為什么還要采用ADC進(jìn)行轉(zhuǎn)換
- 比如采集內(nèi)部的電源電壓
① 如果是單片機(jī)內(nèi)部信號(hào),一般情況下是不需要通過ADC進(jìn)行轉(zhuǎn)換的。對(duì)于CPU內(nèi)部的數(shù)字信號(hào),我們可以直接使用單片機(jī)提供的IO口進(jìn)行讀取,這些IO口所輸入的數(shù)字信號(hào)是可以直接被單片機(jī)內(nèi)部電路所處理的。
② 例如,單片機(jī)內(nèi)部包含一個(gè)計(jì)時(shí)器,可以通過IO口讀取計(jì)時(shí)器內(nèi)部的計(jì)數(shù)值,這個(gè)計(jì)數(shù)值就是單片機(jī)內(nèi)部的數(shù)字信號(hào),我們可以直接使用IO口進(jìn)行讀取。
③ 至于電源電壓,它雖然也在單片機(jī)內(nèi)部,但由于它是一個(gè)模擬信號(hào),需要通過ADC模塊進(jìn)行轉(zhuǎn)換后才能被單片機(jī)識(shí)別和處理。注意,這里需要測量的是單片機(jī)內(nèi)部電源電壓,而不是單片機(jī)外部電源電壓。對(duì)于單片機(jī)外部電源電壓,需要借助外部的模擬信號(hào)采集電路,通過ADC模塊進(jìn)行轉(zhuǎn)換。
④ 對(duì)于單片機(jī)內(nèi)部的電源電壓,可以通過單片機(jī)內(nèi)部的ADC模塊進(jìn)行采集,但是采集到的數(shù)據(jù)也需要進(jìn)行轉(zhuǎn)換才能得到實(shí)際電壓值。因?yàn)閱纹瑱C(jī)內(nèi)部的ADC模塊采集到的是數(shù)值結(jié)果,而不是電壓值。
⑤ 一般來說,需要通過額外的硬件電路,如光電耦合器或電壓傳感器等,將電源電壓轉(zhuǎn)換成模擬信號(hào)進(jìn)行采集,然后再經(jīng)過ADC模塊進(jìn)行數(shù)字化處理。這樣可以得到實(shí)際的電壓值,以便進(jìn)行后續(xù)的計(jì)算和控制。
- 電壓采集采樣電路設(shè)計(jì)
你可以通過這篇博文(https://blog.csdn.net/weixin_42090940/article/details/102615898) 進(jìn)行學(xué)習(xí)。
6.ADC的分類
- ADC的分類
ADC根據(jù)不同的工作原理和使用場景,可以分為以下幾類:
1.逐次逼近型ADC:
逐次逼近型ADC是一種常見的、精度較高的ADC。它從最高位開始逼近,逐一比較,并根據(jù)比較結(jié)果不斷逼近所測量的數(shù)字量。這種ADC常用于需要高精度的應(yīng)用,如儀器、傳感器和電路控制等領(lǐng)域。
2.積分型ADC:
積分型ADC利用了信號(hào)積分的特性,將模擬信號(hào)分別積分和放電,并根據(jù)放電時(shí)間和模擬電壓之間的關(guān)系,計(jì)算出模擬信號(hào)的值。這種ADC通常用于需要高速且精確的應(yīng)用領(lǐng)域,如高速數(shù)據(jù)采集和聲音處理等。
3.單比較器型ADC:
單比較器型ADC具有簡單設(shè)計(jì)和低功耗的優(yōu)點(diǎn)。它通過對(duì)參考電壓和輸入信號(hào)的比較,確定比較器的輸出來得到模擬信號(hào)的值。它通常應(yīng)用于低精度的電路,如電池電壓檢測等。
4.脈沖編碼型ADC:
脈沖編碼型ADC將模擬信號(hào)編碼成脈沖信號(hào),并通過對(duì)脈沖信號(hào)的計(jì)數(shù)得到數(shù)字信號(hào)的值。這種ADC通常用于高速和低功耗的應(yīng)用領(lǐng)域,如視頻和圖像處理,還可以用于移動(dòng)設(shè)備和智能手表等小型電子產(chǎn)品的應(yīng)用。
以上是ADC的一些常見分類,不同類型的ADC適用于不同的應(yīng)用場景,同時(shí),不同類型的ADC在精度、功耗、速度和價(jià)格等方面也有差異。
- 在單片機(jī)中ADC一般采用哪一種類型
① 在單片機(jī)中,ADC一般采用逐次逼近型ADC或單比較器型ADC。逐次逼近型ADC可以提供較高的精度,而單比較器型ADC則具有簡單和低功耗的優(yōu)點(diǎn)。
② 其中,逐次逼近型ADC通常比較精確,通過比較ADC的輸出和參考電壓大小,確定位值輸出。由于逐次逼近算法每次只確定一位比特,所以需要多次多次逼進(jìn),速度較慢。但由于現(xiàn)有的MCU一般都有硬件支持,因此程序也比較容易實(shí)現(xiàn)。
③ 單比較器型ADC是一種常見的低精度ADC,它采用單個(gè)比較器對(duì)參考電壓和輸入信號(hào)進(jìn)行比較。它通常具有低功耗、體積小、成本低等優(yōu)點(diǎn),能夠滿足一些功耗要求較低、精度要求不高的應(yīng)用場景。然而,由于單比較器型ADC的輸出是一個(gè)開關(guān)量,其精度不如逐次逼近型ADC,不過它在一些應(yīng)用中也顯得更加實(shí)用,如電池電壓檢測等。
④ 綜上所述,單片機(jī)的ADC根據(jù)不同的應(yīng)用場景而選擇逐次逼近型ADC或單比較器型ADC,以滿足不同的精度、速度、功耗和成本要求。
- STM32F103系列的單片機(jī)的ADC采用什么類型的ADC
STM32F103系列的單片機(jī)內(nèi)置了12位逐次逼近型模數(shù)轉(zhuǎn)換器(ADC),可采用單獨(dú)或多路擴(kuò)展模式進(jìn)行采樣轉(zhuǎn)換。該ADC采用的是逐次逼近型ADC。該型號(hào)的ADC最大采樣速率為1Msps,具有多通道采樣功能和多種觸發(fā)方式,可滿足不同的應(yīng)用要求。此外,STM32F103系列單片機(jī)的ADC支持內(nèi)部參考電壓和外部參考電壓,以及DMA和中斷方式進(jìn)行數(shù)據(jù)傳輸。因此在使用STM32F103系列單片機(jī)進(jìn)行模擬量采集時(shí),可以采用其內(nèi)置的逐次逼近型ADC來實(shí)現(xiàn)對(duì)模擬信號(hào)的高精度采樣。
- 怎么查詢ADC的類型
在STM32參考手冊(cè)中,模擬、數(shù)字轉(zhuǎn)換(ADC)章節(jié)中有介紹,如下:
7.ADC的工作原理
ADC(Analog-to-Digital Converter)是模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)的電子元件,其工作原理可簡單概括為:將模擬信號(hào)經(jīng)過采樣、量化和編碼等步驟轉(zhuǎn)換成數(shù)字信號(hào)。
- 采樣
將模擬信號(hào)按照一定的時(shí)間間隔進(jìn)行采樣,根據(jù)采樣定理,采樣頻率要大于2倍的信號(hào)最大頻率。
- 量化
采樣得到的模擬信號(hào)數(shù)值是連續(xù)的,為了轉(zhuǎn)換成數(shù)字信號(hào),需要將其離散化。量化過程會(huì)將連續(xù)的模擬信號(hào)轉(zhuǎn)換成離散的數(shù)字信號(hào),通常使用ADC內(nèi)部的比較器,將輸入的模擬信號(hào)與一些固定電壓進(jìn)行比較,并據(jù)此確定該信號(hào)在固定時(shí)刻內(nèi)的大小區(qū)間。上圖和這部分的知識(shí)可以參照這篇知乎文章:https://www.zhihu.com/tardis/zm/art/462841831?source_id=1005
- 編碼
編碼是將量化后的數(shù)字信號(hào)轉(zhuǎn)換成二進(jìn)制數(shù)。通常使用的是逐次逼近法,即將每個(gè)定時(shí)段后,兩個(gè)可能的數(shù)字中選其中的一個(gè),將數(shù)字信號(hào)由連續(xù)變量轉(zhuǎn)化為離散變量。 ADC根據(jù)輸入模擬量信號(hào)的量化值大小,通過電路控制二進(jìn)制加法器的級(jí)數(shù)來實(shí)現(xiàn)逐次逼近法。
你可以通過B站上的https://www.bilibili.com/video/BV1LN4y1g7yt/ 這個(gè)視頻了解什么是逐次逼近法:
- 輸出
經(jīng)過采樣、量化和編碼后,ADC輸出的是一串二進(jìn)制代碼,該代碼代表著輸入模擬信號(hào)的數(shù)字化結(jié)果。這些數(shù)字化結(jié)果可以通過接口(如SPI、I2C、USART等)輸出到其他外設(shè)進(jìn)行進(jìn)一步處理和存儲(chǔ)。
需要注意的是,ADC的轉(zhuǎn)換精度與采樣率有關(guān),通常轉(zhuǎn)換精度越高(比如12位、16位),采樣率越高,ADC的精度和靈敏度也就越高,但相應(yīng)的功耗和轉(zhuǎn)換時(shí)間也會(huì)增加。
8.ADC的參數(shù)
ADC是一個(gè)重要的電子元器件,通常需要考慮以下幾個(gè)參數(shù):
分辨率:ADC轉(zhuǎn)換的數(shù)字值的位數(shù),常用的有8位、10位、12位、16位等,分辨率越高,精度越高,但轉(zhuǎn)換速度會(huì)受到影響。
采樣率:ADC采樣的頻率,指ADC每秒可以對(duì)輸入信號(hào)進(jìn)行多少次采樣,采樣率越高,轉(zhuǎn)換出來的信息將更接近原始信號(hào),但轉(zhuǎn)換時(shí)間也會(huì)增加。
靈敏度:指在不同電平的輸入下,ADC在輸出端所能夠分辨的最小量化單位,也稱為LSB(最小可測量值),其值取決于ADC的分辨率。
輸入電壓范圍:ADC能夠轉(zhuǎn)換的模擬信號(hào)的電壓范圍,超出輸入電壓范圍的模擬信號(hào)將導(dǎo)致ADC失真。
信噪比(SNR)和總諧波失真(THD):反映ADC在轉(zhuǎn)換過程中的精度和噪聲抗干擾能力,SNR越高,轉(zhuǎn)換精度越高,THD越低,輸出信號(hào)越干凈。
功耗:ADC在工作時(shí)所消耗的電功率,功耗越低,對(duì)于需要長時(shí)間運(yùn)行的應(yīng)用更為適用。
模式:有單次采樣模式、均值模式、峰值模式等,不同模式適用于不同的應(yīng)用場景。
綜上所述,選擇ADC時(shí)需要根據(jù)不同的應(yīng)用場景和要求選取適當(dāng)?shù)姆直媛?、采樣率、輸入電壓范圍、信噪比等參?shù)。
二.DAC的基礎(chǔ)知識(shí)
1.什么是DAC
① DAC是數(shù)字模擬轉(zhuǎn)換器(Digital-to-Analog Converter)的縮寫,是一種電子元件或集成電路,用于將數(shù)字信號(hào)轉(zhuǎn)換為對(duì)應(yīng)的模擬電壓或電流輸出。它將數(shù)字信號(hào)中每一個(gè)離散的數(shù)值轉(zhuǎn)換為對(duì)應(yīng)的連續(xù)的模擬信號(hào),以便于驅(qū)動(dòng)模擬電路或外設(shè)等。
② 通常情況下,數(shù)字信號(hào)是由微處理器、單片機(jī)、DSP等數(shù)字電路產(chǎn)生的,其信號(hào)取值范圍是固定的、離散的、量化的,在某些應(yīng)用中需要將這些數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào),如音頻信號(hào)處理、溫度控制等領(lǐng)域。因此,DAC作為一種重要的數(shù)字與模擬接口,廣泛應(yīng)用于各種電子產(chǎn)品中,包括音頻設(shè)備、儀表、通信設(shè)備、工業(yè)控制系統(tǒng)和汽車電子等。
2.在單片機(jī)中我們一般使用DAC技術(shù)來做什么?
在單片機(jī)中,DAC技術(shù)主要用于將數(shù)字信號(hào)轉(zhuǎn)換成模擬信號(hào),以驅(qū)動(dòng)各種需要模擬輸入信號(hào)的電路或設(shè)備。常見的應(yīng)用包括:
1.音頻處理:DAC被廣泛應(yīng)用于音頻領(lǐng)域,如音效處理、音量控制、音頻合成等。單片機(jī)通過DAC輸出模擬信號(hào),驅(qū)動(dòng)揚(yáng)聲器或耳機(jī)等音頻輸出設(shè)備。
2.電壓輸出:DAC也可以被用來控制電源以及其它需要模擬輸入電壓的設(shè)備,如電機(jī)驅(qū)動(dòng)、熱敏電阻溫度采集、LED亮度調(diào)節(jié)控制等。
3.模擬信號(hào)控制:例如模擬表盤、電流表、電壓表等。單片機(jī)通過DAC輸出模擬信號(hào),驅(qū)動(dòng)模擬表頭指針。
總之,DAC是單片機(jī)中重要的模擬輸出方式之一,可以提供準(zhǔn)確、穩(wěn)定的模擬輸出信號(hào),使單片機(jī)能夠與模擬電路或外設(shè)連貫無縫地進(jìn)行數(shù)據(jù)交互。
3.怎么看單片機(jī)的某一個(gè)引腳是否具有ADC功能
下圖以STM32F103的數(shù)據(jù)手冊(cè)為例,在Full compatibility throughout the family中就列出了相關(guān)DAC情況。其中STM32F103xx系列中,低密度型號(hào)設(shè)備和中低密度型號(hào)設(shè)備都不具備DAC功能。
4.PWM和DAC的區(qū)別
① PWM代表脈沖寬度調(diào)制,DAC代表數(shù)字到模擬轉(zhuǎn)換。這兩種技術(shù)在控制電路中常被用于產(chǎn)生模擬信號(hào)。
② PWM是一種數(shù)字信號(hào),它通過不同占空比的脈沖信號(hào)來模擬產(chǎn)生一個(gè)模擬信號(hào)。PWM的輸出信號(hào)包含一個(gè)高電平時(shí)間和一個(gè)低電平時(shí)間,通過這兩個(gè)時(shí)間的比例來控制輸出電壓的大小。由于PWM信號(hào)是數(shù)字信號(hào),所以它通常需要通過低通濾波器來去除高頻噪聲,生成一個(gè)平滑的模擬信號(hào)。
③ DAC是將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)的過程。它將數(shù)字信號(hào)的離散取值轉(zhuǎn)化為連續(xù)的模擬信號(hào)。DAC通常具有比較高的精度和分辨率,可以產(chǎn)生高質(zhì)量的模擬信號(hào)。
④ 因此,PWM和DAC都可以產(chǎn)生模擬信號(hào),但它們的原理和應(yīng)用場景略有不同。PWM通常用于控制設(shè)備,例如馬達(dá)或LED燈的亮度調(diào)節(jié)。而DAC通常用于音頻、視頻和其他需要高質(zhì)量模擬信號(hào)的應(yīng)用中。
5.DAC的工作原理
DAC(數(shù)字模擬轉(zhuǎn)換器)的作用是將數(shù)字信號(hào)轉(zhuǎn)換成相應(yīng)的模擬信號(hào),它是數(shù)字信號(hào)處理中最常用的模擬輸出設(shè)備之一。DAC的工作原理可以簡單地描述為以下幾個(gè)步驟:
- 輸入數(shù)字信號(hào):首先,將一個(gè)數(shù)字信號(hào)(如二進(jìn)制代碼)輸入到DAC芯片中。
- 數(shù)字到模擬轉(zhuǎn)換:通過DAC芯片內(nèi)部的電路,在數(shù)字信號(hào)和模擬信號(hào)之間建立了一個(gè)映射關(guān)系,將數(shù)字信號(hào)轉(zhuǎn)換成相應(yīng)的模擬信號(hào)。這個(gè)過程主要涉及到DAC芯片內(nèi)部的參考電壓、比較器和開關(guān)電路等模塊,以實(shí)現(xiàn)模擬信號(hào)輸出的穩(wěn)定性和準(zhǔn)確性。
- 輸出模擬信號(hào):最后,DAC芯片將模擬信號(hào)輸出到DAC的輸出端口上,供外部電路使用。
需要注意的是,DAC的轉(zhuǎn)換速度和精度取決于DAC芯片的設(shè)計(jì)和工作電路的特性。因此,在實(shí)際應(yīng)用中,需要根據(jù)具體需求選擇合適的DAC芯片,并正確設(shè)計(jì)和使用電路,以保證模擬信號(hào)輸出的準(zhǔn)確性和可靠性。
6.DAC的參數(shù)
DAC(數(shù)字模擬轉(zhuǎn)換器)的參數(shù)包括以下幾個(gè)方面:
-
分辨率(Resolution):分辨率是指DAC可以輸出的模擬電壓值的細(xì)節(jié)程度,通常用比特?cái)?shù)(bits)表示,也就是能夠?qū)?shù)字信號(hào)精確轉(zhuǎn)換為多少級(jí)的模擬電壓。例如,一個(gè)12位的DAC可以將數(shù)字信號(hào)精確轉(zhuǎn)換為2^12=4096個(gè)模擬電壓級(jí)別。
-
采樣速率(Sampling Rate):采樣速率是指DAC每秒鐘可以進(jìn)行多少次數(shù)字到模擬的轉(zhuǎn)換,通常用赫茲(Hz)表示。采樣速率越高,輸出的模擬信號(hào)就越精確。
-
轉(zhuǎn)換精度(Accuracy):轉(zhuǎn)換精度是指DAC將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)時(shí)的精確度。通常用百分比的形式來表示,例如0.1%。轉(zhuǎn)換精度越高,輸出的模擬信號(hào)就越準(zhǔn)確。
-
DNL(差分非線性度):DNL是描述DAC輸出非線性誤差的指標(biāo),它反映了DAC相鄰碼之間的偏差是否均勻。如果DNL小于1 LSB(最低有效位),則認(rèn)為DAC的性能較好。
-
INL(積分非線性度):INL是一種衡量DAC非線性誤差的指標(biāo),它反映了所有碼之間的偏差是否均勻。如果INL小于1 LSB,也認(rèn)為DAC的性能較好。
-
輸出電壓范圍(Output Voltage Range):輸出電壓范圍是指DAC可以輸出的模擬電壓的最大值和最小值之間的差值。通常用伏特(V)表示。
-
供電電源(Power Supply):DAC需要一個(gè)合適的供電電源來工作,需要在應(yīng)用中選擇合適的供電電源。
-
功耗(Power Consumption):DAC的功耗越低,對(duì)于應(yīng)用來說就越省電。
-
封裝類型(Package Type):DAC的封裝類型有多種,選擇合適的封裝類型可以方便應(yīng)用的設(shè)計(jì)和安裝。
以上幾個(gè)參數(shù)可以幫助用戶選擇合適的DAC芯片,并滿足應(yīng)用需求。
三.代碼實(shí)例
下面的實(shí)例代碼是我寫的某個(gè)項(xiàng)目中ADC部分的代碼,該項(xiàng)目使用了DMA來實(shí)現(xiàn)同步數(shù)據(jù)采集,至于怎么通過STM32來編寫ADC采集代碼就不做講解了,你可以通過這篇博文進(jìn)行了解https://blog.csdn.net/weixin_44636409/article/details/118678500。
- 原理圖
文章來源:http://www.zghlxwxcb.cn/news/detail-542895.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-542895.html
- adc.h
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"
void Adc_Init(void);
u16 Get_Adc_SoilMoisture();
u16 Get_Adc_WaterDepth();
#endif
- adc.c
#include "adc.h"
#include "delay.h"
#include "usart.h"
#include "math.h"
__IO uint32_t ADC_convered[1]={0}; // ADC2不存在DMA,所以只需要一個(gè)1空間即可;ADC2采用高16位,土壤濕度;ADC1采用低16位,水位深度
static void ADC_GPIO_CONFIG(void)// IO口的初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE ); //使能GPIOB通道時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE ); //使能GPIOA通道時(shí)鐘
// PA0的GPIO配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// PB1的GPIO配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
static void ADC_MODE_CONFIG(void)// 配置ADC的模式
{
// 開啟時(shí)鐘
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);// DMA1時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);// ADC1和ADC2時(shí)鐘
// ADC和DMA的結(jié)構(gòu)體
ADC_InitTypeDef ADC_InitStruct;
DMA_InitTypeDef DMA_InitStructure;
// 配置DMA
DMA_DeInit(DMA1_Channel1);// 重置DMA1(復(fù)位)
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1->DR));// 外設(shè)地址(數(shù)據(jù)源地址)
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_convered;// 存儲(chǔ)器地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;// 外設(shè)到存儲(chǔ)器
DMA_InitStructure.DMA_BufferSize = 1;// 緩存區(qū)大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 外設(shè)地址是否遞增(否)
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 存儲(chǔ)器地址是否遞增(否)
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; // 外設(shè)大小(1字=32位)
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; // 存儲(chǔ)器大小(1字=32位)
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循環(huán)傳輸模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;// DMA傳輸優(yōu)先級(jí)(高)
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;// 禁止存儲(chǔ)器到存儲(chǔ)器
DMA_Init(DMA1_Channel1, &DMA_InitStructure);// 初始化DMA
DMA_Cmd(DMA1_Channel1, ENABLE);// 使能DMA通道
// 配置ADC1
ADC_InitStruct.ADC_Mode = ADC_Mode_RegSimult; // 采用規(guī)則同步模式
ADC_InitStruct.ADC_ScanConvMode = DISABLE; // 不啟用掃描模式(只有一個(gè)不需要掃描)
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; // 啟用連續(xù)轉(zhuǎn)換
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 啟動(dòng)方式不采用中斷方式
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;// 數(shù)據(jù)對(duì)齊方式采用右對(duì)齊
ADC_InitStruct.ADC_NbrOfChannel = 1; // 轉(zhuǎn)換通道數(shù)量:1
ADC_Init(ADC1,&ADC_InitStruct);// 初始化ADC
// 配置ADC時(shí)鐘N狿CLK2的8分頻,即9MHz
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
// 配置ADC 通道的轉(zhuǎn)換順序和采樣時(shí)間
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
// 使能ADC DMA請(qǐng)求
ADC_DMACmd(ADC1, ENABLE);
// 配置ADC2
ADC_InitStruct.ADC_Mode = ADC_Mode_RegSimult; // 采用規(guī)則同步模式
ADC_InitStruct.ADC_ScanConvMode = DISABLE; // 不啟用掃描模式(只有一個(gè)不需要掃描)
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; // 啟用連續(xù)轉(zhuǎn)換
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 啟動(dòng)方式不采用中斷方式
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;// 數(shù)據(jù)對(duì)齊方式采用右對(duì)齊
ADC_InitStruct.ADC_NbrOfChannel = 1; // 轉(zhuǎn)換通道數(shù)量:1
ADC_Init(ADC2,&ADC_InitStruct);// 初始化ADC
// 配置ADC時(shí)鐘N狿CLK2的8分頻,即9MHz
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
// 配置ADC 通道的轉(zhuǎn)換順序和采樣時(shí)間
ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 1, ADC_SampleTime_239Cycles5);
/* 使能ADCx_2的外部觸發(fā)轉(zhuǎn)換 */
ADC_ExternalTrigConvCmd(ADC2, ENABLE);
/**** ADC1校驗(yàn) ****/
// 開啟ADC ,并開始轉(zhuǎn)換
ADC_Cmd(ADC1, ENABLE);
// 初始化ADC 校準(zhǔn)寄存器
ADC_ResetCalibration(ADC1);
// 等待校準(zhǔn)寄存器初始化完成
while(ADC_GetResetCalibrationStatus(ADC1));
// ADC開始校準(zhǔn)
ADC_StartCalibration(ADC1);
// 等待校準(zhǔn)完成
while(ADC_GetCalibrationStatus(ADC1));
/**** ADC2校驗(yàn) ****/
// 開啟ADC ,并開始轉(zhuǎn)換
ADC_Cmd(ADC2, ENABLE);
// 初始化ADC 校準(zhǔn)寄存器
ADC_ResetCalibration(ADC2);
// 等待校準(zhǔn)寄存器初始化完成
while(ADC_GetResetCalibrationStatus(ADC2));
// ADC開始校準(zhǔn)
ADC_StartCalibration(ADC2);
// 等待校準(zhǔn)完成
while(ADC_GetCalibrationStatus(ADC2));
// 由于沒有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換 (ADC2采用的外部觸發(fā))
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
void Adc_Init()// 初始化Adc
{
ADC_GPIO_CONFIG();
ADC_MODE_CONFIG();
}
u16 Get_Adc_SoilMoisture() //獲取土壤濕度的數(shù)據(jù)并返回給主函數(shù)
{
uint16_t temp = (ADC_convered[0] & 0xFFFF0000) >> 16; // 高16位數(shù)據(jù),這是ADC2的轉(zhuǎn)換數(shù)據(jù)
UsartPrintf(USART1,"adc1=%d",((ADC_convered[0] & 0xFFFF0000) >> 16));
float result = (4095-(float)temp)/(4095-1948)*100;
return result >=100? 100:result;//(M_max-adcx)/(M_max-M_min)*100
}
u16 Get_Adc_WaterDepth(){ //獲取水位傳感器的數(shù)據(jù)并返回給主函數(shù)
uint16_t temp = (ADC_convered[0] & 0xFFFF);
if(temp<= 3){
return 0;
}else{
// 說明有值
float tempValue = (float)temp/3.5;//GetAdc=2300/x = 250 ;250x=2300;x=2300/661
u16 temp2 = (exp(0.0056*tempValue));//0.0056*tempValue = 3.7;tempValue=3.7/0.0056=661
UsartPrintf(USART1,"waterdepth=%d;GetAdc(0)=%d;tempValue=%.1f",temp2,temp,tempValue);
return temp2;
}
}
- main.c
#include "adc.h"
int waterDepth = 0; //光照度
int soilMoisture = 0;// 土壤濕度
int main(){
// 初始化ADC
Adc_Init();
while(1){
// 獲取土壤濕度
soilMoisture = Get_Adc_SoilMoisture();
// 獲取水位
waterDepth = Get_Adc_WaterDepth();
// 延時(shí)...
}
return 0;
}
到了這里,關(guān)于零死角玩轉(zhuǎn)stm32中級(jí)篇4-ADC和DAC的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!