DAC详解
文章目錄
- 前言
- 數字/模擬轉換(DAC)
- 一、DAC簡介
- 二、DAC主要特征
- 三、DAC功能描述
- 使能DAC通道
- 使能DAC輸出緩存
- DAC數據格式
- DAC轉換
- DAC輸出電壓
- 選擇DAC觸發
- DMA請求
- 噪聲生成
- 三角波生成
- 四、雙DAC通道轉換
- 不使用波形發生器的獨立觸發
- 使用相同LFSR的獨立觸發
- 使用不同LFSR的獨立觸發
- 產生相同三角波的獨立觸發
- 產生不同三角波的獨立觸發
- 同時軟件啟動
- 不使用波形發生器的同時觸發
- 使用相同LFSR的同時觸發
- 使用不同LFSR的同時觸發
- 使用相同三角波發生器的同時觸發
- 使用不同三角波發生器的同時觸發
- 五、DAC寄存器
- DAC控制寄存器(DAC_CR)
- DAC軟件觸發寄存器(DAC_SWTRIGR)
- DAC通道 1 的 12 位右對齊數據保持寄存器(DAC_DHR12R1)
- DAC通道 1 的 12 位左對齊數據保持寄存器(DAC_DHR12L1)
- DAC通道 1 的 8 位右對齊數據保持寄存器(DAC_DHR8R1)
- DAC通道 2 的 12 位右對齊數據保持寄存器(DAC_DHR12R2)
- DAC通道 2 的 12 位左對齊數據保持寄存器(DAC_DHR12L2)
- DAC通道 2 的 8 位右對齊數據保持寄存器(DAC_DHR8R2)
- 雙DAC的 12 位右對齊數據保持寄存器(DAC_DHR12RD)
- 雙DAC的 12 位左對齊數據保持寄存器(DAC_DHR12LD)
- 雙DAC的 8 位右對齊數據保持寄存器(DAC_DHR8RD)
- DAC通道 1 數據輸出寄存器(DAC_DOR1)
- DAC通道 2 數據輸出寄存器(DAC_DOR2)
- DAC寄存器映像
前言
數字/模擬轉換(DAC)
小容量產品是指閃存存儲器容量在16K至32K字節之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
中容量產品是指閃存存儲器容量在64K至128K字節之間的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
大容量產品是指閃存存儲器容量在256K至512K字節之間的STM32F101xx和STM32F103xx微控制器。
互聯型產品是指STM32F105xx和STM32F107xx微控制器。
本節內容只適用于大容量的STM32F101xx和STM32F103xx產品。
一、DAC簡介
數字/模擬轉換模塊(DAC)是12位數字輸入,電壓輸出的數字/模擬轉換器。DAC可以配置為8位 或12位模式,也可以與DMA控制器配合使用。DAC工作在12位模式時,數據可以設置成左對齊或右對齊。DAC模塊有2個輸出通道,每個通道都有單獨的轉換器。在雙DAC模式下,2個通道可以獨立地進行轉換,也可以同時進行轉換并同步地更新2個通道的輸出。DAC可以通過引腳輸入參考電壓VREF+以獲得更精確的轉換結果。
二、DAC主要特征
2個DAC轉換器:每個轉換器對應1個輸出通道
8位或者12位單調輸出
12位模式下數據左對齊或者右對齊
同步更新功能
噪聲波形生成
三角波形生成
雙DAC通道同時或者分別轉換
每個通道都有DMA功能
外部觸發轉換
輸入參考電壓VREF+182/754
單個DAC通道的框圖如下圖,下表給出了引腳的說明。
三、DAC功能描述
使能DAC通道
將DAC_CR寄存器的ENx位置’1’即可打開對DAC通道x的供電。經過一段啟動時間tWAKEUP,DAC通道x即被使能。
注意: ENx位只會使能DAC通道x的模擬部分,即便該位被置’0’,DAC通道x的數字部分仍然工作。
使能DAC輸出緩存
DAC集成了2個輸出緩存,可以用來減少輸出阻抗,無需外部運放即可直接驅動外部負載。每個DAC通道輸出緩存可以通過設置DAC_CR寄存器的BOFFx位來使能或者關閉。
DAC數據格式
根據選擇的配置模式,數據按照下文所述寫入指定的寄存器:
● 單DAC通道x,有3種情況:
─ 8位數據右對齊:用戶須將數據寫入寄存器DAC_DHR8Rx[7:0]位(實際是存入寄存器DHRx[11:4]位)
─ 12位數據左對齊:用戶須將數據寫入寄存器DAC_DHR12Lx[15:4]位(實際是存入寄存器DHRx[11:0]位)
─ 12位數據右對齊:用戶須將數據寫入寄存器DAC_DHR12Rx[11:0]位(實際是存入寄存器DHRx[11:0]位)
根據對DAC_DHRyyyx寄存器的操作,經過相應的移位后,寫入的數據被轉存到DHRx寄存器中(DHRx是內部的數據保存寄存器x)。隨后,DHRx寄存器的內容或被自動地傳送到DORx寄存器,或通過軟件觸發或外部事件觸發被傳送到DORx寄存器。
● 雙DAC通道,有3種情況:
─ 8位數據右對齊:用戶須將DAC通道1數據寫入寄存器DAC_DHR8RD[7:0]位(實際是存入寄存器DHR1[11:4]位),將DAC通道2數據寫入寄存器DAC_DHR8RD[15:8]位(實際是存入寄存器DHR2[11:4]位)
─ 12位數據左對齊:用戶須將DAC通道1數據寫入寄存DAC_DHR12LD[15:4]位(實際是存入寄存器DHR1[11:0]位),將DAC通道2數據寫入寄存器DAC_DHR12LD[31:20]位(實際是存入寄存器DHR2[11:0]位)
─ 12位數據右對齊:用戶須將DAC通道1數據寫入寄存DAC_DHR12RD[11:0]位(實際是存入寄存器DHR1[11:0]位),將DAC通道2數據寫入寄存器DAC_DHR12RD[27:16]位(實際是存入寄存器DHR2[11:0]位)
根據對DAC_DHRyyyD寄存器的操作,經過相應的移位后,寫入的數據被轉存到DHR1和DHR2寄存器中(DHR1和DHR2是內部的數據保存寄存器x)。隨后,DHR1和DHR2的內容或被自動地傳送到DORx寄存器,或通過軟件觸發或外部事件觸發被傳送到DORx寄存器。
DAC轉換
不能直接對寄存器DAC_DORx寫入數據,任何輸出到DAC通道x的數據都必須寫入DAC_DHRx寄存器(數據實際寫入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者DAC_DHR12RD寄存器)。如果沒有選中硬件觸發(寄存器DAC_CR1的TENx位置’0’),存入寄存器DAC_DHRx的數據會在一個APB1時鐘周期后自動傳至寄存器DAC_DORx。如果選中硬件觸發(寄存器DAC_CR1的TENx位置’1’),數據傳輸在觸發發生以后3個APB1時鐘周期后完成。一旦數據從DAC_DHRx寄存器裝入DAC_DORx寄存器,在經過時間tSETTLING之后,輸出即有效,這段時間的長短依電源電壓和模擬輸出負載的不同會有所變化。
DAC輸出電壓
數字輸入經過DAC被線性地轉換為模擬電壓輸出,其范圍為0到VREF+。
任一DAC通道引腳上的輸出電壓滿足下面的關系:
DAC輸出 = VREF x (DOR / 4095)。
選擇DAC觸發
如果TENx位被置1,DAC轉換可以由某外部事件觸發(定時器計數器、外部中斷線)。配置控制位TSELx[2:0]可以選擇8個觸發事件之一觸發DAC轉換。
每次DAC接口偵測到來自選中的定時器TRGO輸出,或者外部中斷線9的上升沿,最近存放在寄存器DAC_DHRx中的數據會被傳送到寄存器DAC_DORx中。在3個APB1時鐘周期后,寄存器DAC_DORx更新為新值。如果選擇軟件觸發,一旦SWTRIG位置’1’,轉換即開始。在數據從DAC_DHRx寄存器傳送到DAC_DORx寄存器后,SWTRIG位由硬件自動清’0’。
注意:
DMA請求
任一DAC通道都具有DMA功能。2個DMA通道可分別用于2個DAC通道的DMA請求。如果DMAENx位置’1’,一旦有外部觸發(而不是軟件觸發)發生,則產生一個DMA請求,然后DAC_DHRx寄存器的數據被傳送到DAC_DORx寄存器。在雙DAC模式下,如果2個通道的DMAENx位都為’1’,則會產生2個DMA請求。如果實際只需要一個DMA傳輸,則應只選擇其中一個DMAENx位置’1’。這樣,程序可以在只使用一個DMA請求,一個DMA通道的情況下,處理工作在雙DAC模式的2個DAC通道。DAC的DMA請求不會累計,因此如果第2個外部觸發發生在響應第1個外部觸發之前,則不能處理第2個DMA請求,也不會報告錯誤。
噪聲生成
可以利用線性反饋移位寄存器(Linear Feedback Shift Register LFSR)產生幅度變化的偽噪聲。設置WAVE[1:0]位為’01’選擇DAC噪聲生成功能。寄存器LFSR的預裝入值為0xAAA。按照特定算法,在每次觸發事件后3個APB1時鐘周期之后更新該寄存器的值。
設置DAC_CR寄存器的MAMPx[3:0]位可以屏蔽部分或者全部LFSR的數據,這樣的得到的LSFR值與DAC_DHRx的數值相加,去掉溢出位之后即被寫入DAC_DORx寄存器。如果寄存器LFSR值為0x000,則會注入’1’(防鎖定機制)。 將WAVEx[1:0]位置’0’可以復位LFSR波形的生成算法。
三角波生成
可以在DC或者緩慢變化的信號上加上一個小幅度的三角波。設置WAVEx[1:0]位為’10’選擇DAC的三角波生成功能。設置DAC_CR寄存器的MAMPx[3:0]位來選擇三角波的幅度。內部的三角波計數器每次觸發事件之后3個APB1時鐘周期后累加1。計數器的值與DAC_DHRx寄存器的數值相加并丟棄溢出位后寫入DAC_DORx寄存器。在傳入DAC_DORx寄存器的數值小于MAMP[3:0]位定義的最大幅度時,三角波計數器逐步累加。一旦達到設置的最大幅度,則計數器開始遞減,達到0后再開始累加,周而復始。將WAVEx[1:0]位置’0’可以復位三角波的生成。
四、雙DAC通道轉換
在需要2個DAC同時工作的情況下,為了更有效地利用總線帶寬,DAC集成了3個供雙DAC模式使用的寄存器:DHR8RD、DHR12RD和DHR12LD,只需要訪問一個寄存器即可完成同時驅動2個DAC通道的操作。
對于雙DAC通道轉換和這些專用寄存器,共有11種轉換模式可用。這些轉換模式在只使用一個DAC通道的情況下,仍然可通過獨立的DHRx寄存器操作。
不使用波形發生器的獨立觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’;
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置2個DAC通道的不同觸發源;
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD)。
當發生DAC通道1觸發事件時,(延遲3個APB1時鐘周期后)寄存器DHR1的值傳入寄存器DAC_DOR1。
當發生DAC通道2觸發事件時,(延遲3個APB1時鐘周期后)寄存器DHR2的值傳入寄存器
DAC_DOR2。
使用相同LFSR的獨立觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’;
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置2個DAC通道的不同觸發源;
● 設置2個DAC通道的WAVEx[1:0]位為”01”,并設置MAMPx[3:0]為相同的LFSR屏蔽值;
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD)。
當發生DAC通道1觸發事件時,具有相同屏蔽的LFSR1計數器值與DHR1寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR1,然后更新LFSR1計數器。
當發生DAC通道2觸發事件時,具有相同屏蔽的LFSR2計數器值與DHR2寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR2,然后更新LFSR2計數器。
使用不同LFSR的獨立觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’;
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置2個DAC通道的不同觸發源;
● 設置2個DAC通道的WAVEx[1:0]位為”01”,并設MAMPx[3:0]為不同的LFSR屏蔽值;
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或者DHR8RD)。
當發生DAC通道1觸發事件時,按照MAMP1[3:0]所設屏蔽的LFSR1計數器值與DHR1寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR1,然后更新LFSR1計數器。
當發生DAC通道2觸發事件時,按照MAMP2[3:0]所設屏蔽的LFSR2計數器值與DHR2寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR2,然后更新LFSR2計數器。
產生相同三角波的獨立觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’;
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置2個DAC通道的不同觸發源;
● 設置2個DAC通道的WAVEx[1:0]位為”1x”,并設MAMPx[3:0]為相同的三角波幅值;
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD)。
當發生DAC通道1觸發事件時,相同的三角波幅值加上DHR1寄存器的值,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR1,然后更新DAC通道1三角波計數器。
當發生DAC通道2觸發事件時,相同的三角波幅值加上DHR2寄存器的值,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR2,然后更新DAC通道2三角波計數器。
產生不同三角波的獨立觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’;
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置2個DAC通道的不同觸發源;
● 設置2個DAC通道的WAVEx[1:0]位為’1x’,并設MAMPx[3:0]為不同的三角波幅值。
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD)。
當發生DAC通道1觸發事件時,MAMP1[3:0]所設的三角波幅值加上DHR1寄存器數值,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR1,然后更新DAC通道1三角波計數器。
當發生DAC通道2觸發事件時,MAMP2[3:0]所設的三角波幅值加上DHR2寄存器數值,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR2,然后更新DAC通道2三角波計數器。
同時軟件啟動
按照下列過程設置DAC工作在此轉換模式:
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD)。
在此配置下,一個APB1時鐘周期后,DHR1和DHR2寄存器的數值即被分別傳入DAC_DOR1和DAC_DOR2寄存器。
不使用波形發生器的同時觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’;
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置2個DAC通道使用相同觸發源;
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD)。
當發生觸發事件時,(延遲3個APB1時鐘周期后)DHR1和DHR2寄存器的數值分別傳入DAC_DOR1和DAC_DOR2寄存器。
使用相同LFSR的同時觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’;
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置2個DAC通道使用相同觸發源;
● 設置2個DAC通道的WAVEx[1:0]位為”01”,并設MAMPx[3:0]為相同的LFSR屏蔽值;
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD);
當發生觸發事件時,MAMP1[3:0]所設屏蔽的LFSR1計數器值與DHR1寄存器的數值相加,(延遲3個APB1時鐘周期后)結果傳入DAC_DOR1寄存器,然后更新LFSR1計數器。
同樣,MAMP1[3:0]所設屏蔽的LFSR2計數器值與DHR2寄存器的數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR2,然后更新LFSR2計數器。
使用不同LFSR的同時觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’;
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置2個DAC通道使用相同觸發源;
● 設置2個DAC通道的WAVEx[1:0]位為’01’,并設MAMPx[3:0]為不同的LFSR屏蔽值;
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD)。
當發生觸發事件時,具有相同屏蔽的LFSR1計數器值與DHR1寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR1,然后更新LFSR1計數器。
同時,具有相同屏蔽的LFSR2計數器值與DHR2寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR2,然后更新LFSR2計數器。
使用相同三角波發生器的同時觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’:
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置2個DAC通道使用相同觸發源。
● 設置2個DAC通道的WAVEx[1:0]位為’1x’,并設MAMPx[3:0]為相同的三角波幅值。
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD)。
當發生觸發事件時,相同的三角波幅值與DHR1寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR1,然后更新LFSR1計數器。
同時,相同的三角波幅值與DHR2寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR2,然后更新LFSR2計數器。
使用不同三角波發生器的同時觸發
按照下列順序設置DAC工作在此轉換模式:
● 分別設置2個DAC通道的觸發使能位TEN1和TEN2為’1’:
● 通過設置TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置2個DAC通道使用相同觸發源。
● 設置2個DAC通道的WAVEx[1:0]位為’1x’,并設MAMPx[3:0]為不同的三角波幅值。
● 將雙DAC通道轉換數據裝入所需的DHR寄存器(DHR12RD、DHR12LD 或DHR8RD)。
當發生觸發事件時,MAMP1[3:0]所設的三角波幅值與DHR1寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR1,然后更新LFSR1計數器。同時,MAMP2[3:0]所設的三角波幅值與DHR2寄存器數值相加,(延遲3個APB1時鐘周期后)結果傳入寄存器DAC_DOR2,然后更新LFSR2計數器。
五、DAC寄存器
必須以字(32位)的方式操作這些外設寄存器。
DAC控制寄存器(DAC_CR)
DAC軟件觸發寄存器(DAC_SWTRIGR)
DAC通道 1 的 12 位右對齊數據保持寄存器(DAC_DHR12R1)
DAC通道 1 的 12 位左對齊數據保持寄存器(DAC_DHR12L1)
DAC通道 1 的 8 位右對齊數據保持寄存器(DAC_DHR8R1)
DAC通道 2 的 12 位右對齊數據保持寄存器(DAC_DHR12R2)
DAC通道 2 的 12 位左對齊數據保持寄存器(DAC_DHR12L2)
DAC通道 2 的 8 位右對齊數據保持寄存器(DAC_DHR8R2)
雙DAC的 12 位右對齊數據保持寄存器(DAC_DHR12RD)
雙DAC的 12 位左對齊數據保持寄存器(DAC_DHR12LD)
雙DAC的 8 位右對齊數據保持寄存器(DAC_DHR8RD)
DAC通道 1 數據輸出寄存器(DAC_DOR1)
DAC通道 2 數據輸出寄存器(DAC_DOR2)
DAC寄存器映像
總結
- 上一篇: MySQL刷脏页
- 下一篇: 怎样删除数组中重复元素