24小時聯(lián)系電話:18217114652、13661815404
中文
行業(yè)資訊
微控制器以高分辨率將頻率轉(zhuǎn)換為電壓
當(dāng)您需要將測量信號從數(shù)字域轉(zhuǎn)換為模擬域時,此設(shè)計是僅需兩個芯片的合適解決方案。頻率到電壓的轉(zhuǎn)換在儀器電路中有許多應(yīng)用。
該設(shè)計(圖1)基于14引腳PIC單片機16F753 ,該單片機具有嵌入式16位計數(shù)器和9位數(shù)模轉(zhuǎn)換器(DAC)。此設(shè)計的輸入頻率范圍在0至50 KHz之內(nèi),其輸出電壓在0至4.99 V的范圍內(nèi),分辨率為10 mV。
1. PIC微控制器是該頻率電壓轉(zhuǎn)換器的中心。
為了實現(xiàn)轉(zhuǎn)換,將輸入頻率分為四個刻度,這些刻度由輸入SEL1和SEL2 (圖2)手動選擇。
2.通過DIP微型開關(guān)將輸入頻率分為四個刻度
當(dāng)輸入代碼為1FFh(511d)時,DAC的最大值為4.99 V;對于輸入值為000h的最大值,則DAC的最大值為0.000V。對于第一個比例,我們獲得在以下轉(zhuǎn)換方程式中替換的最大值和最小值:
替換這些值,我們得到兩個方程式:
求解兩個方程,我們得到:
求解M,我們得到:
將兩個值代入公式1中,我們得到偏移值,結(jié)果是公式3:
現(xiàn)在,公式3可以用PIC基本代碼實現(xiàn)。但是首先,我們需要使用TIMER1以1.00秒的間隔測量輸入頻率,如下所示:
TMR1L = 0; 清除TIMER1寄存器
TMR1H = 0;
T1CON.0 = 1; 計時器1已啟用
暫停1000; 持續(xù)1.00秒
T1CON.0 = 0; 定時器1已禁用
COUNTER.BYTE0 = TMR1L; 將兩個寄存器都存儲在兩個字節(jié)中
COUNTER.BYTE1 = TMR1H;
現(xiàn)在我們可以將等式3應(yīng)用于:
DIV =計數(shù)器* 1000
DAC = DIV32 9784
DAC = DAC +失調(diào); 頻率偏移量= 0;
例如,如果在TIMER1中獲得2500個脈沖,則可以通過將讀取的脈沖除以我們先前發(fā)現(xiàn)的常數(shù)9.784來獲得DAC的值:
然后,將其轉(zhuǎn)換為軟件代碼,我們得到:
現(xiàn)在我們可以確定多少個脈沖等效于所測量的每個位(圖3)。
3.該表顯示了刻度2的頻率到電壓的轉(zhuǎn)換。
對于每個刻度,必須通過執(zhí)行與公式1、2和3相同的方法來獲得常數(shù)。因此,對于第二個刻度(5-10 kHz),我們得到公式4:
然后我們確定每個位相當(dāng)于多少個脈沖(圖4)。
4.該表顯示了刻度3的頻率到電壓的轉(zhuǎn)換。
對于第三個音階(10-15 kHz),我們得到 公式5:
然后,我們確定每個位相當(dāng)于多少個脈沖(圖5)。
5.下表顯示了刻度3的頻率到電壓的轉(zhuǎn)換。
對于第四刻度(10-50 kHz),我們得到公式6:
然后,最后,我們確定圖6中的每個位等效于多少個脈沖。
6.該表顯示了刻度4的頻率到電壓的轉(zhuǎn)換
圖7和圖8 顯示了針對不同輸入頻率及其各自的電壓輸出的兩種情況。下面的代碼清單顯示了在PIC16F753中實現(xiàn)的軟件代碼。
7.屏幕截圖描繪了以0-5 kHz的比例施加的5.000 kHz輸入頻率,以及其各自的5.04 V輸出。
8.此屏幕截圖顯示了以0-5 kHz的比例施加的1.000 kHz輸入頻率,以及其各自的1.00 V輸出。
基于PIC16F753的頻率電壓轉(zhuǎn)換器的軟件代碼
'* 名稱 :FREQ-TO-VOLTAGE.BAS
'* 作者:里卡多·希門尼斯和加布里埃爾·李·阿爾瓦雷斯
'* 版本:1
; PIC16F753
; 頻率至電壓轉(zhuǎn)換器
; 0hz-5khz = 0v-5 v; 第一尺度
; 5khz-10khz = 0-5v; 第二等級
; 10khz-15khz = 0-5v; 第三等級
; 10khz-50khz = 0-5v; 第四等級
; pic16f753
; 振蕩器和PORTS配置
OSCCON = 26美元;= $ 26; 時鐘設(shè)置為4 MHz
OSCTUNE = 0;
TRISA =%111110; RA0是輸出,RA1:RA5作為輸入
ANSELA =%000010; RA0:RA5數(shù)字
TRISC =%0000000; RC0:RC2作為輸入,RC3:RC5作為 輸出
ANSELC =%000000; RC0:RC5作為數(shù)字
WPUA =%011100;RA2,RA3拉動使能
WPUC =%000000
DEFINE LCD_DREG PORTC'PORTC是LCD數(shù)據(jù)端口
DEFINE LCD_DBIT 0'PORTC.0是數(shù)據(jù)LSB
DEFINE LCD_RSREG PORTC'RS連接到PORTC.4
定義LCD_RSBIT 4
DEFINE LCD_EREG PORTC'E連接到PORTC.5
定義LCD_EBIT 5
使用DEFINE LCD_BITS 4'4數(shù)據(jù)線
DEFINE LCD_LINES 2'是2行顯示
DEFINE LCD_COMMANDUS 1500'使用1500uS命令延遲
DEFINE LCD_DATAUS 44'使用44uS數(shù)據(jù)延遲
; ---------設(shè)置LCD ------------------------------------- -------------------
LCDOUT $ FE,$ 28; $ 28功能套裝,4位
LCDOUT $ FE,$ 10; $ 10 SHIFT顯示
LCDOUT $ FE,$ 0C; $ 0C顯示
LCDOUT $ FE,$ 06; $ 06進入模式設(shè)定
; ------------定時器配置----------
T1CON =%10000100; $ 84定時器1禁用
; --- HPWM設(shè)置為250 Hz,需要時刪除分號-
; CCP1CON =%00001100; PWM模式選擇和CCPx使能
; PR2 = 79; 從方程式獲得的值
; T2CON =%00000100; 啟用計時器2,PRESCALER 16
; CCP1CON.5 = 0
; CCP1CON.4 = 0
; CCPR1L =%000101000;
; ADC使能
ADCON0 =%10000111; 使能ADC
ADCON1 =%00000000; FOSC / 2
; -------- DAC 配置---------------------------------------
DAC1CON0 =%11100000; $ E0,DAC使能正確
; ---------聲明變量
COUNTER VAR WORD; 聲明計數(shù)變量
; COUNTER.BYTE0 VAR TMR1L
; COUNTER.BYTE1
DAC VAR WORD; 可能由DAC使用
SEL VAR BYTE; 刻度選擇器
HZ VAR BYTE [5]; 赫茲的數(shù)字
DIV VAR WORD;
在VAR BYTE中;
VBE var word
OUT VAR BYTE;
我是VAR WORD;
I2 VAR WORD;
ID VAR BYTE [3];
VIN VAR WORD;
VID VAR BYTE [4];
VED VAR BYTE [4];
VIN2 VAR WORD;
INVERT VAR PORTA.2; 資料倒換密碼
x var字節(jié);
VO VAR WORD [4];
OPTION_REG.7 = 0;
; --------程序啟動----------------
RPT:
;第一測試,讓我們做第一尺度
; DAC中的位數(shù)= 511,所以5KHZ / 511
; 5KHZ / 511 = 9.7843
; K = 9.7843
對于X = 0至5; 開始循環(huán)
HZ [X] =“ 0”;
VO [X] =“ 0”;
VIN = 0; 清算變量
IN = 0;
OUT = 0;
SEL = 0;
DAC = 0;
DIV = 0;
DAC = 0;
VID [X] =“ 0”;
ID [X] =“ 0”
NEXT X;
LCDOUT $ FE,$ C0,“等待縮放”
OBTAIN_PULSES :;
LCDOUT $ FE,$ 80,“ HZ =”,HZ [4],HZ [3],HZ [2],HZ [1],HZ [0],“ Vout =”,VO [2],“。”,“ VO [1],VO [0];
TMR1L = 0; 在TIMER1中清除寄存器
TMR1H = 0;
T1CON.0 = 1; 啟用計時器1
暫停1000;
T1CON.0 = 0; 定時器1已禁用
COUNTER.BYTE0 = TMR1L; 存儲低字節(jié)寄存器
COUNTER.BYTE1 = TMR1H; 存儲高字節(jié)寄存器
對于X = 0至4;
IN = COUNTER DIG X; 獲取數(shù)字
LOOKUP IN,[“ 0123456789”],OUT; 解碼每個數(shù)字
HZ [X] = OUT; 存儲數(shù)字
NEXT X;
LCDOUT $ FE,$ 80,“ HZ =”,HZ [4],HZ [3],HZ [2],HZ [1],HZ [0],“ Vout =”,VO [2],“。”,“ VO [1],VO [0];
; -----選擇------------
;對于X = 0到255
SEL =(PORTA&%011000)>> 3; 讀取PORTA ANS SHIFT右位3位
;選擇比例
如果SEL =%00,則GOSUB ESC1; 0-5KHZ
如果SEL =%01 THEN GOSUB ESC2; 10K-50K
如果SEL =%10 THEN GOSUB ESC3; 10KHZ-15KHZ
如果SEL =%11 THEN GOSUB ESC4; 5KHZ-10KHZ
如果INVERT = 0,則DAC = 511-DAC; 反轉(zhuǎn)數(shù)據(jù)IF = 0
GOSUB V_DAC;
LCDOUT $ FE,$ 80,“ HZ =”,HZ [4],HZ [3],HZ [2],HZ [1],HZ [0],“ Vout =”,VO [2],“。”,“ VO [1],VO [0];
GOSUB DAC_OUT;
轉(zhuǎn)到OBTAIN_PULSES; 轉(zhuǎn)到標簽OBTAIN_PULSES;
; ------------------第一尺度 ----------------------------- --
ESC1 :; 0HZ 5KHZ
; 獲取比例值
DIV =計數(shù)器* 1000
DAC = DIV32 9784
如果(COUNTER> 5000)THEN DAC = 0; ; 如果不在范圍內(nèi),則等于零
LCDOUT $ FE,$ C0,“ 0-5KHZ DAC =”,dec dac,“ ”
返回;
; ---------------------- 4th SCALE -------------------
ESC4 :; 10KHZ-50KHZ
DIV =計數(shù)器* 100
DAC = DIV32 7827
DAC = DAC-127;
如果(計數(shù)器> 50000)或(計數(shù)器<10000)然后DAC = 0;如果不在范圍內(nèi)則等于零
LCDOUT $ FE,$ C0,“ 10-50KHZ DAC =”,DEC DAC,“ ”
返回;
; ----------------------- 3rd scale -----------------
ESC3: ; 埃斯卡拉10KHZ-15KHZ
DIV =計數(shù)器* 1000
DAC = DIV32 9784
DAC = DAC-1022;
如果(COUNTER> 15000)或(COUNTER <10000)THEN DAC = 0; 如果不在范圍內(nèi)則DAC = 0
LCDOUT $ FE,$ C0,“ 10-15KHZ DAC =”,DEC DAC,“ ”
返回;
; ------------------------------------------------- -----------------------------
ESC2 :;比例5KHZ-10KHZ
; --------------獲取此標度的值
如果(COUNTER> 10000)或(COUNTER <5000)然后DAC = 0; 如果不在范圍內(nèi)則DAC = 0
LCDOUT $ FE,$ C0,“ 5-10KHZ DAC =”,DEC DAC,“ ”
DIV =計數(shù)器* 1000
DAC = DIV32 9784
DAC = DAC-511;
如果(COUNTER> 10000)或(COUNTER <5000)THEN DAC = 0
LCDOUT $ FE,$ C0,“ 5-10KHZ DAC =”,DEC DAC,“ ”
返回;
;-伏打DAC ---------
V_DAC:
禁用
VO [1] = DAC * 976; 從DAC獲取電壓
VO [3] = DIV32 100; 與數(shù)字有關(guān)
啟用
對于X = 0至2;
IN = VO [3] DIG(X + 1); 查找相應(yīng)的數(shù)字
LOOKUP IN,[“ 0123456789”],OUT;解碼數(shù)字
VO [X] = OUT; 商店數(shù)字
NEXT X;
返回;
; ------------------------------------------------- ------------------------------
DAC_OUT:
DAC1REFL = DAC.BYTE0; 修改DAC0寄存器
DAC1REFH = DAC.8; 修改DAC0位8
返回;
; ------------------------------
結(jié)束;