设计并制作闸门时间为1s的数字频率计_第1页
设计并制作闸门时间为1s的数字频率计_第2页
设计并制作闸门时间为1s的数字频率计_第3页
设计并制作闸门时间为1s的数字频率计_第4页
设计并制作闸门时间为1s的数字频率计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要频率计用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为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分频测量提高测量范围。由于输入信号的要求为1Hz25MHz,所以选择方案三。4.系统总体方案通过高速比较器74HC14对信号源的波形进行整形,输出标准的方波。STM32测量波形并且在LCD上显示。5.测频精度分析由于输入信号的频率范围为1Hz25MHz,所以stm32采用定时器的外部触发功能测频的方法,低频不分频,高频采用4分频测频。STM32强大的数据处理能力大大提高了测频的精度。二、电路与程序设计1电路设计74HC14的作用:六反相斯密特触发器74HC14是一款兼容TTL器件引脚的高速CMOS器件,逻辑功能为6路斯密特触发反相器,其耗电量低,速度快。在电子工业中,现已基本取代74LS14(TTL器件)。74HC14引脚图: 图1 引脚功能74HC14真值表:真值表:Y=AInput输入output输出AYLHHL图1-1基本电路仿真图图1-2 F=10M 正弦波整形方波图1-3 F=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_OFF 0x0000 TIM_ExtTRGPSC_DIV2 0x1000 TIM_ExtTRGPSC_DIV4 0x2000 TIM_ExtTRGPSC_DIV8 0x30002、外部触发极性ETR不反相,高电平或上升沿有效:TIM_ExtTRGPolarity_NonInverted。 可选项: TIM_ExtTRGPolarity_Inverted和 TIM_ExtTRGPolarity_NonInverted。3、外部触发无滤波器:0000。TIMx_ETR和TIMx_CHx有什么区别?答:TIMx_ETR在计数器之前,可以作为计数器的计数时钟,而TIMx_CHx在计数器之后。程序流程图如下 MAIN函数 开启定时器5(定时1秒)开启定时器4(定时1秒) TIM3 ETR计数(0分频)TIM2 ETR计数(4分频否否TIM4是否计数溢出?TIM3是否计数溢出是是 取出TIM3-CNT的计数值并算出频率取出TIM2-CNT的计数值并计算出频率LCD显示LOW,HIG频率值引脚本系统软件设计部分基于ARM平台,主要完成频率的测量和显示。充分利用了stm32高速处理高频信号的能力。程序如下。三、测试方案与测试结果1测试仪器和方案 (1)测试仪器:100M Tektronix TDS 1012C-EDU数字示波器 25M信号发生器RIGOL DG4102 (2)测试方案:通过定幅值变频率测试频率计的性能; 2测试结果(1) 频率适应性测试结果见表F-1。表F-1设定(Hz)实测(Hz)设定(kHz)实测(Hz)设定(MHz)实测(Hz)11.0000101000019999891001001009999654999790300300300299995109999680600600600599996151499918990090090089999625249998840最大相对误差为11600/25*106=4.65*10(-5)符合题目误差要求。(2)实际测试图 F=25M F=100KHZ F=1HZ (3) 测试结果与分析由各项测试结果可知,该设计很好的完成了基本要求和发挥部分的要求,且大部分误差远远低于题目要求,性能良好。四、总结本频率计的设计采用STM32控制器的方案较好的完成了题目所有的基本要求和发挥部分。采用等精度测频,低频和高频的精确度都比较好。对输入信号的进行调理,为软件测频提供了强力的支持。由于74HC14的整形波形范围有限,到25M以上就开始严重至真,而单片机直接测信号发生器的方波能测到40M以上,未来需要在整形和滤波下功夫,争取测到100M以上。参考文献【1】用STM32触发捕捉实现高速高精度测频 黄春平 中山职业技术学院电子信息工程系,中山528404【百度文库】2黄智伟.全国大学生电子设计竞赛电路设计(第2版)M.北京:北京航空航天大学出版社,2011.13 张志成 基于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.hu8 cc=24;u32 x=0,y=0; extern u32 f; extern u32 l,nn;/ALIENTEK战舰STM32开发板实验17/ADC 实验 /技术支持:/广州市星翼电子科技有限公司 void TIM2_GPIO_Configuration(void);void TIM2_Configuration(void);void TIM4_Init(void);void Pluse_Get_init(void); int main(void) u16 adcx;float temp;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,WarShip STM32);LCD_ShowString(60,70,200,16,16,DAC TEST);LCD_ShowString(60,90,200,16,16,ATOMALIENTEK); POINT_COLOR=RED; LCD_ShowString(60,110,200,16,16,MY NAME IS:JIANG TIAN); LCD_ShowString(60,130,200,16,16,NUM:20134470104); LCD_ShowString(60,150,200,16,16,LOW Fre: HZ); LCD_ShowString(60,190,200,16,16,HIG Fre: HZ); TIM4_Init(); TIM3_GPIO_Configuration();TIM2_GPIO_Configuration();TIM2_Configuration();Pluse_Get_init();TIM5_Int_Init(4999,7199);while(1)void TIM2_GPIO_Configuration(void) GPIO_InitTypeDef GPIO_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);void TIM2_Configuration(void) /只用一个外部脉冲端口TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ;NVIC_InitTypeDef NVIC_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, /TIM2TIM_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); void TIM4_Init(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); /时钟使能TIM_TimeBaseStructure.TIM_Period =4999; /设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500msTIM_TimeBaseStructure.TIM_Prescaler =7199; /设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); /根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig( /使能或者失能指定的TIM中断TIM4, /TIM2TIM_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外设 u32 count,counter1;u32 sum=0,counter;void TIM4_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(x200000)LCD_ShowxNum(124,190,x,9,16,0);elseLCD_ShowxNum(124,190,0,9,16,0);/LCD_ShowxNum(124,150,f,9,16,0); sum=0; count=0;counter1=0; LED1=!LED1; void Pluse_Get_init(void) TIM2_GPIO_Configuration();TIM2_Configuration();TIM4_Init(); void TIM2_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! u32 f=0; u32 cont=0,fff; u32 l,n,nn; u16 this_time_CH1 = 0; u16 last_time_CH1 = 0; u16 capture_number_CH1 = 0;u16 tmp16_CH1;/定时器1通道1输入捕获配置void TIM5_Int_Init(u16 arr,u16 psc) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); /时钟使能TIM_TimeBaseStructure.TIM_Period = arr; /设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500msTIM_TimeBaseStructure.TIM_Prescaler =psc; /设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; /设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /TIM向上计数模式TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); /根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig( /使能或者失能指定的TIM中断TIM5, /TIM2TIM_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外设 void TIM5_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(f200000)LCD_ShowxNum(124,150,f,9,16,0);elseLCD_ShowxNum(124,150,0,9,16,0); cont=0; nn=0; l=0;/TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); /清除TIMx的中断待处理位:TIM 中断源 /void TIM3_GPIO_Configuration(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ; GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /50M时钟速度GPIO_Init(GPIOD, &GPIO_InitStructure);/TIM_TimeBaseInitTypeDef TIM_TimeBas

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论