找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1410|回复: 0
收起左侧

基于K60单片机控制的智能循迹避障小车程序

[复制链接]
ID:994606 发表于 2021-12-31 12:00 | 显示全部楼层 |阅读模式
这是上个月做的基于K60控制的智能循迹避障小车通过五路红外传感器使小车沿着黑线循迹
通过HC-SR04来进行避障
  1. #include "common.h"
  2. #include "include.h"

  3. int date=2;
  4. int i=3;
  5. int distance=399;   //测量距离
  6. int Time = 100000;
  7. uint32 timevar;

  8. //直行
  9. void straight()
  10. {
  11.     gpio_set(PTE8, 1);//右
  12.     gpio_set(PTE9, 0); //右
  13.     gpio_set(PTE10,0);//左
  14.     gpio_set(PTE11,1); //左
  15.     ftm_pwm_duty(FTM0, FTM_CH0,25);
  16.     ftm_pwm_duty(FTM0, FTM_CH2,25);
  17. }

  18. //慢直行
  19. void slow()
  20. {
  21.     gpio_set(PTE8, 1);//右
  22.     gpio_set(PTE9, 0); //右
  23.     gpio_set(PTE10,0);//左
  24.     gpio_set(PTE11,1); //左
  25.     ftm_pwm_duty(FTM0, FTM_CH0,10);
  26.     ftm_pwm_duty(FTM0, FTM_CH2,10);
  27. }

  28. //左转弯
  29. void left()
  30. {
  31.     gpio_set(PTE8, 1);//右
  32.     gpio_set(PTE9, 0); //右
  33.     gpio_set(PTE10,1);//左
  34.     gpio_set(PTE11,0); //左
  35.     ftm_pwm_duty(FTM0, FTM_CH0,23);
  36.     ftm_pwm_duty(FTM0, FTM_CH2,7);
  37. }

  38. //左转大弯
  39. void bigleft()
  40. {
  41.     gpio_set(PTE8,1);
  42.     gpio_set(PTE9,0);
  43.     gpio_set(PTE10,1);
  44.     gpio_set(PTE11,0);  
  45.     ftm_pwm_duty(FTM0, FTM_CH0,30);
  46.     ftm_pwm_duty(FTM0, FTM_CH2,12);
  47. }

  48. //右转弯
  49. void right()
  50. {
  51.     gpio_set(PTE8,0);
  52.     gpio_set(PTE9,1);
  53.     gpio_set(PTE10,0);
  54.     gpio_set(PTE11,1);
  55.     ftm_pwm_duty(FTM0, FTM_CH0,7);
  56.     ftm_pwm_duty(FTM0, FTM_CH2,23);
  57. }

  58. //右转大弯
  59. void bigright()
  60. {
  61.     gpio_set(PTE8,0);
  62.     gpio_set(PTE9,1);
  63.     gpio_set(PTE10,0);
  64.     gpio_set(PTE11,1);
  65.     ftm_pwm_duty(FTM0, FTM_CH0,12);
  66.     ftm_pwm_duty(FTM0, FTM_CH2,30);
  67. }

  68. //停
  69. void stop()
  70. {
  71.     gpio_set(PTE8,0);  
  72.     gpio_set(PTE9,0);  
  73.     gpio_set(PTE10,0);  
  74.     gpio_set(PTE11,0);
  75.     ftm_pwm_duty(FTM0, FTM_CH0,0);
  76.     ftm_pwm_duty(FTM0, FTM_CH2,0);
  77. }

  78. //后退
  79. void back()
  80. {
  81.     gpio_set(PTE8,0);  
  82.     gpio_set(PTE9,1);  
  83.     gpio_set(PTE10,1);  
  84.     gpio_set(PTE11,0);
  85.     ftm_pwm_duty(FTM0, FTM_CH0,17);
  86.     ftm_pwm_duty(FTM0, FTM_CH2,17);
  87. }
  88. //TRIG发射脉冲
  89. void trigpulse()
  90. {
  91.     gpio_set(PTA25,1);               //产生触发脉冲
  92.     systick_delay_us(15);      
  93.     gpio_set(PTA25,0);           //产生一个20us的高电平脉冲
  94. }

  95. //超声波测距
  96. void chaoshengbo()
  97. {   
  98.    
  99.     gpio_set(PTA25,1);               //产生触发脉冲
  100.     systick_delay_us(15);      
  101.     gpio_set(PTA25,0);           //产生一个20us的高电平脉冲
  102.     while(gpio_get(PTA27)==0);             //等待电平变高,低电平一直等待
  103.     pit_time_start(PIT0); //开始计时
  104.     while(gpio_get(PTA27)==1);      //等待电平变低,高电平一直等待   
  105.     Time=pit_time_get_us(PIT0);    //停止计时,获取计时时间
  106. //    timevar=Time*1000/bus_clk_khz;
  107. //    distance = timevar*(331.4+0.607*20)/20000;
  108.     distance = (int)(Time*1.7)/100;
  109.     systick_delay_ms(60);
  110. }


  111. //超声波左转
  112. void HCleft()
  113. {   
  114.     gpio_set(PTE8,1);
  115.     gpio_set(PTE9,0);
  116.     gpio_set(PTE10,0);
  117.     gpio_set(PTE11,1);
  118.     ftm_pwm_duty(FTM0, FTM_CH0,45);//右
  119.     ftm_pwm_duty(FTM0, FTM_CH2,15);//左
  120. }

  121. //超声波右转
  122. void HCright()
  123. {
  124.     gpio_set(PTE8,1);
  125.     gpio_set(PTE9,0);
  126.     gpio_set(PTE10,0);//左
  127.     gpio_set(PTE11,1); //左
  128.     ftm_pwm_duty(FTM0, FTM_CH0,15);
  129.     ftm_pwm_duty(FTM0, FTM_CH2,50);
  130. }

  131. void xunji()
  132. {
  133.            //循迹 PTB4-右轮
  134.         if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==1))
  135.         {   
  136. //            gpio_set(PTE8, 1);//右
  137. //            gpio_set(PTE9, 0); //右
  138. //            gpio_set(PTE10,0);//左
  139. //            gpio_set(PTE11,1); //左
  140. //            ftm_pwm_duty(FTM0, FTM_CH0,15);
  141. //            ftm_pwm_duty(FTM0, FTM_CH2,15);
  142.            slow();
  143.             systick_delay_ms(10);
  144.         }   
  145.         if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==0)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==1))
  146.         {   
  147.             straight();
  148.             systick_delay_ms(10);
  149.         }
  150.         //右转小弯
  151.         if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==0)&&(gpio_get(PTC0)==1))
  152.         {   
  153.             right();
  154.             systick_delay_ms(10);
  155.         }
  156.         //左转小弯
  157.         if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==0)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==1))
  158.         {   
  159.             left();
  160.             systick_delay_ms(10);
  161.         }            
  162.         //右转大弯
  163.         if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==0))
  164.         {            
  165.             bigright();
  166.             systick_delay_ms(10);
  167.         }
  168.         //左转大弯
  169.         if((gpio_get(PTB4)==0)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==1))
  170.         {
  171.             bigleft();
  172.             systick_delay_ms(10);
  173.         }
  174. }
  175. void pit2_hander()
  176. {
  177.     led (LED0,LED_ON);
  178.     led (LED1,LED_ON);
  179.     led (LED2,LED_ON);
  180.     date--;     
  181.     PIT_Flag_Clear(PIT2);
  182. }

  183. void main()
  184. {     
  185.     led_init(LED0);
  186.     led_init(LED1);
  187.     led_init(LED2);
  188.     gpio_init(PTE8, GPO, 1);
  189.     gpio_init(PTE9, GPO, 0);
  190.     gpio_init(PTE10, GPO,0);
  191.     gpio_init(PTE11, GPO,1);
  192.     gpio_init(PTB4, GPI, 0);
  193.     gpio_init(PTB5, GPI, 0);
  194.     gpio_init(PTB6, GPI, 0);
  195.     gpio_init(PTB7, GPI, 0);
  196.     gpio_init(PTC0, GPI, 0);
  197.     gpio_init(PTA25, GPO, 0); //TRIG
  198.     gpio_init  (PTA27, GPI, 0); //ECHO
  199.     ftm_pwm_init(FTM0, FTM_CH0,200,18);
  200.     ftm_pwm_init(FTM0, FTM_CH2,200,18);
  201.          
  202.     pit_init_ms(PIT2, 14000); //初始化 PIT2,定时时间为:14s
  203.     set_vector_handler(PIT2_VECTORn,pit2_hander);
  204.     enable_irq(PIT2_IRQn);
  205.    
  206. //    disable_irq(PIT2_IRQn);
  207.     while(i>2)//i>2   
  208.     {   
  209.         xunji();
  210.         while(date<2)
  211.         {
  212.             trigpulse();
  213.             chaoshengbo();
  214.             if(distance<70)
  215.             {     
  216.                 i=2;
  217.                 HCleft();  
  218.                 systick_delay_ms(1000);                    
  219.                 HCright();     
  220.                 systick_delay_ms(600);                  
  221.             }  
  222.         }   
  223.     }
  224.    while(i==2)
  225.    {     
  226.        xunji();
  227.     }
  228. }
复制代码





回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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