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

點擊可查看大圖
因此在ADC轉(zhuǎn)換完成之后,我們可以調(diào)用FSP庫函數(shù)R_ADC_Read(),從ADC的數(shù)據(jù)寄存器里讀出上述等式中X的值,從而再經(jīng)過計算得出對應的電壓值。
在上面的公式中:
3.3V表示的是D/A轉(zhuǎn)換的參考基準電壓為3.3V;
“Output Voltage”為要輸出的目標電壓值;
4096等于2的12次方,對應的是DAC的分辨率是12位;
“Setting in DADRn”表示的是輸出目標電壓值對應需要設置的DA數(shù)據(jù)寄存器值的值。
最終,我們根據(jù)上面的公式寫成如下的函數(shù)。函數(shù)中最后一行通過調(diào)用FSP庫函數(shù)R_DAC_Write()計算結(jié)果即“Setting in DADRn”的值寫入DA數(shù)據(jù)寄存器。
左右滑動查看完整內(nèi)容
/** *@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
生成正弦波數(shù)據(jù)表
要輸出正弦波,實質(zhì)是要控制DAC以v=sin(t)的正弦函數(shù)關(guān)系輸出電壓,其中v為電壓輸出,t為時間。
而由于模擬信號連續(xù)而數(shù)字信號是離散的,所以使用DAC產(chǎn)生正弦波時,只能按一定時間間隔輸出正弦曲線上的點,在該時間段內(nèi)輸出相同的電壓值,若縮短時間間隔,提高單個周期內(nèi)的輸出點數(shù),可以得到逼近連續(xù)正弦波的圖形,見圖26_3,若在外部電路加上適當?shù)?a href="http://www.greenbey.cn/tags/電容濾波/" target="_blank">電容濾波,可得到更完美的圖形。

圖26?3 DAC按點輸出正弦波數(shù)據(jù)
(左:32個點,右:128個點)
由于正弦曲線是周期函數(shù),所以只需要得到單個周期內(nèi)的數(shù)據(jù)后按周期重復即可,而單個周期內(nèi)取樣輸出的點數(shù)又是有限的,所以為了得到呈v=sin(t)函數(shù)關(guān)系電壓值的數(shù)據(jù)通常不會實時計算獲取,而是預先計算好函數(shù)單個周期內(nèi)的電壓數(shù)據(jù)表,并且轉(zhuǎn)化成以DAC寄存器表示的值。
如sin函數(shù)值的范圍為[-1: +1],而RA6M5的DAC輸出電壓范圍為[0~3.3]V,按12位DAC分辨率表示的方法,可寫入寄存器的最大值為212=4096,即范圍為[0:4096]。所以,實際輸出時,會進行如下處理:
1)抬升sin函數(shù)的輸出為正值: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)的單個周期內(nèi),取32個點進行電壓輸出已經(jīng)能較好地還原正弦波形,所以在t∈[0:2π]區(qū)間內(nèi)等間距根據(jù)上述Reg_val公式運算得到32個寄存器值,即可得到正弦波表;
5)控制DAC輸出時,每隔一段相同的時間從上述正弦波表中取出一個新數(shù)據(jù)進行輸出,即可輸出正弦波。改變間隔時間的單位長度,可以改變正弦波曲線的周期。
為方便起見,我們使用了Python和Matlab腳本制作正弦波表,腳本的代碼存儲在本工程的目錄下,感興趣可以打開文件查看,以下列出Python腳本代碼,見代碼清單26?1。
列表1:代碼清單26?1
制作正弦波數(shù)據(jù)表的python腳本
(工程目錄下的sinWave.py文件)
左右滑動查看完整內(nèi)容
#! python3 #coding=utf-8 """ Python 版本:3.x 外部庫:matplotlib1.5.3、numpy1.11.2 運行方式: 在命令行中輸入:python sinWave.py 運行結(jié)果: 命令行中會打印計算得的各點數(shù)據(jù), 在當前目錄下會生成py_dac_sinWav.c 文件,包含上述數(shù)據(jù), 并且會彈出描繪曲線的對話框。 """ importmatplotlib.pyplotasplt importnumpyasnp importmath # 修改本變量可以更改點數(shù),如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: # 調(diào)整幅值至在0~1 區(qū)間 i+=1 # 按3.3V 電壓調(diào)整幅值 i*=3.3/2 # 求取dac 數(shù)值,12 位dac LSB = 3.3V/2**12 ri =round(i*2**12/3.3) # 檢查參數(shù) ifri >=4095: ri =4095 # 得到dac 數(shù)值序列 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腳本的實現(xiàn)原理就是前面介紹的正弦波數(shù)據(jù)表的制作過程,運行后,該腳本把得到的正弦波表數(shù)據(jù)輸出到目錄下的py_dac_sinWav.c文件中,見代碼清單26?2,并且根據(jù)取樣點描繪出示意圖,見圖26?4。Matlab腳本原理相同,此處不再列出,使用C語言也能制作正弦波表。
列表2:代碼清單26?2 生成的正弦波數(shù)據(jù)表
左右滑動查看完整內(nèi)容
[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腳本根據(jù)正弦波表描繪的曲線圖
-
寄存器
+關(guān)注
關(guān)注
31文章
5616瀏覽量
130347 -
正弦波
+關(guān)注
關(guān)注
11文章
662瀏覽量
59288 -
dac
+關(guān)注
關(guān)注
44文章
2818瀏覽量
197528 -
輸出電壓
+關(guān)注
關(guān)注
2文章
2051瀏覽量
41266
原文標題:電壓值轉(zhuǎn)換&生成正弦波數(shù)據(jù)表——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(95)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之電壓值轉(zhuǎn)換和生成正弦波數(shù)據(jù)表
評論