如果Dnewpromo

微控制器有效测量频率和周期

2020年10月26日
利用PIC16的信号测量计时器模块进行快速准确的测量。

以PDF格式下载本文。

当您需要在硬件中进行准确的计时测量而不超载微控制器时,信号测量计时器模块(SMT)微芯片16F1619 PIC微控制器非常适合此应用程序。SMT模块捕获了信号的特征,例如周期和频率等。该设计测量在8 Hz至10 MHz范围内的输入频率信号,以及在0.1 µs至125 ms范围内的周期信号。图1显示原型电路。


该模块的操作包括读取24位计时器/计数器的数据,并将其传输到三个名为TMR,CPR和PR的寄存器。SMT可以执行各种测量值,例如封闭式计时器,周期和占空比获取,高和低测量,窗户测量,门控窗户测量,飞行时间,捕获时间,捕获,柜台,门控柜台和窗户计数器。

在此应用程序中,我们在期间和占空比采集模式下使用SMT模块。图2显示了该设计的电子示意图。


周期和占空比模式具有两种操作模式。第一个作用单一收购,可以采用计时器/计数器内容。您可以将其配置为信号的上升边缘以开始读取,或者转到获取并将下降边缘设置为中断。第二种模式可以通过配置SMTXGO寄存器来读取和保存计数器值设置,GO和中断获取。在此设计中,我们使用第二种模式。要了解该计数器及其寄存器的工作原理,我们需要检查正时图。

根据数据表的定时图,我们在启动计数器以进行同步之前有一个延迟。时间取决于内部或外部时钟。开始收购后,我们在软件中设置了50毫秒的延迟。SMT模块的设置代码作为期间和占空比的收购是:

smt1clk =%00000001;SMT时钟选择寄存器(我们选择FOSC/4)

smt1sig = 0;信号输入选择寄存器(我们几乎可以将每个引脚用作SMT输入;在这种情况下,默认情况下选择SMTSIG1)

这些寄存器仅用于初始化,即使在SMT寄存器上选择了时钟及其输入端口,我们也必须选择时钟及其输入端口。SMT模块有两个控制寄存器。我们需要设置两者进行测量。这些位的操作描述如下(STXCON是控制寄存器):

smt1con0:

位7:启用SMT模块;如果将此位设置为0,则整个SMT将被禁用。

位6:未完成。

位5:停止柜台;它用于中断选项。

位4:窗口输入极性,用于在上升或下降边缘处测量。

位3:输入信号极性;在上升或下降边缘时启用测量。

位2:时钟输入极性;在上升或跌落边缘处逐步计数器。

位1&0:SMT模块预拉仪

smt1con1:

位7:开始从计数器时钟获取数据;如果禁用,则不算在内。

位6:这个位使我们可以在两种操作方法之间进行选择:单个测量或进行和重复。对于单个测量,您必须选择极性选项以在上升边缘进行测量或在下降边缘停止。

位5&4:未完成。

位3至0:通过设置这些位来分配操作模式。

如您在代码列表下面,我们使用20x2 LCD显示器来显示周期测量。这些测量值无法直接读取,因为计数器中的值是频率。因此,必须将其转换为时期。然后,我们用外部晶体将时钟设置为16 MHz,在SMT模块中,我们将预定器值设置为4,然后将周期尺度设置为4。我们的SMT时钟为1 MHz;确定我们得到的时间:

因此,我们对每个时钟脉冲都有1US,这意味着,如果我们的周期为1ms,则应具有恒定周期的1000脉冲。为了获得频率,我们使用等式2:

为了确定脉冲的数量,我们需要将SMTF OSC除以频率:

如您所见,这些值是浮动或双变量类型的。我们不能在PBP3编译器中使用十进制数字,因此我们需要寻找一个方程来解决此问题。在这种情况下,我们在SMT模块中读取250 Hz,其内部时钟具有1 MHz。这意味着使用等式1,该周期将为4000脉冲 - 在这里,我们知道1 µs等于1脉冲,相当于4 ms。如果时钟设置为4 MHz,我们会得到16000脉冲,这是16位数字。

对于周期测量,每个脉冲为250 µs,这意味着我们必须将SMT脉冲数据的值乘以常数。然后,我们将获得400000。这不是16位的数字,因此我们需要一个倍数。接近真实二进制数的数字为25,因为每个脉冲中250 µs的数字将是我们的倍数因子,这将导致等式4:

通过在pbp3中使用Div32命令,我们可以从内部结果中获取所有31位的倍数函数的内部变量,该变量以16×16位的操作,然后除以100。然后,我们获得了方程5:

现在,我们有一个有效的16位数字,代表毫秒的读数。这意味着,我们有数字4和Digit 3作为整数编号,另一个用于浮动值。但是,这对于此配置是有效的。

现在,我们必须将不同的周期值分为量表。我们以四个尺度进行此操作。例如,在第一个刻度中,我们使用FOSC/4和预定器配置SMT时钟为1:8;然后,我们的SMTFOSC等于500,000 Hz。如果我们使用公式1,则将每个脉冲等于2 µs。由于周期测量的最大16位脉冲,我们必须将比例值从8到100 Hz设置。

为了测试它,我们将来自外部脉冲宽度调制(PWM)的50 Hz输入信号应用于读取引脚。然后,通过公式1和3,我们将10000个脉冲放入SMT模块中的数据寄存器中。要了解周期值,我们将脉冲乘以2 µs。因此,我们寻找我们的倍数。在这种情况下,最接近2 µs的实际数字为2。

现在我们有了周期值:

并使用Div32函数:

现在我们有了一个常规的16位编号,我们将每个数字分开并乘以其实际值。该数字以毫秒为单位的周期值。随后,我们需要根据周期测量来计算频率。我们从数据寄存器中获取值(我们有10000个脉冲),然后使用等式3,我们解决频率:

我们继续除以10,以较低的数量,1000,除以与SMTFOSC有关的最接近的16位数量因子,在这种情况下为50000:

结果是50 Hz。我们可以根据其SMTFOSC和周期因子重复每个量表的过程。

完整的软件代码在代码列表以下。

表格1显示每个量表的SMT模块配置。表2显示了输入频率及其各自结果的摘要。



里卡多·希门尼斯(Ricardo Jimenez)拥有电子工程硕士学位。他是使用PIC微控制器的几个实验室笔记本的作者。

凯文·马丁内斯(Kevin A. Martinez)正在ITM攻读他的电子工程学位。

代码列表:期间和频率测量的软件代码

'* Name : SMT Module '* Authors : Ricardo Jimenez and Kevin Adrian Martinez '* Date : 7/06/2020 '* Version : 1.0 '* Notes : PBP3.1 Compiler '* : ;--- PIC16F1619 CONFIGURATION #CONFIG;启动配置位设置。__config _config1,_fosc_hs;设置FOSC HS模式。#endconfig;配置模式结束。trisa =%00100000;ra5设置为输入trisb = 0;PORTB设置为输出TRISC =%00000010;rb1设置为输入lata = 0:latb = 0:latc = 0; Clearing all Latches ANSELA = 0: ANSELB = 0: ANSELC = 0; All inputs set to digital OSCCON = %01111000; 16.000 MHZ Xtal OSCSTAT = %00010001; DEFINE OSC 16; x var word: CPRL var WORD: CPRH VAR WORD: CPRU var word: D0 VAR BYTE: D1 VAR BYTE: D2 VAR BYTE: D3 VAR BYTE: D4 VAR BYTE; err var byte: T var word: A var word: b var word:c var word:Ttot var word: Tvalue var word; CTOT VAR WORD:Period var word:fqz var word: C1 VAR WORD:C2 VAR WORD:C3 VAR WORD:C4 VAR WORD: C0 var word ; OPTION_REG.7=0; PORTB PULL UP resistors ENABLED DEFINE adc_bits 10; define adc_clock 3; define adc_sampleUs 50; ;------ENABLES 250HZ PWM USING THE EQUATION------------------ ;RC5PPS = %00001100; SETTING CCP1 AS AN OUTPUT AND ENABLE IT ;CCP1CON = %10001100; PWM mode selection and CCPx enabled ;PR2 = 249; Value obtained from equation ;T2CON = %11000000; enabling timer 2 ;CCPTMRS = %11111100; CCP1 IS BASED OFF TIMER 2 ;CCPR1L = %11110100; VALUE obtained from equation ;CCPR1H =%00000001; VALUE obtained from equation ;---------LCD CONFIGURATION--------------------------------- DEFINE LCD_DREG PORTB; DEFINE LCD_DBIT 4; DEFINE LCD_RSREG PORTA; DEFINE LCD_RSBIT 0; DEFINE LCD_EREG PORTA; DEFINE LCD_EBIT 1; DEFINE LCD_BITS 4; DEFINE LCD_LINES 2; DEFINE LCD_COMMANDUS 1500; DEFINE LCD_DATAUS 45; ;---------SETTING UP LCD----------------------------------- LCDOUT $FE,$28; $28 FUNCTION SET, 4 BITS LCDOUT $FE,$10; $10 SHIFT DISPLAY LCDOUT $FE,$0C; $0C DISPLAY ON LCDOUT $FE,$06; $06 ENTRY MODE SET ;------------------------------------------------------------------- ;setting STM module for period measurement SMT2SIG = 0; SIGNAL INPUT SELECT REGISTER, We use SMTSIG1 as input by default ;--------MAIN----- ;clearing variables D0 = 0; D1 = 0; D2 = 0; D3 = 0; D4 = 0; fqz = 0; T = 0 ;MAIN LOOP RPT: gosub FREQAUTO; this is the label where we calculate frequency. goto RPT; ;------------------------------------------------------------------------------- SMTRead: SMT2CON1 = %11000010; BIT7 as '1' for data acquisition, bit 6 to repeat acquisition, ; bits 0-4 for SMT operation mode, period and duty cycle STAY: IF SMT2STAT.0==1 THEN GOTO STAY; pause 50; this pause is for SMT sync purposes CPRL= SMT2CPRL; data is captured for first 8 bits CPRH= SMT2CPRH*256; data is captured for the next 8 bits CPRU= SMT2CPRU; data is captured for the next 8 bits Period= CPRL+CPRH; D0= Period DIG 0; D1= Period DIG 1; D2= Period DIG 2; D3= Period DIG 3; D4= Period DIG 4; SMT2CON1.7 = 0; BIT7 as '0' for interrupt data acquisition. return LCDSHOWHZ: LCDOUT $FE,$80," SMT MODULE "; $80 FIRST LINE LOCATION LCDOUT $FE,$C0,"T= ",DEC Ttot,"mS F=",dec fqz,"Hz"; $C0 SECOND LINE LOCATION pause 1000; goto RPT; RETURN; LCDSHOWHZ2: LCDOUT $FE,$80," SMT MODULE "; $80 FIRST LINE LOCATION LCDOUT $FE,$C0,"T=",DEC D4, DEC D3,".",DEC D2,DEC D1,"ms F=",dec fqz,"Hz"; $C0 SECOND LINE LOCATION pause 1000; goto RPT; RETURN; LCDSHOWKHZ: LCDOUT $FE,$80," SMT MODULE "; $80 FIRST LINE LOCATION LCDOUT $FE,$C0,"T=",DEC Ttot,"ms F=",dec fqz,"KHz"; $C0 SECOND LINE LOCATION pause 1000; goto RPT; RETURN; LCDSHOWMHZ: LCDOUT $FE,$80," SMT MODULE "; $80 FIRST LINE LOCATION LCDOUT $FE,$C0,"T=",DEC Ttot,"uS", "F=",dec fqz,"MHz"; $C0 SECOND LINE LOCATION pause 1000; goto RPT; RETURN; LCDSHOWMHZ2: LCDOUT $FE,$80," SMT MODULE "; $80 FIRST LINE LOCATION LCDOUT $FE,$C0,"T=",DEC Ttot,"nS", "F=",dec fqz,"MHz"; $C0 SECOND LINE LOCATION pause 1000; goto RPT; RETURN; FREQAUTO: ; 8Hz TO 100Hz SMT2CLK = %00000001; SMT CLOCK SELECTION REGISTER, set to Fosc/4 SMT2CON0 = %10000011; SMT CONTROL REGISTER, bit7 set as '1' enables the SMT function and prescaler 1:8 gosub SMTRead; T = (D4*10000) + (D3*1000) + (D2*100) + (D1*10) + D0 if T < 5000 then gosub FREQAUTO2 A = Period * 2 Tvalue = div32 10 C2= Tvalue DIG 2; C3= Tvalue DIG 3; C4= Tvalue DIG 4; Ttot = (C4*10000) + (C3*1000) + (C2*100) A = T/10; fqz = 50000/A if CPRU != 0 then gosub errSHOW; endif gosub LCDSHOWHZ; return; FREQAUTO2: ; 101--Hz TO 999Hz pause 50 SMT2CLK = %00000001; SMT CLOCK SELECTION REGISTER, set to Fosc/4 SMT2CON0 = %10000010; SMT CONTROL REGISTER, the bit7 set as '1' enable the SMT function and prescaler 1:4 gosub SMTRead T = (D4*10000) + (D3*1000) + (D2*100) + (D1*10) + D0 if T < 1000 then gosub FREQAUTO3 b=10000; c=100; A = b*c; fqz = DIV32 T if CPRU != 0 then gosub errSHOW; endif gosub LCDSHOWHZ2; return; FREQAUTO3: ; 1-KHz TO 999-K Hz SMT2CLK = 0; SMT CLOCK SELECTION REGISTER, we are using the Fosc SMT2CON0 = %10000000; SMT CONTROL REGISTER, the bit7 set as '1' enable the SMT function and prescaler 1:1 gosub SMTRead T=15984; T = (D4*10000) + (D3*1000) + (D2*100) + (D1*10) + D0 if T < 161 then gosub FREQAUTO4 A = Period * 625 ; 1/16Mhz Tvalue = div32 100; Period value in uS C2= Tvalue DIG 2; C3= Tvalue DIG 3; C4= Tvalue DIG 4; Ttot = (C4*10000) + (C3*1000) + (C2*100) b=16000; c=10 A = b*c; fqz = DIV32 T; if CPRU != 0 then gosub errSHOW; endif gosub LCDSHOWKHZ return; FREQAUTO4: ; 1.000-MHz TO 10.000-MHz SMT2CLK = 0; SMT CLOCK SELECTION REGISTER, we are using the Fosc SMT2CON0 = %10000000; SMT CONTROL REGISTER, the bit7 set as '1' enable the SMT functionv and prescaler 1:1 gosub SMTRead T = (D4*10000) + (D3*1000) + (D2*100) + (D1*10) + D0 if T < 1 then gosub errSHOW ; Tvalue = Period * 625; Period value in uS C1= Tvalue dig 1; C2= Tvalue DIG 2; C3= Tvalue DIG 3; C4= Tvalue DIG 4; Ttot = (C4*10000) + (C3*1000) + (C2*100) + (C1 * 10) fqz = 160/T; if CPRU != 0 then gosub errSHOW; endif gosub LCDSHOWMHZ2; return; errSHOW: LCDOUT $FE,$80," SMT MODULE "; $80 FIRST LINE LOCATION LCDOUT $FE,$C0," OUT OF RANGE "; $C0 SECOND LINE LOCATION pause 4000; RETURN; End

来自我们的合作伙伴

功率完整性表征信心

始终12位分辨率加上0.5%的增益精度可确保无与伦比的敏感测量精度,例如铁路塌陷表征…

75V同步降压控制器,具有宽输入电压和占空比范围

75V同步降压控制器,具有宽输入电压和占空比范围

功率完整性表征信心

高清晰度示波器(HDOS)比其他任何其他示波器提供了更高的分辨率和准确性,以进行高置信能力完整性验证…

测试复杂嵌入式系统中的电源导轨序列

2021年9月20日
嵌入式计算系统通常需要多个电源电压,以向微处理器,内存和其他机上设备传递电源。在...

表达您的意见!

本网站要求您注册或登录以发表评论。
尚未添加评论。想开始对话吗?
Baidu