找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1981|回复: 0
打印 上一主题 下一主题
收起左侧

stm32f103ze电磁循迹超声波避障停车源程序

[复制链接]
跳转到指定楼层
楼主
采用三个电感循迹和超声波避障
制作出来的实物图如下:


单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"
  6. #include "timer.h"
  7. #include "moto.h"
  8. #include "pwm.h"
  9. #include "lcd.h"

  10. #define Trig PGout(1)                //PC1        TRIG
  11. //函数声明
  12. void UltrasonicWave_Configuration(void);
  13. void UltrasonicWave_StartMeasure(void);
  14. void TIM5_Int_Init(u16 arr,u16 psc);
  15. extern int Sensor_Left,Sensor_Middle,Sensor_Right;//电磁巡线相关
  16. extern float Velocity_KP,Velocity_KI,Sensor,sum;               //速度控制PID参数
  17. extern float Velocity,Velocity_Set,Turn,Angle_Set;
  18. extern int Motor_A,Motor_B,Servo,Target_A,Target_B;  //电机控制相关
  19. extern int Encoder_Left,Encoder_Right;             //左右编码器的脉冲计数

  20. extern u8  TIM5CH1_CAPTURE_STA;                //输入捕获状态                                                   
  21. extern u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值        

  22. //void TIM3_Int_Init(u16 arr,u16 psc);

  23. void UltrasonicWave_Configuration(void)
  24. {
  25.         GPIO_InitTypeDef GPIO_InitStructure;
  26.         
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);

  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                         
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
  30.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  31.         GPIO_Init(GPIOG, &GPIO_InitStructure);                       
  32. }
  33. void UltrasonicWave_StartMeasure(void)
  34. {
  35.         Trig = 1;
  36.         delay_us(20);                                      //??20US
  37.         Trig = 0;
  38.         
  39. }
  40. int main(void)
  41. {               
  42.   u32 temp=0;
  43.         float UltrasonicWave_Distance=0;      //计算出的距离
  44.         delay_init();                     //延时函数初始化         
  45.         Encoder_Init_TIM2();            //=====编码器接口
  46.         delay_ms(100);
  47.         Encoder_Init_TIM3();            //=====初始化编码器
  48.   delay_ms(100);         
  49.   Motor_PWM_Init(7199,0);                                  //=====初始化PWM 10KHZ,用于驱动电机
  50.         delay_ms(100);
  51.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  52.         UltrasonicWave_Configuration();
  53.         TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数
  54.         ele_Init();  //=====电磁传感器初始化
  55.         delay_ms(100);
  56.         
  57.          LED_Init();                             //LED端口初始化
  58.         LCD_Init();
  59.                  
  60.         POINT_COLOR=RED;
  61.         delay_ms(100);
  62.         //TIM5_Int_Init(5000,71);//10Khz的计数频率,计数到5000为500ms
  63. delay_ms(100);         
  64.            while(1)
  65.         {
  66.                 UltrasonicWave_StartMeasure();//开始测距
  67.                 if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
  68.                 {
  69.                         temp=TIM5CH1_CAPTURE_STA&0X3F;
  70.                         temp*=65536;//溢出时间总和
  71.                         temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
  72.                         
  73.                         UltrasonicWave_Distance=(float)temp*170/10000;//距离计算公式:距离=高电平持续时间*声速/2   
  74.                                                                                                                   //即 距离= 高电平持续时间*340*100/(2*1000 000) = 高电平持续时间*170/10000
  75.                         //printf("Distance:%f cm\r\n",UltrasonicWave_Distance);//打印总的高点平时间
  76.                         TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
  77.                 }
  78.                 LCD_ShowString(10,40,200,16,16,"TFTLCD TEST");
  79.                 LCD_ShowxNum(10,60,Sensor_Left,4,16,0);
  80.                 LCD_ShowxNum(10,80,Sensor_Middle,4,16,0);
  81.                 LCD_ShowxNum(10,100,Sensor_Right,4,16,0);
  82.                 LCD_ShowxNum(10,120,Turn,4,16,0);
  83.                 LCD_ShowxNum(10,140,Sensor,4,16,0);
  84.                 LCD_ShowxNum(10,160,UltrasonicWave_Distance,4,16,0);
  85.     Sensor_Left=Get_Adc(11);                //采集左边电感的数据
  86.                 Sensor_Right=Get_Adc(13);               //采集右边电感的数据
  87.                 Sensor_Middle=Get_Adc(12);              //采集中间电感的数据
  88.                 sum=Sensor_Left-Sensor_Right;  //归一化处理
  89.                 Sensor=150*sum/(Sensor_Left+Sensor_Middle+Sensor_Right+1);   //求偏差
  90.                 Sensor=Sensor>120?120:Sensor;
  91.                 Sensor=Sensor<-120?-120:Sensor;
  92.                 Get_RC();//pid计算输出
  93.                 if(UltrasonicWave_Distance>15)
  94.                 {
  95.                                 PWMA1=4000+Turn,PWMA2=0;        
  96.                                 PWMB1=0,PWMB2=3200+Turn;
  97.                 }
  98.                 else
  99.                 {
  100.                     PWMA1=7200+Turn,PWMA2=0;        
  101.                                 PWMB1=0,PWMB2=0+Turn;
  102.                 }
  103.                 //LED0=!LED0;
  104.                 //delay_ms(200);//测试主程序是否卡死
  105.         
  106.         }         
  107. }         
  108. u8  TIM5CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
  109. u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值

  110. //定时器5中断服务程序         
  111. void TIM5_IRQHandler(void)
  112. {

  113.          if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获        
  114.         {         
  115.                 if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)//检查TIM5更新中断发生与否
  116.                  
  117.                 {            
  118.                         if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
  119.                         {
  120.                                 if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
  121.                                 {
  122.                                         TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
  123.                                         TIM5CH1_CAPTURE_VAL=0XFFFF;
  124.                                 }
  125.                                 else TIM5CH1_CAPTURE_STA++;
  126.                         }         
  127.                 }
  128.                 if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
  129.                 {        
  130.                         if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                 
  131.                         {                                 
  132.                                 TIM5CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
  133.                                 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
  134.                                    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
  135.                         }
  136.                         else                                                                  //还未开始,第一次捕获上升沿
  137.                         {
  138.                                 TIM5CH1_CAPTURE_STA=0;                        //清空
  139.                                 TIM5CH1_CAPTURE_VAL=0;
  140.                                  TIM_SetCounter(TIM5,0);
  141.                                 TIM5CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
  142.                                    TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获
  143.                         }                    
  144.                 }                                                                                    
  145.          }

  146.     TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

  147. }

  148. //定时器3中断服务程序
  149. //void TIM5_IRQHandler(void)   //TIM3中断
  150. //{
  151. //        if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
  152. //                {
  153. //                        
  154. //                        TIM_ClearITPendingBit(TIM5, TIM_IT_Update  );  //清除TIMx更新中断标志
  155. ////  if(Flag_Target==1)  '
  156. //                          
  157. //                                                                        
  158. //                        //LED1=!LED1;//测试中断
  159. //                        //         if(Flag_Target==0)
  160. ////         {
  161. //                                        //        Encoder_Left=Read_Encoder(2);                                       //===读取编码器的值                                                         //为了保证M法测速的时间基准,首先读取编码器数据
  162. //                                        //        Encoder_Right=-Read_Encoder(3);                                      //===读取编码器的值
  163. //                                                Get_RC();
  164. //                                                //Kinematic_Analysis(Velocity,Turn);                                                                                                                             //小车运动学分析   
  165. ////Motor_A=Incremental_PI_A(Encoder_Left,Target_A);                   //===速度闭环控制计算电机A最终PWM
  166. //                                //        Motor_B=Incremental_PI_B(Encoder_Right,Target_B);                  //===速度闭环控制计算电机B最终PWM
  167. //                                //                Xianfu_Pwm();                                                      //===PWM限幅
  168. //                                  //Set_Pwm(Motor_A,Motor_B,Servo);                                          //===赋值给PWM寄存器                  
  169. ////         }
  170. //                }
  171. //}
复制代码

所有资料51hei提供下载:
xunji5.16.7z (234.08 KB, 下载次数: 37)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表