STM32/STM8技术论坛
直播中

654524

12年用户 475经验值
擅长:嵌入式技术 模拟技术 控制/MCU
私信 关注
[经验]

【STM32F103试用体验】(五)箭矢、水弹测速器程序与理论性能

    本文主要介绍测速器原理和测速器的程序,以及此测速器的理论上的性能和误差来源。个人知识有限,不对的地方还请多包涵。

    一.测速器原理


此测速器测量飞行物体经过A、B两点的距离,以及所耗时间来计算物体的移动速度。距离的设置为两个测速传感器之间的距离。时间检测由飞行物体对两对红外收发管遮挡的时间差来实现。


    二.测速程序


    两传感器之间的实际距离为10cm,程序中设置为0.1m。红外遮挡检测由定时器捕获功能实现。使用两个通道分别捕获物体经过两传感器的时间点。然后相减得出物体通过时间。


    GPIO初始化,这里使用的定时器5的两个捕获通道


QQ截图20181111205054.jpg

    中断优先级设置

2.jpg

    定时器5的配置

3.jpg

    测速器主程序

  1. SuDuStructure.distance = 0.1;
  2.         LCD_Show();
  3.         
  4.         while(1)
  5.         {
  6.                 if(SuDuStructure.Capture_FinishFlag == 1)
  7.                 {
  8.                         temp = SuDuStructure.Capture_Period * (0XFFFF+1) + (SuDuStructure.Capture_CcrValue+1);
  9.                         SuDuStructure.time = ((float)temp)/72;//us
  10.                         if(SuDuStructure.time)
  11.                                 SuDuStructure.sudu = SuDuStructure.distance/(SuDuStructure.time/1000000);
  12.                         LCD_Show();
  13.                         SuDuStructure.Capture_FinishFlag = 0;                        
  14.                 }        
  15.         }


     参数显示程序

  1. void LCD_Show(void)
  2. {
  3.         char dispBuff[100];
  4.         
  5.   LCD_Clear(WHITE);
  6.         
  7.         Show_Str(60,30,200,24,"²âËÙÆ÷",24,0);

  8.         sprintf(dispBuff,"ËÙ¶È:    %.2fm/s",SuDuStructure.sudu);
  9.         Show_Str(30,90,200,16,(uint8_t *)dispBuff,16,0);
  10.         
  11.         sprintf(dispBuff,"¾àÀë:   %.2fm",SuDuStructure.distance);
  12.         Show_Str(30,110,200,16,(uint8_t *)dispBuff,16,0);
  13.         
  14.         sprintf(dispBuff,"ʱ¼ä:       %.3fus",SuDuStructure.time);
  15.         Show_Str(30,130,200,16,(uint8_t *)dispBuff,16,0);
  16.         
  17.         sprintf(dispBuff,"´ÎÊý1:  %d",SuDuStructure.Capture1_times);
  18.         Show_Str(30,150,200,16,(uint8_t *)dispBuff,16,0);
  19.         
  20.         sprintf(dispBuff,"´ÎÊý2:  %d",SuDuStructure.Capture2_times);
  21.         Show_Str(30,170,200,16,(uint8_t *)dispBuff,16,0);
  22. }


    捕获中断程序


  1. void TIM5_IRQHandler(void)
  2. {
  3. if( TIM_GetITStatus ( TIM5, TIM_IT_Update) != RESET )               
  4. {
  5. SuDuStructure.Capture_Period++;
  6. if(SuDuStructure.Capture_Period>5493)//5S
  7. {
  8. SuDuStructure.Capture_StartFlag = 0;
  9. SuDuStructure.Capture1_times = 0;
  10. SuDuStructure.Capture2_times = 0;
  11. }
  12. TIM_ClearITPendingBit ( TIM5, TIM_FLAG_Update );
  13. }

  14. if( TIM_GetITStatus (TIM5, TIM_IT_CC3 ) != RESET)
  15. {
  16. if( SuDuStructure.Capture_StartFlag == 0 )
  17. {
  18. TIM_SetCounter( TIM5, 0 );
  19. SuDuStructure.Capture_Period = 0;
  20. SuDuStructure.Capture_CcrValue = 0;
  21. SuDuStructure.Capture1_times = 0;
  22. SuDuStructure.Capture2_times = 0;
  23. SuDuStructure.Capture_StartFlag = 1;
  24. }
  25. SuDuStructure.Capture1_times++;
  26. TIM_ClearITPendingBit (TIM5,TIM_IT_CC3);            
  27. }
  28. if( TIM_GetITStatus (TIM5, TIM_IT_CC4 ) != RESET)
  29. {
  30. if((SuDuStructure.Capture_StartFlag == 1) && (SuDuStructure.Capture_FinishFlag == 0))
  31. {
  32. SuDuStructure.Capture_CcrValue = TIM_GetCapture4(TIM5);
  33. SuDuStructure.Capture_StartFlag = 0;
  34. SuDuStructure.Capture_FinishFlag = 1;
  35. }
  36. SuDuStructure.Capture2_times++;
  37. TIM_ClearITPendingBit (TIM5,TIM_IT_CC4);            
  38. }
  39. }



    三.测速器性能估算

    对于此测速器而言,距离设置10cm固定不变。对于正点原子STM32精英开发板上的芯片来说,当AHB总线速度为72M时,APB1必须2分频。而APB1 Timer Cloks是由APB1*2得来的。所以定时器5的分辨率在14ns。可以测量的极限速度是7143Km/S。STM32虽然有中断咬尾等机制中断响应一流,但是两个时钟内能否挂起2个中断本人还真不是很了解,有明白人麻烦分享一下。


    四.误差来源

1.两传感器距离误差
    2.两对红外发射与接收之间的距离一致性上的误差,以及接收管对光的折射角度不同导致的误差
    3.单片机时钟误差
    4.接收板运放电路增益和频率特性差异导致的误差









更多回帖

发帖
×
20
完善资料,
赚取积分