一、概念
模數(shù)轉(zhuǎn)換器(ADC):它將模擬信號轉(zhuǎn)換為單片機(jī)能夠處理的數(shù)字信號。在很多應(yīng)用中,比如溫度傳感器、壓力傳感器等,信號最初都是模擬形式的。ADC 讀取這些模擬信號,然后將它們轉(zhuǎn)換為數(shù)字形式,以便單片機(jī)可以讀取和處理。
數(shù)模轉(zhuǎn)換器(DAC):它執(zhí)行相反的操作,將數(shù)字信號轉(zhuǎn)換為模擬信號。這在需要控制模擬設(shè)備,如音頻設(shè)備、某些類型的馬達(dá)控制器等方面非常有用。通過DAC,單片機(jī)可以產(chǎn)生精確的模擬輸出信號。
二、ADC與DAC常用的函數(shù)
1、 ADC常用的函數(shù)
1.HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc)
舉例:HAL_ADC_Start(&hadc1);
這一行啟動了句柄名為 hadc1 的ADC。HAL_ADC_Start 函數(shù)初始化ADC并開始模擬信號到數(shù)字信號的轉(zhuǎn)換過程。這里的 hadc1 是一個指向ADC實(shí)例的指針,已經(jīng)在代碼的其他部分被配置好了。
2.HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout)
舉例:HAL_ADC_PollForConversion(&hadc1, 10);
這行代碼是一個輪詢函數(shù),用來檢查ADC轉(zhuǎn)換是否完成。它檢查ADC的EOC(End of Conversion)標(biāo)志,以確定轉(zhuǎn)換是否完成。參數(shù) 10 表示超時時間,單位為毫秒。如果在10毫秒內(nèi)轉(zhuǎn)換沒有完成,這個函數(shù)將返回一個超時錯誤。
3.uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc)
舉例:adc = HAL_ADC_GetValue(&hadc1);
這行代碼從 hadc1指向的ADC獲取轉(zhuǎn)換結(jié)果,并將其存儲在變量 adc 中。HAL_ADC_GetValue 函數(shù)讀取ADC的數(shù)據(jù)寄存器,并返回轉(zhuǎn)換后的數(shù)字值。
2、 DAC常用的函數(shù)
1.HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel)
舉例:HAL_DAC_Start(&hdac1, DAC_CHANNEL_2);
這一行是句柄為 hdac1 的 DAC 的第二個通道DAC_CHANNEL_2)。HAL_DAC_Start 函數(shù)激活 DAC,并準(zhǔn)備它開始輸出模擬信號。這里的 hdac1 是指向 DAC 實(shí)例的指針,即句柄。
2.HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data)
舉例:HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_2,DAC_ALIGN_12B_R,temp);
這行代碼設(shè)置 DAC 通道2的輸出值。HAL_DAC_SetValue 函數(shù)用于配置 DAC 輸出的具體電壓值,它需要幾個參數(shù): &hdac1:指向 DAC 實(shí)例的指針。DAC_CHANNEL_2:指定操作的是哪個 DAC 通道。DAC_ALIGN_12B_R:指定數(shù)據(jù)對齊式,這里是 12 位右對齊。temp:決定了 DAC 輸出的模擬信號的具體電壓,這個值通常是經(jīng)過計(jì)算或從某個來源獲取的,DAC 會將這個數(shù)字值轉(zhuǎn)換為相應(yīng)的模擬電壓值!
三、LED官方原理圖
R37——AD1——PC15 (PC15控制AD1)
R38——AD2——PC12 (PC12控制AD2)
四、配置STM32cubeMX
1、ADC配置
1.將PB12配置為ADC2_IN11,將PB15配置為ADC2_IN15
(配置PB15為ADC2_IN15意味著將微控制器的物理引腳PB15設(shè)置為模數(shù)轉(zhuǎn)換器(ADC)2的輸入通道15。這里的配置過程通常涉及到幾個關(guān)鍵步驟和概念,我將逐一解釋:引腳命名:在STM32微控制器中,引腳通常以“P”開頭,后跟一個字母(表示引腳所在的組,如A、B、C等)和一個數(shù)字(表示組內(nèi)的特定引腳編號)。因此,PB15指的是B組的第15號引腳。ADC2_IN15:這表示ADC2的輸入通道15。STM32的ADC模塊可以有多個輸入通道,用于從不同的物理引腳接收模擬信號。在這種情況下,“ADC2”指的是微控制器上的第二個ADC模塊,“IN15”則是該模塊的第15個輸入通道。配置過程:在STM32的開發(fā)環(huán)境中,如STM32CubeMX或直接編寫代碼,你需要將PB15引腳配置為ADC2的輸入。這通常涉及到選擇PB15作為ADC2的輸入源,并設(shè)置相關(guān)參數(shù),如采樣時間、工作模式等。用途:將PB15配置為ADC2_IN15通常是為了從這個引腳讀取模擬信號。這意味著可以將一個模擬傳感器(如溫度、壓力或光傳感器)連接到PB15,然后通過ADC2將其模擬信號轉(zhuǎn)換為微控制器可以處理的數(shù)字信號。實(shí)際應(yīng)用:在實(shí)際應(yīng)用中,這樣的配置允許微控制器讀取外部環(huán)境的模擬數(shù)據(jù),例如環(huán)境溫度、光強(qiáng)度或其他物理量。這對于制作各種嵌入式系統(tǒng)和物聯(lián)網(wǎng)設(shè)備至關(guān)重要??傊渲肞B15為ADC2_IN15是一種將STM32微控制器的特定引腳設(shè)置為接收模擬信號的過程,這對于實(shí)現(xiàn)多種傳感器集成和數(shù)據(jù)采集應(yīng)用至關(guān)重重要。)括號里是概念,非小白直接跳過。
注意:在這個配置中,PB15并不是直接用于讀取數(shù)字信號,而是用于接收模擬信號,然后由ADC2完成模擬到數(shù)字的轉(zhuǎn)換。
2.將ADC1中的通道11和ADC2中的通道15都配置為Single-ended
(Single-ended 模式是指模數(shù)轉(zhuǎn)換器(ADC)或類似設(shè)備在處理信號時的一種配置方式。在這種模式下,ADC測量的是單個輸入信號與地(GND,即“接地”)之間的電壓差。這是ADC配置中最基本和常見的方式。下面是一些關(guān)于 Single-ended 模式的關(guān)鍵點(diǎn):測量方法:在 Single-ended 模式中,ADC測量的是單一輸入和地之間的電壓差。這意味著,每個ADC通道都獨(dú)立地測量其輸入和系統(tǒng)接地之間的電壓。
適用場景:這種模式通常用于讀取那些提供單端輸出的傳感器,如溫度傳感器、光傳感器等。簡單高效:由于只需要測量單一信號相對于地的電壓,這種模式設(shè)計(jì)起來相對簡單,不需要復(fù)雜的電路或校準(zhǔn)過程。信號完整性:對于許多低頻和中頻應(yīng)用,Single-ended 輸入提供了足夠的信號完整性。雖然它可能不如差分輸入(另一種模式,測量兩個不同信號之間的電壓差)那樣能有效抑制噪聲,但對于許多應(yīng)用而言已經(jīng)足夠。資源使用:在資源受限的系統(tǒng)中,使用 Single-ended 模式可以更有效地利用ADC資源,因?yàn)樗恍枰鄠€物理通道來測量單一的信號??傊谠S多嵌入式系統(tǒng)和微控制器應(yīng)用中,Single-ended 模式提供了一個簡單、高效且足夠精確的解決方案,尤其是在資源受限或設(shè)計(jì)簡單性是關(guān)鍵考慮因素的情況下。)括號里是概念,非小白直接跳過。
2、DAC配置
1.將PA7配置為ADC2_IN4模式,將PA5配置為DAC1_OUT2模式,將PB15取消配置。
為什么需要將PB15取消配置?
剛剛在ADC的配置過程中將PB15配置為ADC2_IN15,這樣ADC2有兩個采集通道就會有沖突! ADC每次只能采集一個通道,如果需要同一個ADC采集多個通道,就需要變換通道。即:對另外的通道進(jìn)行初始化。本例中不需要這么復(fù)雜,只需要一個ADC采集一個通道,所以將PB15取消配置。
(配置PB5為DAC1_OUT2在STM32微控制器的環(huán)境中意味著將PB5引腳設(shè)置為數(shù)字模擬轉(zhuǎn)換器(DAC)1的第二個輸出通道(OUT2)。這里的配置涉及到幾個重要的步驟和概念:引腳命名:這個在DAC的時候已經(jīng)講過。DAC1_OUT2:這表示DAC1(數(shù)字模擬轉(zhuǎn)換器1)的第二個輸出通道。STM32的DAC模塊通常有多個輸出通道,可用于將數(shù)字信號轉(zhuǎn)換為模擬信號。在這種情況下,“DAC1”指的是微控制器上的第一個DAC模塊,“OUT2”則是該模塊的第二個輸出通道。配置過程:在STM32的開發(fā)環(huán)境中,如STM32CubeMX或直接編寫代碼,你需要將PB5引腳配置為DAC1的輸出。這通常涉及到選擇PB5作為DAC1的輸出源,并設(shè)置相關(guān)參數(shù),如輸出電壓范圍、輸出模式等。用途:將PB5配置為DAC1_OUT2通常是為了從這個引腳輸出模擬信號。這意味著可以通過編程控制DAC1,將數(shù)字信號轉(zhuǎn)換為模擬信號,并通過PB5引腳輸出。這對于控制模擬設(shè)備,如音頻設(shè)備、某些類型的馬達(dá)或燈光系統(tǒng)等是非常有用的。實(shí)際應(yīng)用:在實(shí)際應(yīng)用中,這樣的配置允許微控制器生成精確的模擬輸出,可以用于各種控制和信號處理應(yīng)用,如生成音頻信號、控制模擬傳感器等。總之,配置PB5為DAC1_OUT2是一種將STM32微控制器的特定引腳設(shè)置為輸出模擬信號的過程,這對于實(shí)現(xiàn)數(shù)字信號到模擬信號的轉(zhuǎn)換和對外部模擬設(shè)備的控制至關(guān)重要。)括號里是概念,非小白直接跳過。
2.將DAC1配置為"Connected to external pin only" 模式
(在使用 STM32CubeMX 配置 STM32 微控制器的 DAC(數(shù)字模擬轉(zhuǎn)換器)時,選擇 “Connected to external pin only” 的選項(xiàng)通常是基于以下原因:直接輸出:選擇 “Connected to external pin only” 表明 DAC 的輸出將直接連接到微控制器的一個外部引腳。這允許DAC產(chǎn)生的模擬信號能夠直接輸出到微控制器外部,以驅(qū)動外部設(shè)備或系統(tǒng),如音頻設(shè)備、電機(jī)控制器等。硬件簡化:這種配置簡化了硬件設(shè)計(jì),因?yàn)樗恍枰~外的內(nèi)部連接或復(fù)雜的電路來從DAC獲得模擬信號。它提供了一種簡單直接的方式,通過指定的引腳輸出模擬信號。易于配置和集成:在STM32CubeMX中,將DAC配置為“僅連接到外部引腳”可以使得配置過程更為直觀和簡單。用戶可以清楚地看到哪個引腳被用作DAC的輸出,這有助于在設(shè)計(jì)電路板時規(guī)劃引腳布局。適用于大多數(shù)應(yīng)用:大多數(shù)應(yīng)用中,DAC的輸出是需要傳遞到微控制器外部的。例如,生成模擬信號來控制音頻放大器或調(diào)節(jié)LED的亮度。選擇這個選項(xiàng)確保了DAC的輸出能頭被適當(dāng)?shù)乩谩p少內(nèi)部資源使用:在某些情況下,DAC還可以配置為內(nèi)部連接,比如用于內(nèi)部參考或調(diào)試。但在大多數(shù)實(shí)際應(yīng)用中,將DAC輸出限定在外部引腳可以減少微控制器內(nèi)部資源的使用,使設(shè)計(jì)更高效。
總之,選擇 “Connected to external pin only” 是為了確保DAC輸出的簡單性、直接性和高效性,滿足大多數(shù)通用應(yīng)用的需求。
)括號里是概念,非小白直接跳過。
五、ADC代碼
實(shí)驗(yàn)現(xiàn)象:使用電壓采集1中的旋轉(zhuǎn)按鈕和電壓采集2中的旋轉(zhuǎn)按鈕分別通過旋轉(zhuǎn)來控制輸出對應(yīng)的數(shù)字電壓,并將數(shù)字電壓轉(zhuǎn)換為模擬電壓顯示在屏幕上。
即:模擬電壓通過ADC變成數(shù)字電壓,數(shù)字電壓通過公式計(jì)算變成模擬電壓顯示到屏幕上。
1.在/* USER CODE BEGIN 0 /與/ USER CODE END 0 */之間增加如下代碼
float getADC_R37(void)
{
int adc = 0; //為了節(jié)省內(nèi)存,定義一個16位的整形數(shù)據(jù) 因?yàn)閍dc是個12位的adc 所以需要16位整形存放數(shù)據(jù),也可以用int,會浪費(fèi)一點(diǎn)內(nèi)存
HAL_ADC_Start(&hadc2); //開啟adc2
HAL_ADC_PollForConversion(&hadc2,10);//查詢函數(shù),查詢EOC標(biāo)志位。每次采樣,CUP在這里都要 10ms為超時時間
//等待采樣完成才能進(jìn)行下一步,這段時間CUP沒有干其他
//事,所以降低了CUP使用率
adc = HAL_ADC_GetValue(&hadc2); //獲取adc3的值賦值給定義的整形adc
//這邊有個細(xì)節(jié):我們cubemx采樣時間設(shè)為3個周期,轉(zhuǎn)換速度快但是轉(zhuǎn)換精度低
//此時我們需要在獲取adc值前加上判斷是否轉(zhuǎn)換結(jié)束的庫函數(shù),或者加個延時。否則可能adc還沒計(jì)算完就獲取數(shù)據(jù)導(dǎo)致數(shù)據(jù)不準(zhǔn)確
return adc*3.3/4096; //返回值為:adc
}
float getADC_R38(void) //定義一個子函數(shù),無入口參數(shù),返回值為整形
{
int adc = 0; //為了節(jié)省內(nèi)存,定義一個16位的整形數(shù)據(jù) 因?yàn)閍dc是個12位的adc 所以需要16位整形存放數(shù)據(jù),也可以用int,會浪費(fèi)一點(diǎn)內(nèi)存
HAL_ADC_Start(&hadc1); //開啟adc1
HAL_ADC_PollForConversion(&hadc1,10);//查詢函數(shù),查詢EOC標(biāo)志位。每次采樣,CUP在這里都要 10ms為超時時間
//等待采樣完成才能進(jìn)行下一步,這段時間CUP沒有干其他
//事,所以降低了CUP使用率
adc = HAL_ADC_GetValue(&hadc1); //獲取adc1的值賦值給定義的整形adc
//這邊有個細(xì)節(jié):我們cubemx采樣時間設(shè)為3個周期,轉(zhuǎn)換速度快但是轉(zhuǎn)換精度低
//此時我們需要在獲取adc值前加上判斷是否轉(zhuǎn)換結(jié)束的庫函數(shù),或者加個延時。否則可能adc還沒計(jì)算完就獲取數(shù)據(jù)導(dǎo)致數(shù)據(jù)不準(zhǔn)確
return adc*3.3/4096; //返回值為:adc
}
2.校準(zhǔn)
adc初始化完成后要進(jìn)行校準(zhǔn),不然達(dá)不到3.3v!?。?!
以下是校準(zhǔn)函數(shù),將其放到main.c中的int main(void)函數(shù)中
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
3.在while(1)中添加如下代碼
double value=getADC_R38();
sprintf(str,"value=%.2f",value);
LCD_DisplayStringLine(Line0, (uint8_t*)str);
如上 ADC的代碼實(shí)現(xiàn)的功能就相當(dāng)于電壓表,測量某個引腳的電壓。
六、DAC代碼以及ADC和DAC綜合
1.在/* USER CODE BEGIN 0 /與/ USER CODE END 0 */之間增加如下代碼
// DAC1電壓設(shè)置函數(shù)
void DAC1_Set_Vol(float vol)
{
int temp; // 定義電壓轉(zhuǎn)換后的數(shù)值
//將電壓轉(zhuǎn)換為數(shù)值
temp = (4096 * vol/3.3f); // 12位的DAC最大數(shù)值為4096,vol / 3.3 就是設(shè)置的電壓所占全部電壓(3.3V)的比例
//將數(shù)字信號數(shù)字值轉(zhuǎn)化為對應(yīng)的模擬信號
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2,DAC_ALIGN_12B_R,temp); // 最終的電壓設(shè)置函數(shù)
}
2.在main.c中的int main(void)函數(shù)中添加如下代碼
//初始化:
HAL_DAC_Start(&hdac1,DAC_CHANNEL_2); // 使能DAC1的通道2
DAC1_Set_Vol(2.4); // 調(diào)用DAC1設(shè)置電壓函數(shù)
3.在while(1)中添加如下代碼
double value=getADC_R37();
sprintf(str,"value=%.2f",value);
LCD_DisplayStringLine(Line0, (uint8_t*)str);
將杜邦線一端接PA5,一端接PA7。PA5(DAC)端口一直在輸出電壓,電壓為2.4v。PA7(ADC)端口是用來測電壓。文章來源:http://www.zghlxwxcb.cn/news/detail-788686.html
如果用杜邦線將PA7跟3V3連接,那么value=3.30。用杜邦線將PA7跟GND連接,value=0.00。文章來源地址http://www.zghlxwxcb.cn/news/detail-788686.html
到了這里,關(guān)于藍(lán)橋杯嵌入式STM32 G431 hal庫開發(fā)速成——ADC與DAC的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!