找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3628|回复: 1
收起左侧

stm32循迹避障小车代码

[复制链接]
ID:380211 发表于 2018-12-20 08:11 | 显示全部楼层 |阅读模式
  1. #include "PID.h"
  2. #include "stm32f10x.h"
  3. #include "motor.h"
  4. #include "delay.h"
  5. u16 ReadData = 0xffff;
  6. int BasicSpeed = 0;
  7. int LeftSpeed = 0;
  8. int RightSpeed = 0;
  9. int basespeed = 530;
  10. unsigned char bizhangflag1 = 0;
  11. unsigned char bizhangflag2 = 0;
  12. unsigned char bizhangflag3 = 0;
  13. unsigned char catchflag = 0;
  14. //红外对管对应于PF1~PF10
  15. void TIM4_IRQHandler(void)
  16. {
  17.         static int LastError = 0;
  18.         static int CurrentError = 0;
  19.         static unsigned int PIDCounter = 0;
  20.         unsigned char PIDflag = 0;
  21.         static int DiffError = 0;
  22. //        static int delay_time = 0;
  23. //        static int IntError = 0;
  24.         int Output = 0;
  25.         unsigned char cornerflag = 0;
  26.         if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)
  27.         {
  28.         //        TIM_Cmd(TIM4, DISABLE);
  29.                 ReadData = GPIO_ReadInputData(GPIOF);       
  30.        
  31.                 /***************************************特殊情况******************************************************/

  32.                 /***************************************直角情况*******************************************/                                                               
  33.                 if(ReadData == 0xff81||ReadData==0xff03||ReadData==0xff01||ReadData==0xffc1||ReadData==0xff83||ReadData==0xff07||
  34.                    ReadData == 0xffe1||ReadData==0xffc3||ReadData==0xff87)
  35.                 {
  36.                         delay_ms(15);
  37.                         if(GPIO_ReadInputData(GPIOF)==0xffff)
  38.                         {                                                                                                                                                                                               
  39.                                  motor(0,0);
  40.                     delay_ms(10);
  41.                                 motor(-500,-500);
  42.                                 delay_ms(250);
  43.                                 motor(-500,500);
  44.                                 while((GPIO_ReadInputData(GPIOF)!= 0xff9f)&&(GPIO_ReadInputData(GPIOF)!=0xffbf)&&(GPIO_ReadInputData(GPIOF)!=0xff1f)
  45.                                          &&(GPIO_ReadInputData(GPIOF)!=0xff3f)&&(GPIO_ReadInputData(GPIOF)!=0xff8f));
  46.                                 cornerflag = 1;
  47.                         }
  48.                 }
  49.                 if(ReadData ==0xf80f||ReadData ==0xf81f||ReadData==0xfc0f||ReadData==0xfc1f||ReadData==0xf83f||ReadData==0xfe0f||
  50.                    ReadData ==0xf87f||ReadData ==0xfc3f||ReadData==0xff0f)
  51.                 {
  52.                         delay_ms(10);
  53.                         if(GPIO_ReadInputData(GPIOF)==0xffff)
  54.                         {
  55.                                    motor(0,0);
  56.                                 delay_ms(10);
  57.                                 motor(-500,-500);
  58.                                 delay_ms(250);
  59.                                 motor(500,-500);
  60.                                 while((GPIO_ReadInputData(GPIOF)!= 0xff9f)&&(GPIO_ReadInputData(GPIOF)!=0xffbf)&&(GPIO_ReadInputData(GPIOF)!=0xff1f)&&
  61.                                             (GPIO_ReadInputData(GPIOF)!=0xff3f)&&(GPIO_ReadInputData(GPIOF)!=0xff8f));
  62.                                 cornerflag = 1;
  63.                         }
  64.                 }       
  65.                 /***********************************虚线情况******************************/
  66.                 if(ReadData == 0xffff)
  67.                 {
  68.                         motor(540,550);
  69.                         delay_us(30);
  70.                         cornerflag = 1;
  71.                 }         
  72.                 /***********************************************************************************************/
  73.                 if(PIDCounter<10)                                  
  74.                 {
  75.                         PIDCounter++;
  76.                 }
  77.                 if(PIDCounter == 10)
  78.                 {
  79.                         PIDflag = 1;
  80.                         PIDCounter = 0;
  81.                 }
  82.                 if((PIDflag == 1)||(cornerflag == 1))
  83.                 {
  84.                         PIDflag=0;
  85.                         cornerflag = 0;
  86.                         LastError = CurrentError;
  87.                         switch(ReadData)   //使用Pf1~Pf10
  88.                         {
  89.                                 case 0xff9f:CurrentError = 0;break;//1111 111110011110
  90.                                 case 0xffbf:CurrentError = 1;break;//1111 111110111110
  91.                                 case 0xff3f:CurrentError = 3;break;//1111 111100111110                          
  92.                                 case 0xff7f:CurrentError = 4;break;//1111 111101111110
  93.                                 case 0xfe7f:CurrentError = 6;break;//1111 111001111110
  94.                                 case 0xfeff:CurrentError = 7;break;//1111 111011111110
  95.                                 case 0xfcff:CurrentError = 9;break;//1111 110011111110
  96.                                 case 0xfdff:CurrentError = 12;break;//1111 110111111110
  97.                                 case 0xf9ff:CurrentError = 14;break;//1111 100111111110
  98.                                 case 0xfbff:CurrentError = 16;break;//1111 101111111110       
  99.                                 case 0xffdf:CurrentError = -0;break;//1111 111111011110
  100.                                 case 0xffcf:CurrentError = -1;break;//1111 111111001110
  101.                                 case 0xffef:CurrentError = -3;break;//1111 111111101110
  102.                                 case 0xffe7:CurrentError = -6;break;//1111 111111100110
  103.                                 case 0xff77:CurrentError = -7;break;//1111 111101110110
  104.                                 case 0xfff3:CurrentError = -9;break;//1111 111111110010
  105.                                 case 0xfffb:CurrentError = -12;break;//1111 11111111010
  106.                                 case 0xfff9:CurrentError = -14;break;//1111 11111111000
  107.                                 case 0xfffc:CurrentError = -16;break;//1111 11111111100
  108.                                 case 0xff1f:CurrentError = 3;break;//1111 111100011110
  109.                                 case 0xfe3f:CurrentError = 6;break;//1111 111000111110       
  110.                                 case 0xfc7f:CurrentError = 12;break;//1111 110001111110
  111.                                 case 0xf8ff:CurrentError = 17;break;//1111 100011111110                 
  112.                                 case 0xff8f:CurrentError = -3;break;//1111 111110001110
  113.                                 case 0xffc7:CurrentError = -6;break;//1111 111111000110       
  114.                                 case 0xffe3:CurrentError = -12;break;//1111 111111100010
  115.                                 case 0xfff1:CurrentError = -17;break;//1111 111111110000
  116.                                 default:break;
  117.                         }
  118.                         if((CurrentError-LastError)>=6||((CurrentError-LastError)<=-6))
  119.                         {
  120.                                  BasicSpeed = 80 ;       
  121.                                  if((CurrentError>=7)||(CurrentError<=-7))
  122.                                  {
  123.                                          BasicSpeed = 40;
  124.                                  }
  125.                         }
  126.                         else
  127.                         {
  128.                                 BasicSpeed = basespeed;
  129.                         }
  130.                         DiffError = CurrentError - LastError;
  131.                         Output = CurrentError * 45 + DiffError * 560 ;
  132.                         LeftSpeed = BasicSpeed - 6 + Output;
  133.                         RightSpeed = BasicSpeed - Output;
  134.                         if(LeftSpeed>550)
  135.                         {
  136.                                 LeftSpeed = 550;
  137.                         }  
  138.                         else if(LeftSpeed < -500)
  139.                         {
  140.                                 LeftSpeed = -500;
  141.                         }
  142.                         if(RightSpeed>550)
  143.                         {
  144.                                 RightSpeed = 550;
  145.                         }
  146.                         else if(RightSpeed < -500)
  147.                         {
  148.                                 RightSpeed = -500;
  149.                         }
  150.                                
  151.                         motor(LeftSpeed,RightSpeed);
  152.                         //TIM_ClearITPendingBit(TIM4,TIM_FLAG_Update);
  153.                 }
  154.         }
  155. //        TIM_Cmd(TIM4, ENABLE);
  156.         TIM_ClearITPendingBit(TIM4,TIM_FLAG_Update);       
  157. }  

  158. void EXTI4_IRQHandler(void)
  159. {
  160.         TIM_Cmd(TIM4, DISABLE);
  161. //        delay_ms(15);
  162.         if( GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)
  163.         {
  164.                 if(bizhangflag1 == 0)  //第一次壁障  抄近道
  165.                 {
  166.                         bizhangflag1 = 1;
  167.                         motor(0,0);
  168.                         delay_ms(145);
  169.                         motor(0,500);
  170.                         delay_ms(200);
  171.                         motor(545,550);
  172.                         delay_ms(1160);
  173.                         while((GPIO_ReadInputData(GPIOF)!= 0xff9f)&&(GPIO_ReadInputData(GPIOF)!=0xffbf)&&(GPIO_ReadInputData(GPIOF)!=0xff1f)&&
  174.                                  (GPIO_ReadInputData(GPIOF)!=0xff3f)&&(GPIO_ReadInputData(GPIOF)!=0xff8f)&&(GPIO_ReadInputData(GPIOF)!=0xffc7)
  175.                                  &&(GPIO_ReadInputData(GPIOF)!=0xfe3f)&&(GPIO_ReadInputData(GPIOF)!=0xffbf)&&(GPIO_ReadInputData(GPIOF)!=0xffcf)
  176.                                  &&(GPIO_ReadInputData(GPIOF)!=0xfff9)&&(GPIO_ReadInputData(GPIOF)!=0xf9ff)&&(GPIO_ReadInputData(GPIOF)!=0xfffb)&&
  177.                                  (GPIO_ReadInputData(GPIOF)!=0xfdff));
  178.                 }
  179.                 else
  180.                 {
  181.                         if(bizhangflag3 == 0)                //第二次壁障 减速  准备抓东西
  182.                         {
  183.                                 catchflag = 1;
  184.                                 bizhangflag3 = 1;
  185.                                 motor(0,0);
  186.                                 delay_ms(400);
  187.                                 basespeed = 120;
  188.                         }       
  189.                         else if(bizhangflag3 == 1)        //第三次壁障  减速  准备放东西
  190.                         {
  191.                                 catchflag = 1;
  192.                                 basespeed = 200;
  193.                         }       
  194.                 }
  195.         }
  196.         TIM_Cmd(TIM4, ENABLE);       
  197.         EXTI_ClearITPendingBit(EXTI_Line4);
  198. }                 
  199. void EXTI2_IRQHandler(void)
  200. {
  201. //        delay_ms(5);
  202.         if( (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0)&&(catchflag == 1))
  203.         {
  204.                 if(bizhangflag2 == 0)                        //第一次触碰开关   抓东西 绕开障碍物
  205.                 {
  206.                         TIM_Cmd(TIM4, DISABLE);
  207.                         catchflag = 0;
  208.                         bizhangflag2= 1;
  209.                         motor(50,50);
  210.                         delay_ms(10);
  211.                         basespeed = 490;
  212.                         starthand();
  213.                         delay_ms(500);
  214.                         motor(-400,-400);
  215.                         delay_ms(400);
  216.                         motor(0,0);
  217.                         delay_ms(100);
  218.                 //        motor(400,0);
  219.                         //delay_ms(8);
  220.                 //        motor(0,0);
  221.                 //        delay_ms(100);
  222.                         motor(280,540);
  223.                         while((GPIO_ReadInputData(GPIOF)!= 0xff9f)&&(GPIO_ReadInputData(GPIOF)!=0xffbf)&&(GPIO_ReadInputData(GPIOF)!=0xff1f)&&
  224.                                  (GPIO_ReadInputData(GPIOF)!=0xff3f)&&(GPIO_ReadInputData(GPIOF)!=0xff8f)&&(GPIO_ReadInputData(GPIOF)!=0xffc7)
  225.                                  &&(GPIO_ReadInputData(GPIOF)!=0xfe3f)&&(GPIO_ReadInputData(GPIOF)!=0xffbf)&&(GPIO_ReadInputData(GPIOF)!=0xffcf));
  226.                 //        motor(0,0);
  227.                 //
  228.                         delay_ms(30);
  229.                         TIM_Cmd(TIM4, ENABLE);       
  230.        
  231.                 }
  232.                 else                                   //第二次触碰开关  放东西 全场结束
  233.                 {
  234.                         motor(0,0);
  235.                         delay_ms(100);
  236.                         endhand();
  237.                         while(1); //全场结束

  238.                 }
  239.         }
  240.         EXTI_ClearITPendingBit(EXTI_Line2);
  241.        
  242. }


复制代码

所有资料51hei提供下载:
巡线小车程序.7z (209.03 KB, 下载次数: 32)
回复

使用道具 举报

ID:1 发表于 2018-12-20 16:20 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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