26.3
電壓值轉換
如果我們直接通過輸入一個有效位數為12位的數字值,通過DAC來輸出其相應的電壓,這樣并沒有那么直觀。但是如果我們可以輸入一個電壓值,然后通過軟件代碼把這個電壓轉換為與其對應的數字值,再把這個數字值寫入DA數據寄存器,這樣中間經過了一個電壓值到DA數據寄存器值的映射轉換,可以讓我們設置DAC輸出電壓時變得更加直觀
那么如何實現這樣的轉換呢?以下是D/A數據寄存器值與輸出電壓值之間的轉換公式:

點擊可查看大圖
因此在ADC轉換完成之后,我們可以調用FSP庫函數R_ADC_Read(),從ADC的數據寄存器里讀出上述等式中X的值,從而再經過計算得出對應的電壓值。
在上面的公式中:
3.3V表示的是D/A轉換的參考基準電壓為3.3V;
“Output Voltage”為要輸出的目標電壓值;
4096等于2的12次方,對應的是DAC的分辨率是12位;
“Setting in DADRn”表示的是輸出目標電壓值對應需要設置的DA數據寄存器值的值。
最終,我們根據上面的公式寫成如下的函數。函數中最后一行通過調用FSP庫函數R_DAC_Write()計算結果即“Setting in DADRn”的值寫入DA數據寄存器。
左右滑動查看完整內容
/** *@brief設置當前的電壓 *@param需要控制的電壓(范圍為0~3.3V) *@retval無 */ voidDAC_SetVoltage(float voltage) { uint16_t dac_data; dac_data = (uint16_t)(4096*((voltage)/3.3f)); R_DAC_Write(&g_dac0_ctrl, dac_data); }
26.4
生成正弦波數據表
要輸出正弦波,實質是要控制DAC以v=sin(t)的正弦函數關系輸出電壓,其中v為電壓輸出,t為時間。
而由于模擬信號連續而數字信號是離散的,所以使用DAC產生正弦波時,只能按一定時間間隔輸出正弦曲線上的點,在該時間段內輸出相同的電壓值,若縮短時間間隔,提高單個周期內的輸出點數,可以得到逼近連續正弦波的圖形,見圖26_3,若在外部電路加上適當的電容濾波,可得到更完美的圖形。

圖26?3 DAC按點輸出正弦波數據
(左:32個點,右:128個點)
由于正弦曲線是周期函數,所以只需要得到單個周期內的數據后按周期重復即可,而單個周期內取樣輸出的點數又是有限的,所以為了得到呈v=sin(t)函數關系電壓值的數據通常不會實時計算獲取,而是預先計算好函數單個周期內的電壓數據表,并且轉化成以DAC寄存器表示的值。
如sin函數值的范圍為[-1: +1],而RA6M5的DAC輸出電壓范圍為[0~3.3]V,按12位DAC分辨率表示的方法,可寫入寄存器的最大值為212=4096,即范圍為[0:4096]。所以,實際輸出時,會進行如下處理:
1)抬升sin函數的輸出為正值:v=sin(t)+1,此時,v的輸出范圍為[0:2];
2)擴展輸出至DAC的全電壓范圍:v=3.3*(sin(t)+1)/2,此時,v的輸出范圍為[0:3.3],正是DAC的電壓輸出范圍,擴展至全電壓范圍可以充分利用DAC的分辨率;
3)把電壓值以DAC寄存器的形式表示:Reg_val=212/3.3 * v=211*(sin(t)+1),此時,存儲到DAC寄存器的值范圍為[0:4095];
4)實踐證明,在sin(t)的單個周期內,取32個點進行電壓輸出已經能較好地還原正弦波形,所以在t∈[0:2π]區間內等間距根據上述Reg_val公式運算得到32個寄存器值,即可得到正弦波表;
5)控制DAC輸出時,每隔一段相同的時間從上述正弦波表中取出一個新數據進行輸出,即可輸出正弦波。改變間隔時間的單位長度,可以改變正弦波曲線的周期。
為方便起見,我們使用了Python和Matlab腳本制作正弦波表,腳本的代碼存儲在本工程的目錄下,感興趣可以打開文件查看,以下列出Python腳本代碼,見代碼清單26?1。
列表1:代碼清單26?1
制作正弦波數據表的python腳本
(工程目錄下的sinWave.py文件)
左右滑動查看完整內容
#! python3 #coding=utf-8 """ Python 版本:3.x 外部庫:matplotlib1.5.3、numpy1.11.2 運行方式: 在命令行中輸入:python sinWave.py 運行結果: 命令行中會打印計算得的各點數據, 在當前目錄下會生成py_dac_sinWav.c 文件,包含上述數據, 并且會彈出描繪曲線的對話框。 """ importmatplotlib.pyplotasplt importnumpyasnp importmath # 修改本變量可以更改點數,如16、32、64 等 POINT_NUM =32 pi = math.pi # 一個周期POINT_NUM 個點 n = np.linspace(0,2*pi,POINT_NUM) # 計算POINT_NUM 個點的正弦值 a =map(math.sin,n) r =[] foriina: # 調整幅值至在0~1 區間 i+=1 # 按3.3V 電壓調整幅值 i*=3.3/2 # 求取dac 數值,12 位dac LSB = 3.3V/2**12 ri =round(i*2**12/3.3) # 檢查參數 ifri >=4095: ri =4095 # 得到dac 數值序列 r.append( ri ) print(list(map(int,r))) # 寫入序列到文件 withopen("py_dac_sinWav.c",'w',encoding='gb2312')asf: print(list(map(int,r)),file= f) # 繪圖 plt.plot(n,r,"-o") plt.show()
Python腳本的實現原理就是前面介紹的正弦波數據表的制作過程,運行后,該腳本把得到的正弦波表數據輸出到目錄下的py_dac_sinWav.c文件中,見代碼清單26?2,并且根據取樣點描繪出示意圖,見圖26?4。Matlab腳本原理相同,此處不再列出,使用C語言也能制作正弦波表。
列表2:代碼清單26?2 生成的正弦波數據表
左右滑動查看完整內容
[2048, 2460, 2856, 3218, 3532, 3786, 3969, 4072, 4093, 4031, 3887, 3668, 3382, 3042, 2661, 2255, 1841, 1435, 1054, 714, 428, 209, 65, 3, 24, 127, 310, 564, 878, 1240, 1636, 2048]

圖26?4 python腳本根據正弦波表描繪的曲線圖
-
寄存器
+關注
關注
31文章
5615瀏覽量
130316 -
正弦波
+關注
關注
11文章
661瀏覽量
59275 -
dac
+關注
關注
44文章
2769瀏覽量
197467 -
輸出電壓
+關注
關注
2文章
2051瀏覽量
41254
原文標題:電壓值轉換&生成正弦波數據表——瑞薩RA系列FSP庫開發實戰指南(95)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
瑞薩RA系列FSP庫開發實戰指南之電壓值轉換和生成正弦波數據表
評論