重庆美图库!!
查看: 40|回复: 0
打印 上一主题 下一主题
收起左侧

[我要招聘] 学习:微控制器以高分辨率将频率转换为电压

[复制链接]
1
跳转到指定楼层
发表于 2020-12-28 21:03 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
重庆商务网,重庆电子商务第一网!

登陆享受更多浏览权限哟~

您需要 登录 才可以下载或查看,没有帐号?入驻经典 

x

  

  当您需要将测量信号从数字域转换为模拟域时,此设计是仅需两个芯片的合适解决方案。频率到电压的转换在仪器电路中有许多应用。电路设计的相关问题可以到网站了解下,我们是业内领域专业的平台,您如果有需要可以咨询,相信可以帮到您,值得您的信赖!

  该设计(图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

  返回;

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

  结束;
发布商机信息及企业宣传推广--请移步注册重庆商务网!!
快捷入口:给经典重庆客服留言
您需要登录后才可以回帖 登录 | 入驻经典  

本版积分规则

  • 欢迎关注重庆发展,多发帖多回帖才能持续保持帐号活力哟!请不要发表任何政 治,领 导,官 员,人 事及其它违法违规类言论,以免帐号被封禁。感谢您的支持和理解!
经典重庆旗下网站 | 24小时客服:13424176859 308675020

爱重庆,爱上经典重庆! 爱重庆,就上经典重庆!

快速回复 返回顶部 返回列表