24小时联系电话:18217114652、13661815404

中文

您当前的位置:
首页>
电子资讯>
行业资讯>
微控制器以高分辨率将...

行业资讯

微控制器以高分辨率将频率转换为电压


当您需要将测量信号从数字域转换为模拟域时,此设计是仅需两个芯片的合适解决方案。频率到电压的转换在仪器电路中有许多应用。

该设计(图1基于14引脚PIC单片机16F753 ,该单片机具有嵌入式16位计数器和9位数模转换器(DAC)。此设计的输入频率范围在050 KHz之内,其输出电压在04.99 V的范围内,分辨率为10 mV


1. PIC微控制器是该频率电压转换器的中心。

为了实现转换,将输入频率分为四个刻度,这些刻度由输入SEL1SEL2 (图2手动选择。

2.通过DIP微型开关将输入频率分为四个刻度


当输入代码为1FFh511d)时,DAC的最大值为4.99 V;对于输入值为000h的最大值,则DAC的最大值为0.000V。对于第一个比例,我们获得在以下转换方程式中替换的最大值和最小值:

 

替换这些值,我们得到两个方程式:

 

求解两个方程,我们得到:

 

求解M,我们得到:

 

将两个值代入公式1中,我们得到偏移值,结果是公式3

 

现在,公式3可以用PIC基本代码实现。但是首先,我们需要使用TIMER11.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的频率到电压的转换。

对于每个刻度,必须通过执行与公式123相同的方法来获得常数。因此,对于第二个刻度(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是输出,RA1RA5作为输入

ANSELA =000010; RA0RA5数字

TRISC =0000000;    RC0RC2作为输入,RC3RC5作为  输出

ANSELC =000000;   RC0RC5作为数字

WPUA =011100RA2RA3拉动使能

WPUC =000000

DEFINE LCD_DREG PORTC'PORTCLCD数据端口

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;    启用计时器2PRESCALER 16

; CCP1CON.5 = 0

; CCP1CON.4 = 0

; CCPR1L =000101000;                      

; ADC使能

ADCON0 =10000111; 使能ADC

ADCON1 =00000000; FOSC / 2

; -------- DAC   配置---------------------------------------

DAC1CON0 =11100000; $ E0DAC使能正确

; ---------声明变量

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 = 05; 开始循环

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 = 04;     

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 = 0255

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> 5000THEN 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 <10000THEN 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 <5000THEN DAC = 0

LCDOUT $ FE$ C0“ 5-10KHZ DAC =”DEC DAC“        ”

返回;

;-伏打DAC ---------

V_DAC 

禁用

VO [1] = DAC * 976;         DAC获取电压

VO [3] = DIV32 100;       与数字有关

启用

对于X = 02;           

IN = VO [3] DIGX + 1;     查找相应的数字

LOOKUP IN[“ 0123456789”]OUT;解码数字

VO [X] = OUT;               商店数字

NEXT X;

返回;

; ------------------------------------------------- ------------------------------

DAC_OUT

DAC1REFL = DAC.BYTE0;       修改DAC0寄存器

DAC1REFH = DAC.8;               修改DAC08

返回;                                

; ------------------------------

结束;

 

请输入搜索关键字

确定