本文主要介绍测速器原理和测速器的程序,以及此测速器的理论上的性能和误差来源。个人知识有限,不对的地方还请多包涵。
一.测速器原理
此测速器测量飞行物体经过A、B两点的距离,以及所耗时间来计算物体的移动速度。距离的设置为两个测速传感器之间的距离。时间检测由飞行物体对两对红外收发管遮挡的时间差来实现。
二.测速程序
两传感器之间的实际距离为10cm,程序中设置为0.1m。红外遮挡检测由定时器捕获功能实现。使用两个通道分别捕获物体经过两传感器的时间点。然后相减得出物体通过时间。
GPIO初始化,这里使用的定时器5的两个捕获通道
中断优先级设置
定时器5的配置
测速器主程序
- SuDuStructure.distance = 0.1;
- LCD_Show();
-
- while(1)
- {
- if(SuDuStructure.Capture_FinishFlag == 1)
- {
- temp = SuDuStructure.Capture_Period * (0XFFFF+1) + (SuDuStructure.Capture_CcrValue+1);
- SuDuStructure.time = ((float)temp)/72;//us
- if(SuDuStructure.time)
- SuDuStructure.sudu = SuDuStructure.distance/(SuDuStructure.time/1000000);
- LCD_Show();
- SuDuStructure.Capture_FinishFlag = 0;
- }
- }
复制代码
参数显示程序
- void LCD_Show(void)
- {
- char dispBuff[100];
-
- LCD_Clear(WHITE);
-
- Show_Str(60,30,200,24,"²âËÙÆ÷",24,0);
- sprintf(dispBuff,"ËÙ¶È: %.2fm/s",SuDuStructure.sudu);
- Show_Str(30,90,200,16,(uint8_t *)dispBuff,16,0);
-
- sprintf(dispBuff,"¾àÀë: %.2fm",SuDuStructure.distance);
- Show_Str(30,110,200,16,(uint8_t *)dispBuff,16,0);
-
- sprintf(dispBuff,"ʱ¼ä: %.3fus",SuDuStructure.time);
- Show_Str(30,130,200,16,(uint8_t *)dispBuff,16,0);
-
- sprintf(dispBuff,"´ÎÊý1: %d",SuDuStructure.Capture1_times);
- Show_Str(30,150,200,16,(uint8_t *)dispBuff,16,0);
-
- sprintf(dispBuff,"´ÎÊý2: %d",SuDuStructure.Capture2_times);
- Show_Str(30,170,200,16,(uint8_t *)dispBuff,16,0);
- }
复制代码
捕获中断程序
- void TIM5_IRQHandler(void)
- {
- if( TIM_GetITStatus ( TIM5, TIM_IT_Update) != RESET )
- {
- SuDuStructure.Capture_Period++;
- if(SuDuStructure.Capture_Period>5493)//5S
- {
- SuDuStructure.Capture_StartFlag = 0;
- SuDuStructure.Capture1_times = 0;
- SuDuStructure.Capture2_times = 0;
- }
- TIM_ClearITPendingBit ( TIM5, TIM_FLAG_Update );
- }
- if( TIM_GetITStatus (TIM5, TIM_IT_CC3 ) != RESET)
- {
- if( SuDuStructure.Capture_StartFlag == 0 )
- {
- TIM_SetCounter( TIM5, 0 );
- SuDuStructure.Capture_Period = 0;
- SuDuStructure.Capture_CcrValue = 0;
- SuDuStructure.Capture1_times = 0;
- SuDuStructure.Capture2_times = 0;
- SuDuStructure.Capture_StartFlag = 1;
- }
- SuDuStructure.Capture1_times++;
- TIM_ClearITPendingBit (TIM5,TIM_IT_CC3);
- }
- if( TIM_GetITStatus (TIM5, TIM_IT_CC4 ) != RESET)
- {
- if((SuDuStructure.Capture_StartFlag == 1) && (SuDuStructure.Capture_FinishFlag == 0))
- {
- SuDuStructure.Capture_CcrValue = TIM_GetCapture4(TIM5);
- SuDuStructure.Capture_StartFlag = 0;
- SuDuStructure.Capture_FinishFlag = 1;
- }
- SuDuStructure.Capture2_times++;
- TIM_ClearITPendingBit (TIM5,TIM_IT_CC4);
- }
- }
复制代码
三.测速器性能估算
对于此测速器而言,距离设置10cm固定不变。对于正点原子STM32精英开发板上的芯片来说,当AHB总线速度为72M时,APB1必须2分频。而APB1 Timer Cloks是由APB1*2得来的。所以定时器5的分辨率在14ns。可以测量的极限速度是7143Km/S。STM32虽然有中断咬尾等机制中断响应一流,但是两个时钟内能否挂起2个中断本人还真不是很了解,有明白人麻烦分享一下。
四.误差来源
1.两传感器距离误差
2.两对红外发射与接收之间的距离一致性上的误差,以及接收管对光的折射角度不同导致的误差
3.单片机时钟误差
4.接收板运放电路增益和频率特性差异导致的误差
|