STM32F1xx官方資料:
《STM32中文參考手冊V10》-第12章 數(shù)字模擬轉(zhuǎn)換DAC
DAC的基本介紹
DAC的基本定義
Digital-to-Analog Converter的縮寫。指數(shù)/模轉(zhuǎn)換器或者數(shù)字/模擬轉(zhuǎn)換器。是指將離散的數(shù)字信號(hào)轉(zhuǎn)換為連續(xù)變量的模擬信號(hào)的器件。
典型的數(shù)字模擬轉(zhuǎn)換器將表示一定比例電壓值的數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)。
STM32的DAC模塊是12位數(shù)字輸入,電壓輸出型的DAC。
DAC的主要特征
2個(gè)DAC轉(zhuǎn)換器:每個(gè)轉(zhuǎn)換器對應(yīng)1個(gè)輸出通道;
8位或者12位單調(diào)輸出;
12位模式下數(shù)據(jù)左對齊或者右對齊;
同步更新功能;
噪聲波形生成;
三角波形生成;
雙DAC通道同時(shí)或者分別轉(zhuǎn)換;
每個(gè)通道都有DMA功能;
外部觸發(fā)轉(zhuǎn)換;
輸入?yún)⒖茧妷篤REF+。
DAC的工作原理
DAC的工作框圖
DAC模塊的框圖看起來比較復(fù)雜,接下來會(huì)一點(diǎn)一點(diǎn)地對它進(jìn)行分析。
DAC引腳
在框圖的四圍是DAC的各個(gè)引腳,它們的名稱、信號(hào)類型和作用見下圖:
這里需要注意的是:STM32F103ZET6一共只有兩個(gè)DAC_OUTx引腳,分別為DAC_OUT1(PA4)、DAC_OUT2(PA5)。并且在做DAC功能的時(shí)候,引腳GPIO模式應(yīng)該是模擬輸入!??!
為什么要使用模擬輸入模式呢?因?yàn)橐坏┦鼓蹹ACx通道后,相應(yīng)的GPIO引腳(PA4或者PA5)會(huì)自動(dòng)與DAC的模擬輸出相連,設(shè)置為輸入,是為了額外額外的干擾。
DAC轉(zhuǎn)換
由框圖可以看出,DAC受DORx寄存器直接控制的,但是不能直接往DORx寄存器寫入數(shù)據(jù),而是通過DHRx間接地傳給DORx寄存器,實(shí)現(xiàn)對DAC的輸出控制。
不能直接對寄存器DAC_DORx寫入數(shù)據(jù),任何輸出到DAC通道x的數(shù)據(jù)都必須寫入DAC_DHRx寄存器(數(shù)據(jù)實(shí)際寫入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者DAC_DHR12RD寄存器)。
如果沒有選中硬件觸發(fā)(寄存器DAC_CR1的TENx位置0),存入寄存器DAC_DHRx的數(shù)據(jù)會(huì)在一個(gè)APB1時(shí)鐘周期后自動(dòng)傳至寄存器DAC_DORx;
如果選中硬件觸發(fā)(寄存器DAC_CR1的TENx位置1),數(shù)據(jù)傳輸在觸發(fā)發(fā)生以后3個(gè)APB1時(shí)鐘周期后完成。
一旦數(shù)據(jù)從DAC_DHRx寄存器裝入DAC_DORx寄存器,在經(jīng)過時(shí)間tSETTLING之后,輸出即有效,這段時(shí)間的長短依電源電壓和模擬輸出負(fù)載的不同會(huì)有所變化。
DAC數(shù)據(jù)格式
根據(jù)上面可知,數(shù)據(jù)寫入DAC_DHRx寄存器,然而實(shí)際上DAC_DHRx一共有6個(gè)寄存器!這是為什么呢?這就和DAC數(shù)據(jù)格式有很大的關(guān)系了。
根據(jù)選擇的配置模式,數(shù)據(jù)按照下文所述寫入指定的寄存器:
單DAC通道x,有3種情況:
8位數(shù)據(jù)右對齊:用戶須將數(shù)據(jù)寫入寄存器DAC_DHR8Rx[7:0]位(實(shí)際是存入寄存器DHRx[11:4]位);
12位數(shù)據(jù)左對齊:用戶須將數(shù)據(jù)寫入寄存器DAC_DHR12Lx[15:4]位(實(shí)際是存入寄存器DHRx[11:0]位);
12位數(shù)據(jù)右對齊:用戶須將數(shù)據(jù)寫入寄存器DAC_DHR12Rx[11:0]位(實(shí)際是存入寄存器DHRx[11:0]位)。
一般采用第三種方式:12位數(shù)據(jù)右對齊比較多。
根據(jù)對DAC_DHRyyyx寄存器的操作,經(jīng)過相應(yīng)的移位后,寫入的數(shù)據(jù)被轉(zhuǎn)存到DHRx寄存器中(DHRx是內(nèi)部的數(shù)據(jù)保存寄存器x)。隨后,DHRx寄存器的內(nèi)容或被自動(dòng)地傳送到DORx寄存器,或通過軟件觸發(fā)或外部事件觸發(fā)被傳送到DORx寄存器。
雙DAC通道,有3種情況:
8位數(shù)據(jù)右對齊:用戶須將DAC通道1數(shù)據(jù)寫入寄存器DAC_DHR8RD[7:0]位(實(shí)際是存入寄存器DHR1[11:4]位),將DAC通道2數(shù)據(jù)寫入寄存器DAC_DHR8RD[15:8]位(實(shí)際是存入寄存器DHR2[11:4]位);
12位數(shù)據(jù)左對齊:用戶須將DAC通道1數(shù)據(jù)寫入寄存器DAC_DHR12LD[15:4]位(實(shí)際是存入寄存器DHR1[11:0]位),將DAC通道2數(shù)據(jù)寫入寄存器DAC_DHR12LD[31:20]位(實(shí)際是存入寄存器DHR2[11:0]位);
12位數(shù)據(jù)右對齊:用戶須將DAC通道1數(shù)據(jù)寫入寄存器DAC_DHR12RD[11:0]位(實(shí)際是存入寄存器DHR1[11:0]位),將DAC通道2數(shù)據(jù)寫入寄存器DAC_DHR12RD[27:16]位(實(shí)際是存入寄存器DHR2[11:0]位)。
選擇DAC觸發(fā)
在框圖的左上方,是指DAC轉(zhuǎn)換可以由某外部事件觸發(fā)(定時(shí)器計(jì)數(shù)器、外部中斷線)。配置控制位TSELx[2:0]可以選擇8個(gè)觸發(fā)事件之一觸發(fā)DAC轉(zhuǎn)換。具體的外部觸發(fā)的種類如下圖所示:
DAC輸出電壓
當(dāng)DAC的參考電壓位VREF+的時(shí)候,數(shù)字輸入經(jīng)過DAC被線性地轉(zhuǎn)換為模擬電壓輸出,其范圍為0到VREF+。
任一DAC通道引腳上的輸出電壓滿足下面的關(guān)系:
DAC輸出 = VREF x (DOR / 4095)。
注意:此時(shí)數(shù)據(jù)格式:應(yīng)該選擇12位數(shù)據(jù)右對齊。
使能DAC輸出緩存
DAC集成了2個(gè)輸出緩存,可以用來減少輸出阻抗,無需外部運(yùn)放即可直接驅(qū)動(dòng)外部負(fù)載。每個(gè)DAC通道輸出緩存可以通過設(shè)置DAC_CR寄存器的BOFFx位來使能或者關(guān)閉。
但是,如果STM32的DAC輸出緩存使能的話,雖然輸出能力強(qiáng)一點(diǎn),但是輸出沒有辦法減到0,所以一般都不使用這個(gè)功能。
DAC相關(guān)配置寄存器
DAC控制寄存器(DAC_CR)
作用:配置DAC通道使能、觸發(fā)使能、輸出緩存、噪聲輸出使能、三角波輸出使能。
DAC軟件觸發(fā)寄存器(DAC_SWTRIGR)
作用:配置DAC通道軟件觸發(fā)使能。
DAC通道數(shù)據(jù)保持寄存器(DAC_DHRxRx)
DAC通道1的12位右對齊數(shù)據(jù)保持寄存器(DAC_DHR12R1)
DAC通道1的12位左對齊數(shù)據(jù)保持寄存器(DAC_DHR12L1)
DAC通道1的8位右對齊數(shù)據(jù)保持寄存器(DAC_DHR8R1)
除了DAC通道1,還有DAC通道2的對應(yīng)的三個(gè)數(shù)據(jù)保持寄存器。
DAC數(shù)據(jù)輸出寄存器(DAC_DORx)
DAC通道1數(shù)據(jù)輸出寄存器(DAC_DOR1)
除了DAC通道1,還有DAC通道2的對應(yīng)的數(shù)據(jù)輸出寄存器。
DAC相關(guān)配置庫函數(shù)
1個(gè)初始化函數(shù)
void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct);
作用:配置外部觸發(fā)的方式、噪聲波生成、三角波生成、輸出緩存。
1個(gè)使能函數(shù)
void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState);
作用:配置DAC某個(gè)通道使能。
3個(gè)輸出值函數(shù)
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data);
void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data);
uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel);
作用:前兩個(gè)向各自通道以某種對齊方式放入數(shù)值,第三個(gè)獲得某個(gè)通道輸出的數(shù)值。
DAC一般步驟
實(shí)驗(yàn)?zāi)繕?biāo):利用按鍵控制STM32內(nèi)部DAC的通道1來輸出電壓,同時(shí)通過ADC1的通道1采集DAC的輸出電壓。
開啟輸出引腳、DAC時(shí)鐘,設(shè)置為模擬輸入。調(diào)用函數(shù):RCC_APBxPeriphClockCmd();
初始化DAC,設(shè)置DAC的工作模式。調(diào)用函數(shù):DAC_Init();
使能DAC轉(zhuǎn)換通道。調(diào)用函數(shù):DAC_Cmd();
設(shè)置DAC的輸出值。調(diào)用函數(shù):DAC_SetChannelxData()。
下面按照這個(gè)一般步驟來進(jìn)行一個(gè)簡單的DAC程序:
//DAC通道1輸出初始化
void Dac1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能PORTA通道時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //使能DAC通道時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_4) ;//PA.4 輸出高
DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用觸發(fā)功能 TEN1=0
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形發(fā)生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值設(shè)置
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1輸出緩存關(guān)閉 BOFF1=1
DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化DAC通道1
DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右對齊數(shù)據(jù)格式設(shè)置DAC值
}
//設(shè)置通道1輸出電壓
//vol:0~3300,代表0~3.3V
void Dac1_Set_Vol(u16 vol)
{
float temp=vol;
temp/=1000;
temp=temp*4096/3.3;
DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右對齊數(shù)據(jù)格式設(shè)置DAC值
}
int main(void)
{
u16 adcx;
float temp;
u8 t=0;
u16 dacval=0;
u8 key;
delay_init(); //延時(shí)函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級(jí)分組為組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
uart_init(115200); //串口初始化為115200
KEY_Init(); //初始化按鍵程序
LED_Init(); //LED端口初始化
LCD_Init(); //LCD初始化
usmart_dev.init(72); //初始化USMART
Adc_Init(); //ADC初始化
Dac1_Init(); //DAC初始化
POINT_COLOR=RED;//設(shè)置字體為紅色
LCD_ShowString(60,50,200,16,16,"WarShip STM32");
LCD_ShowString(60,70,200,16,16,"DAC TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2015/1/15");
LCD_ShowString(60,130,200,16,16,"WK_UP:+ KEY1:-");
//顯示提示信息
POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
LCD_ShowString(60,150,200,16,16,"DAC VAL:");
LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");
LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");
DAC_SetChannel1Data(DAC_Align_12b_R, 0);//初始值為0
while(1)
{
t++;
key=KEY_Scan(0);
if(key==WKUP_PRES)
{
if(dacval<4000)dacval+=200;
DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//設(shè)置DAC值
}else if(key==KEY1_PRES)
{
if(dacval>200)dacval-=200;
else dacval=0;
DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//設(shè)置DAC值
}
if(t==10||key==KEY1_PRES||key==WKUP_PRES) //WKUP/KEY1按下了,或者定時(shí)時(shí)間到了
{
adcx=DAC_GetDataOutputValue(DAC_Channel_1);//讀取前面設(shè)置DAC的值
LCD_ShowxNum(124,150,adcx,4,16,0); //顯示DAC寄存器值
temp=(float)adcx*(3.3/4096); //得到DAC電壓值
adcx=temp;
LCD_ShowxNum(124,170,temp,1,16,0); //顯示電壓值整數(shù)部分
temp-=adcx;
temp*=1000;
LCD_ShowxNum(140,170,temp,3,16,0X80); //顯示電壓值的小數(shù)部分
adcx=Get_Adc_Average(ADC_Channel_1,10); //得到ADC轉(zhuǎn)換值
temp=(float)adcx*(3.3/4096); //得到ADC電壓值
adcx=temp;
LCD_ShowxNum(124,190,temp,1,16,0); //顯示電壓值整數(shù)部分
temp-=adcx;
temp*=1000;
LCD_ShowxNum(140,190,temp,3,16,0X80); //顯示電壓值的小數(shù)部分
LED0=!LED0;
t=0;
}
delay_ms(10);
}
}
上一篇:【STM32】PWM DAC基本原理(實(shí)驗(yàn):PWM實(shí)現(xiàn)DAC)
下一篇:【STM32】ADC庫函數(shù)、一般步驟詳解 實(shí)例:內(nèi)部溫度傳感器
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 2025研華智能系統(tǒng)產(chǎn)業(yè)伙伴峰會(huì)成功舉辦
- 意法半導(dǎo)體公布2025年第二季度財(cái)報(bào)和電話會(huì)議時(shí)間安排
- 利用人工智能提升車間生產(chǎn)效率
- 方案分享 | ARXML 規(guī)則下 ECU 總線通訊與 ADTF 測試方案
- 車載SerDes產(chǎn)業(yè)起飛!國產(chǎn)新品密集炸場
- 出貨量激增1.34倍! 5G車規(guī)模組成標(biāo)配,三大廠商新品同臺(tái)競技
- 6月新能源市場:零跑創(chuàng)新高;比亞迪海外突破;理想滑坡
- 基于中科芯車規(guī)MCU的LED矩陣大燈應(yīng)用方案
- 蘋果被判侵犯3G專利,需向西班牙公司TOT賠償1.1億美元
- 從設(shè)計(jì)概念到 FPGA 原型僅需數(shù)分鐘,印度 InCore 完成 SoC Generator 平臺(tái)硅驗(yàn)證
- 報(bào)名參會(huì)三重禮 | 西門子車用半導(dǎo)體全棧解決方案直播
- 談?wù)勡囈?guī)級(jí)FRAM和德國品質(zhì)的裸眼3D視頻技術(shù)
- EEWorld邀你來拆解(第7期)——拆拆減肥利器,看看跳繩里都有什么
- 免費(fèi)領(lǐng)取|射頻年度大會(huì)EDI CON VIP全場通票(注冊到場100%中獎(jiǎng)?。?/a>
- 是德科技服務(wù)日研討會(huì)|武漢站——邀請函
- 【ST直播】MEMS傳感器開發(fā)套件簡介、了解內(nèi)嵌“有限狀態(tài)機(jī)和機(jī)器學(xué)習(xí)內(nèi)核”的傳感器
- 有獎(jiǎng)直播 | 是德科技信號(hào)完整性測試的演變和更新
- Fluke高分辨率熱像儀~小細(xì)節(jié)也不放過!免費(fèi)體驗(yàn)報(bào)名中
- USB Tybe-C 知識(shí)大考問
- 有獎(jiǎng)直播 | 德州儀器 C2000™ 系列培訓(xùn)會(huì)
- 研發(fā)智能機(jī)器人大腦,「思靈機(jī)器人」完成pre-A輪融資
- 光刻機(jī)領(lǐng)域王者ASML研發(fā)新代機(jī)型,2025年1納米工藝可期
- 未來,一個(gè)芯片搞定導(dǎo)航?
- 《蜘蛛俠:英雄遠(yuǎn)征》看了嗎?這次小蜘蛛的對手竟是它!
- 燕東微北京8英寸項(xiàng)目又將搬入多臺(tái)北方華創(chuàng)設(shè)備
- 雷軍:紅米Note7 Pro/紅米7、黑鯊游戲手機(jī)2同發(fā)布
- Palm超mini安卓手機(jī)電池殼上架
- 一加7保護(hù)殼渲染圖:彈出式前攝,后置三攝
- 機(jī)器人Pepper正在變革銀行業(yè)務(wù)
- 我國工業(yè)機(jī)器人迅速增長 深度融入制造業(yè)