找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32小车超声波+红外跟踪控制实验程序

[复制链接]
ID:339141 发表于 2018-5-27 16:09 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. /********************************* 深圳市航太电子有限公司 *******************************
  2. * 实 验 名 :小车超声波+红外跟踪实验
  3. * 实验说明 :使用超声波判断前方引导物的距离,使用红外来判断引导物的移动方向
  4. * 实验平台 :航太ARM单片机开发板
  5. * 连接方式 :请参考interface.h文件
  6. * 注    意 :1.因地面和轮子的差异,左右转向时需要根据实际需要调节差速的差值
  7. *            2.需要耐心调节红外避障的感应距离以及超声波控制距离
  8. *            3.建议使用不反光的书本作为引导物
  9. * 作    者 :航太电子产品研发部
  10. ****************************************************************************************/
  11. #include "stm32f10x.h"
  12. #include "interface.h"
  13. #include "LCD1602.h"
  14. #include "IRCtrol.h"
  15. #include "motor.h"
  16. #include "UltrasonicCtrol.h"

  17. //全局变量定义
  18. unsigned int speed_count=0;//占空比计数器 50次一周期
  19. char front_left_speed_duty=SPEED_DUTY;
  20. char front_right_speed_duty=SPEED_DUTY;
  21. char behind_left_speed_duty=SPEED_DUTY;
  22. char behind_right_speed_duty=SPEED_DUTY;

  23. unsigned char tick_5ms = 0;//5ms计数器,作为主函数的基本周期
  24. unsigned char tick_1ms = 0;//1ms计数器,作为电机的基本计数器
  25. unsigned char tick_200ms = 0;//刷新显示

  26. char ctrl_comm = COMM_STOP;//控制指令
  27. char ctrl_comm_last = COMM_STOP;//上一次的指令
  28. unsigned char continue_time=0;

  29. void InitIO()
  30. {
  31.         GPIO_InitTypeDef GPIO_InitStructure;

  32.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);//使能LED使用的GPIO时钟
  33.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  36.        
  37. GPIO_Init(GPIOE , &GPIO_InitStructure);//将使用LED灯相关的GPIO初始化
  38. GPIO_SetBits(GPIOE , GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);//关闭所有的LED指示灯
  39. }

  40. //障碍物查询和处理,一旦出现障碍物,禁止直行
  41. void BarrierProc()
  42. {
  43.        
  44.                 if(VOID_L_IO == BARRIER_N && VOID_R_IO == BARRIER_Y)//右转
  45.         {
  46.                 CarRight();
  47.                 Delayms(30);
  48.                 return;
  49.         }
  50.         else if(VOID_L_IO == BARRIER_Y && VOID_R_IO == BARRIER_N)//左转
  51.         {
  52.                 CarLeft();
  53.                 Delayms(30);
  54.                 return;
  55.         }       
  56.        
  57.         if((distance_cm >= 5 && distance_cm <= 7) || distance_cm > 50) //
  58.         {
  59.                 CarStop();//防震荡
  60.                 return;
  61.         }
  62.        
  63.         if(VOID_L_IO == VOID_R_IO)
  64.         {
  65.                 if(distance_cm < 5) CarBack();
  66.                 if(distance_cm > 7) CarGo();       
  67.         }
  68. }

  69. int main(void)
  70. {
  71.         delay_init();
  72.         //LCD1602Init();
  73.         //IRCtrolInit();
  74.         TIM2_Init();
  75.         MotorInit();
  76.         //ServoInit();
  77.         //UltraSoundInit();
  78. InitIO();
  79.         //RedRayInit();

  80. while(1)
  81. {
  82.          CarGo();
  83.          CarMove();
  84.          
  85.          
  86.          /*
  87.                          if(tick_5ms >= 5)
  88.                 {
  89.                         tick_5ms = 0;
  90.                         tick_200ms++;
  91.                         if(tick_200ms >= 40)
  92.                         {
  93.                                 tick_200ms = 0;
  94.                                 LEDToggle(GPIO_Pin_8);
  95.                                 LCD1602WriteDistance(distance_cm);//更新距离
  96.                         }
  97. //                        continue_time--;//200ms 无接收指令就停车
  98. //                        if(continue_time == 0)
  99. //                        {
  100. //                                continue_time = 1;
  101. //                                CarStop();
  102. //                        }
  103.                         //do something
  104.                         Distance();//计算距离
  105.                         BarrierProc();
  106. //                        if(ctrl_comm_last != ctrl_comm)//接收到红外信号
  107. //                        {
  108. //                                ctrl_comm_last = ctrl_comm;
  109. //                                switch(ctrl_comm)
  110. //                                {
  111. //                                        case COMM_UP:    CarGo();break;
  112. //                                        case COMM_DOWN:  CarBack();break;
  113. //                                        case COMM_LEFT:  CarLeft();break;
  114. //                                        case COMM_RIGHT: CarRight();break;
  115. //                                        case COMM_STOP:  CarStop();break;
  116. //                                        default : break;
  117. //                                }
  118. //                                LCD1602WriteCommand(ctrl_comm);
  119. //                        }
  120.                 }
  121.         */       
  122. }
  123. }

复制代码

所有资料51hei提供下载:
6.小车超声波+红外跟踪实验.rar (285.61 KB, 下载次数: 40)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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