设计并制作闸门时间为1s的数字频率计.docx
- 文档编号:27203998
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:25
- 大小:899.82KB
设计并制作闸门时间为1s的数字频率计.docx
《设计并制作闸门时间为1s的数字频率计.docx》由会员分享,可在线阅读,更多相关《设计并制作闸门时间为1s的数字频率计.docx(25页珍藏版)》请在冰豆网上搜索。
设计并制作闸门时间为1s的数字频率计
摘要
频率计用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。
通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1s。
本设计以ARM核心处理器,设计并制作了闸门时间为1s的数字频率计,能够测量频率。
该频率计硬件部分高速比较器74HC14整形电路组成。
利用32定时器的ETR功能可准确测出低高频信号,实现了对正弦波的频率测量。
经测试该频率计性能良好,正弦信号频率测量范围可从1Hz到25MHz。
关键词:
STM32;高速比较;;测频
一、系统方案论述
1.整形电路的比较与选择
方案一:
由施密特触发器对74HC14信号进行调理,可以直接输出TTL电平,。
方案二:
由比较器整形后的信号再由施密特整形,输出TTL电平。
从性能上讲此方案较好,但是由于时间问题,找不到合适的高速比较器和施密特触发器组合。
综上选择方案一。
2.微处理器的比较与选择
方案一:
采用STM32对调理后的信号测频。
输入信号的测量能达到频率达到100MHz,测频精度高,速度快。
方案二:
采用430测频,但是最多测量到16M而且引脚速度不够
导致无法完成指标内的频率测量
为了更好地实现题目要求,我们选择方案一。
3.测频方法的选择与比较
方案一:
输入捕获测频法是累积单位时间里的周波数,在频率较低时采用。
频率较高时精度低,但不适合高频的测量。
方案二:
周期法是测一个周期的时间,通过周期转换成频率,在频率较低时采用。
频率较低时精度高但不适合高频。
方案三:
利用ETR外部信号触发将外部的信号(测量信号)作为计数信号,不用经历中断产生时间延时,ETR可以直接作为时钟输入也可以通过触发输入(TRGI)来作为时钟输入即在时钟模式1中触发源选择为ETR,两个效果上是一样的。
可准确测出低高频,在低频段使用不分频ETR触发,高频时使用4分频测量提高测量范围。
由于输入信号的要求为1Hz~25MHz,所以选择方案三。
4.系统总体方案
通过高速比较器74HC14对信号源的波形进行整形,输出标准的方波。
STM32测量波形并且在LCD上显示。
5.测频精度分析
由于输入信号的频率范围为1Hz~25MHz,所以stm32采用定时器的外部触发功能测频的方法,低频不分频,高频采用4分频测频。
STM32强大的数据处理能力大大提高了测频的精度。
二、电路与程序设计
1电路设计
74HC14的作用:
六反相斯密特触发器
74HC14是一款兼容TTL器件引脚的高速CMOS器件,逻辑功能为6路斯密特触发反相器,其耗电量低,速度快。
在电子工业中,现已基本取代74LS14(TTL器件)。
74HC14引脚图:
图1引脚功能
74HC14真值表:
真值表:
Y=A
Input输入
output输出
A
Y
L
H
H
L
图1-1基本电路仿真图
图1-2F=10M正弦波整形方波
图1-3F=25M正弦波整形波图
由此可见74HC14的整形时间有限到25M就难以整形,实际电路中74HC14仍然可以整形25M正弦波,只是波形幅度小失真较大。
图1-4实物25M整形方波图
2程序设计
STM32定时器ETR功能简述
ETR:
外部触发输入引脚,如果用外部信号产生触发事件的话,信号就从这个脚进来。
时钟来源——时钟可以由下列时钟源提供:
·内部时钟(CK_INT)
·外部时钟模式1:
外部输入脚(TIx)
·外部时钟模式2:
外部触发输入(ETR)
STM32的定时器具有计数功能,在实际应用中可以用来对引脚上的输入信号进行统计。
其输入信号作为计数时钟,输入引脚为ETR。
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0);
使用ETR时钟作为计数时钟需要设置为外部时钟模式2,故调用该函数,在设置时
1、关闭预分频:
TIM_ExtTRGPSC_OFF。
可选项:
TIM_ExtTRGPSC_OFF0x0000
TIM_ExtTRGPSC_DIV20x1000
TIM_ExtTRGPSC_DIV40x2000
TIM_ExtTRGPSC_DIV80x3000
2、外部触发极性ETR不反相,高电平或上升沿有效:
TIM_ExtTRGPolarity_NonInverted。
可选项:
TIM_ExtTRGPolarity_Inverted和
TIM_ExtTRGPolarity_NonInverted。
3、外部触发无滤波器:
0000。
TIMx_ETR和TIMx_CHx有什么区别?
答:
TIMx_ETR在计数器之前,可以作为计数器的计数时钟,而TIMx_CHx在计数器之后。
程序流程图如下
开启定时器4
(定时1秒)
TIM3ETR计数(0分频)
TIM2ETR计数(4分频
否
引脚本系统软件设计部分基于ARM平台,主要完成频率的测量和显示。
充分利用了stm32高速处理高频信号的能力。
程序如下。
三、测试方案与测试结果
1测试仪器和方案
(1)测试仪器:
100MTektronixTDS1012C-EDU数字示波器
25M信号发生器RIGOLDG4102
(2)测试方案:
通过定幅值变频率测试频率计的性能;
2测试结果
(1)频率适应性
测试结果见表F-1。
表F-1
设定(Hz)
实测(Hz)
设定(kHz)
实测(Hz)
设定(MHz)
实测(Hz)
1
1.0000
10
10000
1
999989
100
100
100
99996
5
4999790
300
300
300
299995
10
9999680
600
600
600
599996
15
14999189
900
900
900
899996
25
249998840
最大相对误差为11600/25*10^6=4.65*10^(-5)符合题目误差要求。
(2)实际测试图
F=25M
F=100KHZ
F=1HZ
(3)测试结果与分析
由各项测试结果可知,该设计很好的完成了基本要求和发挥部分的要求,且大部分误差远远低于题目要求,性能良好。
四、总结
本频率计的设计采用STM32控制器的方案较好的完成了题目所有的基本要求和发挥部分。
采用等精度测频,低频和高频的精确度都比较好。
对输入信号的进行调理,为软件测频提供了强力的支持。
由于74HC14的整形波形范围有限,到25M以上就开始严重至真,而单片机直接测信号发生器的方波能测到40M以上,未来需要在整形和滤波下功夫,争取测到100M以上。
参考文献
【1】
用STM32触发捕捉实现高速高精度测频黄春平中山职业技术学院电子信息工程系,中山528404【XX文库】
[2黄智伟.全国大学生电子设计竞赛电路设计(第2版)[M].北京:
北京航空航天大学出版社,2011.1
[3]张志成基于STM32单片机的频率计的设计河西学院物理与机电工程学院
五、程序代码
#include"led.h"
#include"delay.h"
#include"key.h"
#include"sys.h"
#include"lcd.h"
#include"usart.h"
#include"adc.h"
#include"stm32f10x_tim.h"
#include"malloc.h"
#include"string.h"
#include"mmc_sd.h"
#include"ff.h"
#include"exfuns.h"
#include"fontupd.h"
#include"text.h"
#include"flash.h"
u8cc=24;
u32x=0,y=0;
externu32f;
externu32l,nn;
//ALIENTEK战舰STM32开发板实验17
//ADC实验
//技术支持:
//广州市星翼电子科技有限公司
voidTIM2_GPIO_Configuration(void);
voidTIM2_Configuration(void);
voidTIM4_Init(void);
voidPluse_Get_init(void);
intmain(void)
{
u16adcx;
floattemp;
delay_init();//延时函数初始化
NVIC_Configuration();//设置NVIC中断分组2:
2位抢占优先级,2位响应优先级
uart_init(9600);//串口初始化为9600
LED_Init();//LED端口初始化
LCD_Init();
//Adc_Init();//ADC初始化
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,200,16,16,"WarShipSTM32");
LCD_ShowString(60,70,200,16,16,"DACTEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
POINT_COLOR=RED;
LCD_ShowString(60,110,200,16,16,"MYNAMEIS:
JIANGTIAN");
LCD_ShowString(60,130,200,16,16,"NUM:
20134470104");
LCD_ShowString(60,150,200,16,16,"LOWFre:
HZ");
LCD_ShowString(60,190,200,16,16,"HIGFre:
HZ");
TIM4_Init();
TIM3_GPIO_Configuration();
TIM2_GPIO_Configuration();
TIM2_Configuration();
Pluse_Get_init();
TIM5_Int_Init(4999,7199);
while
(1)
{
}
}
voidTIM2_GPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50M时钟速度
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
voidTIM2_Configuration(void)//只用一个外部脉冲端口
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//配置TIMER2作为计数器
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period=0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler=0x00;
TIM_TimeBaseStructure.TIM_ClockDivision=0x0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_ITConfig(//使能或者失能指定的TIM中断
TIM2,//TIM2
TIM_IT_Update,//TIM允许更新,触发
ENABLE//使能
);
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//先占优先级03级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_DIV4,TIM_ExtTRGPolarity_NonInverted,0);
TIM_SetCounter(TIM2,0);
TIM_Cmd(TIM2,ENABLE);
}
voidTIM4_Init(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//时钟使能
TIM_TimeBaseStructure.TIM_Period=4999;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler=7199;//设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:
TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(//使能或者失能指定的TIM中断
TIM4,//TIM2
TIM_IT_Update|//TIM中断源
TIM_IT_Trigger,//TIM触发中断源
ENABLE//使能
);
TIM_ARRPreloadConfig(TIM4,ENABLE);//使能TIMx在ARR上的预装载寄存器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM4,ENABLE);//使能TIMx外设
}
u32count,counter1;
u32sum=0,counter;
voidTIM4_IRQHandler(void)//TIM4中断
{
//TIM_Cmd(TIM2,DISABLE);
if(TIM_GetITStatus(TIM4,TIM_IT_Update)!
=RESET)//检查指定的TIM中断发生与否:
TIM中断源
{
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
counter=(u32)TIM_GetCounter(TIM2);
TIM_SetCounter(TIM2,0);
sum=sum+counter;
count++;
if(count==2)
{
x=counter1*65536+sum;
x=x*4;
if(x>200000)
{
LCD_ShowxNum(124,190,x,9,16,0);
}else
{
LCD_ShowxNum(124,190,0,9,16,0);
}
//LCD_ShowxNum(124,150,f,9,16,0);
sum=0;
count=0;
counter1=0;
LED1=!
LED1;
}
}
}
voidPluse_Get_init(void)
{
TIM2_GPIO_Configuration();
TIM2_Configuration();
TIM4_Init();
}
voidTIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!
=RESET)//检查指定的TIM中断发生与否:
TIM中断源
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
counter1=counter1+1;
}
}
#include"timer.h"
#include"led.h"
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:
自动重装值。
//psc:
时钟预分频数
//这里使用的是定时器3!
u32f=0;
u32cont=0,fff;
u32l,n,nn;
u16this_time_CH1=0;
u16last_time_CH1=0;
u16capture_number_CH1=0;
u16tmp16_CH1;
//定时器1通道1输入捕获配置
voidTIM5_Int_Init(u16arr,u16psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//时钟使能
TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision=0;//设置时钟分割:
TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(//使能或者失能指定的TIM中断
TIM5,//TIM2
TIM_IT_Update,
ENABLE//使能
);
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;//TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM5,ENABLE);//使能TIMx外设
}
voidTIM5_IRQHandler(void)//TIM3中断
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)!
=RESET)//检查指定的TIM中断发生与否:
TIM中断源
{
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);//清除TIMx的中断待处理位:
TIM中断源
fff=(u32)TIM_GetCounter(TIM3);
TIM_SetCounter(TIM3,0);
cont+=fff;
l++;
if(l==2)
{
f=nn*65536+cont;
if(f<200000)
{
LCD_ShowxNum(124,150,f,9,16,0);
}else
{
LCD_ShowxNum(124,150,0,9,16,0);
}
cont=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 制作 闸门 时间 数字频率计