24小时联系电话:18217114652、13661815404
中文
行业资讯
微控制器以高分辨率将频率转换为电压
当您需要将测量信号从数字域转换为模拟域时,此设计是仅需两个芯片的合适解决方案。频率到电压的转换在仪器电路中有许多应用。
该设计(图1)基于14引脚PIC单片机16F753 ,该单片机具有嵌入式16位计数器和9位数模转换器(DAC)。此设计的输入频率范围在0至50 KHz之内,其输出电压在0至4.99 V的范围内,分辨率为10 mV。
1. PIC微控制器是该频率电压转换器的中心。
为了实现转换,将输入频率分为四个刻度,这些刻度由输入SEL1和SEL2 (图2)手动选择。
2.通过DIP微型开关将输入频率分为四个刻度
当输入代码为1FFh(511d)时,DAC的最大值为4.99 V;对于输入值为000h的最大值,则DAC的最大值为0.000V。对于第一个比例,我们获得在以下转换方程式中替换的最大值和最小值:
替换这些值,我们得到两个方程式:
求解两个方程,我们得到:
求解M,我们得到:
将两个值代入公式1中,我们得到偏移值,结果是公式3:
现在,公式3可以用PIC基本代码实现。但是首先,我们需要使用TIMER1以1.00秒的间隔测量输入频率,如下所示:
TMR1L = 0; 清除TIMER1寄存器
TMR1H = 0;
T1CON.0 = 1; 计时器1已启用
暂停1000; 持续1.00秒
T1CON.0 = 0; 定时器1已禁用
COUNTER.BYTE0 = TMR1L; 将两个寄存器都存储在两个字节中
COUNTER.BYTE1 = TMR1H;
现在我们可以将等式3应用于:
DIV =计数器* 1000
DAC = DIV32 9784
DAC = DAC +失调; 频率偏移量= 0;
例如,如果在TIMER1中获得2500个脉冲,则可以通过将读取的脉冲除以我们先前发现的常数9.784来获得DAC的值:
然后,将其转换为软件代码,我们得到:
现在我们可以确定多少个脉冲等效于所测量的每个位(图3)。
3.该表显示了刻度2的频率到电压的转换。
对于每个刻度,必须通过执行与公式1、2和3相同的方法来获得常数。因此,对于第二个刻度(5-10 kHz),我们得到公式4:
然后我们确定每个位相当于多少个脉冲(图4)。
4.该表显示了刻度3的频率到电压的转换。
对于第三个音阶(10-15 kHz),我们得到 公式5:
然后,我们确定每个位相当于多少个脉冲(图5)。
5.下表显示了刻度3的频率到电压的转换。
对于第四刻度(10-50 kHz),我们得到公式6:
然后,最后,我们确定图6中的每个位等效于多少个脉冲。
6.该表显示了刻度4的频率到电压的转换
图7和图8 显示了针对不同输入频率及其各自的电压输出的两种情况。下面的代码清单显示了在PIC16F753中实现的软件代码。
7.屏幕截图描绘了以0-5 kHz的比例施加的5.000 kHz输入频率,以及其各自的5.04 V输出。
8.此屏幕截图显示了以0-5 kHz的比例施加的1.000 kHz输入频率,以及其各自的1.00 V输出。
基于PIC16F753的频率电压转换器的软件代码
'* 名称 :FREQ-TO-VOLTAGE.BAS
'* 作者:里卡多·希门尼斯和加布里埃尔·李·阿尔瓦雷斯
'* 版本:1
; PIC16F753
; 频率至电压转换器
; 0hz-5khz = 0v-5 v; 第一尺度
; 5khz-10khz = 0-5v; 第二等级
; 10khz-15khz = 0-5v; 第三等级
; 10khz-50khz = 0-5v; 第四等级
; pic16f753
; 振荡器和PORTS配置
OSCCON = 26美元;= $ 26; 时钟设置为4 MHz
OSCTUNE = 0;
TRISA =%111110; RA0是输出,RA1:RA5作为输入
ANSELA =%000010; RA0:RA5数字
TRISC =%0000000; RC0:RC2作为输入,RC3:RC5作为 输出
ANSELC =%000000; RC0:RC5作为数字
WPUA =%011100;RA2,RA3拉动使能
WPUC =%000000
DEFINE LCD_DREG PORTC'PORTC是LCD数据端口
DEFINE LCD_DBIT 0'PORTC.0是数据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数据线
DEFINE LCD_LINES 2'是2行显示
DEFINE LCD_COMMANDUS 1500'使用1500uS命令延迟
DEFINE LCD_DATAUS 44'使用44uS数据延迟
; ---------设置LCD ------------------------------------- -------------------
LCDOUT $ FE,$ 28; $ 28功能套装,4位
LCDOUT $ FE,$ 10; $ 10 SHIFT显示
LCDOUT $ FE,$ 0C; $ 0C显示
LCDOUT $ FE,$ 06; $ 06进入模式设定
; ------------定时器配置----------
T1CON =%10000100; $ 84定时器1禁用
; --- HPWM设置为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; 声明计数变量
; COUNTER.BYTE0 VAR TMR1L
; COUNTER.BYTE1
DAC VAR WORD; 可能由DAC使用
SEL VAR BYTE; 刻度选择器
HZ VAR BYTE [5]; 赫兹的数字
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字节;
VO VAR WORD [4];
OPTION_REG.7 = 0;
; --------程序启动----------------
RPT:
;第一测试,让我们做第一尺度
; DAC中的位数= 511,所以5KHZ / 511
; 5KHZ / 511 = 9.7843
; K = 9.7843
对于X = 0至5; 开始循环
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; 存储低字节寄存器
COUNTER.BYTE1 = TMR1H; 存储高字节寄存器
对于X = 0至4;
IN = COUNTER DIG X; 获取数字
LOOKUP IN,[“ 0123456789”],OUT; 解码每个数字
HZ [X] = OUT; 存储数字
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; 反转数据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;
转到OBTAIN_PULSES; 转到标签OBTAIN_PULSES;
; ------------------第一尺度 ----------------------------- --
ESC1 :; 0HZ 5KHZ
; 获取比例值
DIV =计数器* 1000
DAC = DIV32 9784
如果(COUNTER> 5000)THEN DAC = 0; ; 如果不在范围内,则等于零
LCDOUT $ FE,$ C0,“ 0-5KHZ DAC =”,dec dac,“ ”
返回;
; ---------------------- 4th SCALE -------------------
ESC4 :; 10KHZ-50KHZ
DIV =计数器* 100
DAC = DIV32 7827
DAC = DAC-127;
如果(计数器> 50000)或(计数器<10000)然后DAC = 0;如果不在范围内则等于零
LCDOUT $ FE,$ C0,“ 10-50KHZ DAC =”,DEC DAC,“ ”
返回;
; ----------------------- 3rd scale -----------------
ESC3: ; 埃斯卡拉10KHZ-15KHZ
DIV =计数器* 1000
DAC = DIV32 9784
DAC = DAC-1022;
如果(COUNTER> 15000)或(COUNTER <10000)THEN DAC = 0; 如果不在范围内则DAC = 0
LCDOUT $ FE,$ C0,“ 10-15KHZ DAC =”,DEC DAC,“ ”
返回;
; ------------------------------------------------- -----------------------------
ESC2 :;比例5KHZ-10KHZ
; --------------获取此标度的值
如果(COUNTER> 10000)或(COUNTER <5000)然后DAC = 0; 如果不在范围内则DAC = 0
LCDOUT $ FE,$ C0,“ 5-10KHZ DAC =”,DEC DAC,“ ”
DIV =计数器* 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; 与数字有关
启用
对于X = 0至2;
IN = VO [3] DIG(X + 1); 查找相应的数字
LOOKUP IN,[“ 0123456789”],OUT;解码数字
VO [X] = OUT; 商店数字
NEXT X;
返回;
; ------------------------------------------------- ------------------------------
DAC_OUT:
DAC1REFL = DAC.BYTE0; 修改DAC0寄存器
DAC1REFH = DAC.8; 修改DAC0位8
返回;
; ------------------------------
结束;