超声波避障小车原理就是通过给超声波模块超过10us的高电平信号,自动发送8个40KHZ的方波,来检测是不是有信号的返回,如果有信号的返回,那么就判断为前方有障碍物,并且通过舵机云台,来实现180度的旋转,检测左右两边是否的有障碍物,从而进行避障的功能。

说完原理,接下来就是根据各部件的原理来进行编程,我的超声波避障小车主要涉及了超声波HC-SR04模块,L298N电机驱动模块,舵机sg90模块。
首先是最基本的电机驱动模块的相关代码:

#include "bsp_motor.h"
#include "delay.h"
#include <math.h>void TIM4_PWM_Motor(unsigned int arr,unsigned int psc)
{   GPIO_InitTypeDef                    GPIO_InitStuct;TIM_TimeBaseInitTypeDef      TIM_TimeBaseInitStuct;TIM_OCInitTypeDef                 TIM_OCInitStuct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStuct.GPIO_Pin=GPIO_Pin_7;                      //左电机控制GPIO_InitStuct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStuct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStuct);GPIO_InitStuct.GPIO_Pin=GPIO_Pin_8;                        //左电机PWMGPIO_InitStuct.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStuct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStuct);GPIO_InitStuct.GPIO_Pin=GPIO_Pin_9;                        //右电机PWMGPIO_InitStuct.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStuct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStuct);GPIO_InitStuct.GPIO_Pin=GPIO_Pin_4;                        //右电机方向控制GPIO_InitStuct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStuct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStuct);TIM_TimeBaseInitStuct.TIM_ClockDivision=0;TIM_TimeBaseInitStuct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStuct.TIM_Period=arr;TIM_TimeBaseInitStuct.TIM_Prescaler=psc;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStuct);TIM_OCInitStuct.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStuct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStuct.TIM_Pulse = 0; TIM_OCInitStuct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM4, &TIM_OCInitStuct);  TIM_OC4Init(TIM4, &TIM_OCInitStuct);  TIM_CtrlPWMOutputs(TIM4,ENABLE);  TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_Cmd(TIM4, ENABLE);
}void car_run(unsigned char ucChannel,signed char cSpeed)
{short PWM; PWM = 7201 - fabs(cSpeed)*72;switch(ucChannel){case 0://右轮TIM_SetCompare3(TIM4,PWM);if (cSpeed>0) GPIO_ResetBits(GPIOA,GPIO_Pin_4);else if(cSpeed<0) GPIO_SetBits(GPIOA,GPIO_Pin_4);     break;case 1://左轮TIM_SetCompare4(TIM4,PWM); if (cSpeed>0) GPIO_SetBits(GPIOB,GPIO_Pin_7);else if (cSpeed<0)GPIO_ResetBits(GPIOB,GPIO_Pin_7);break;            }
}void Run_Go(signed char speed,int time)  //前进函数
{signed char f_speed = - speed;car_run(1,f_speed);car_run(0,speed);delay_ms(time);
}void Run_stop(int time) //刹车函数
{car_run(1,0);car_run(0,0);GPIO_ResetBits(GPIOA,GPIO_Pin_4);;GPIO_ResetBits(GPIOB,GPIO_Pin_7);;delay_ms(time);
}void Run_left(signed char speed,int time) //左转
{car_run(1,0);     car_run(0,speed);    delay_ms(time);
}
void Run_Spin_left(signed char speed,int time) //左旋转
{signed char u_speed = 100 - speed; car_run(1,speed);  car_run(0,u_speed);          delay_ms(time);                 }
void Run_right(signed char speed,int time)  //右转
{signed char f_speed = - speed;car_run(1,f_speed);   car_run(0,0);                delay_ms(time);
}
void Run_Spin_right(signed char speed,int time) //右旋转
{signed char u_speed = 100 - speed;signed char f_speed = - speed;car_run(1,-u_speed);   car_run(0,f_speed);           delay_ms(time);
}
void Run_back(signed char speed,int time) //后退
{signed char u_speed = 100- speed;signed char f_speed = - u_speed;car_run(1,u_speed);car_run(0,f_speed);delay_ms(time);
}

超声波检测距离的相关代码:

#include "bsp_hc.h"
#include "delay.h"
#define TRIG_PORT      GPIOC
#define ECHO_PORT      GPIOC
#define TRIG_PIN       GPIO_Pin_0
#define ECHO_PIN       GPIO_Pin_1float UltrasonicWave_Distance;
void UltrasonicWave_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;   EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           GPIO_Init(GPIOC, &GPIO_InitStructure);       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        GPIO_Init(GPIOC,&GPIO_InitStructure);              GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);EXTI_InitStructure.EXTI_Line = EXTI_Line1;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);                                NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;              NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                      NVIC_Init(&NVIC_InitStructure);
}void EXTI1_IRQHandler(void)
{delay_us(10);                           if(EXTI_GetITStatus(EXTI_Line1) != RESET){TIM_SetCounter(TIM2,0);TIM_Cmd(TIM2, ENABLE);                                      while(GPIO_ReadInputDataBit(GPIOC,ECHO_PIN));             TIM_Cmd(TIM2, DISABLE);                                            UltrasonicWave_Distance=TIM_GetCounter(TIM2)*5*34/200.0;           EXTI_ClearITPendingBit(EXTI_Line1); }
}
void Timerx_Init(uint16_t arr,uint16_t psc)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_TimeBaseStructure.TIM_Period = 5000;TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_Trigger,ENABLE);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);  }void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM2, TIM_IT_Update  ); }
}int UltrasonicWave_StartMeasure(void)
{int temp;GPIO_SetBits(TRIG_PORT,TRIG_PIN);           delay_us(20);                         GPIO_ResetBits(TRIG_PORT,TRIG_PIN);temp = UltrasonicWave_Distance*10;return temp;
}

舵机云台的相关代码:

#include "bsp_duoji.h"void TIM5_PWM_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = arr;TIM_TimeBaseStructure.TIM_Prescaler =psc;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM5, &TIM_OCInitStructure);TIM_CtrlPWMOutputs(TIM5,ENABLE);  TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); TIM_OC2Init(TIM5, &TIM_OCInitStructure);TIM_ARRPreloadConfig(TIM5, ENABLE); TIM_Cmd(TIM5, ENABLE);
}

最后是主函数:

#include "stm32f10x.h"
#include "bsp_motor.h"
#include "bsp_duoji.h"
#include "bsp_hc.h"
#include "delay.h"void duojizhuantou(float angle)
{angle=(u16)(50.0*angle/9.0+249.0);TIM_SetCompare1(TIM5,angle);
}int front_detection()
{duojizhuantou(90);delay_ms(100);return UltrasonicWave_StartMeasure();
}
int left_detection()
{duojizhuantou(175);delay_ms(300);return UltrasonicWave_StartMeasure();
}
int right_detection()
{duojizhuantou(5);delay_ms(300);return UltrasonicWave_StartMeasure();
}int main(void)
{Timerx_Init(4999,7199);   HC_GPIO();              TIM4_PWM_Motor(7199,0);TIM5_PWM_Init(9999,143); while(1){        if(front_detection()<60 && front_detection()>0) {Run_stop(500);       Run_back(60,500);   Run_stop(1000);         left_detection();delay_ms(500);right_detection();delay_ms(500);if((left_detection() < 60 ) &&( right_detection() < 60 )){Run_Spin_left(60,1000);}             else if(left_detection() > right_detection()){Run_left(60,1000);Run_stop(500);}  else{Run_right(60,1000);Run_stop(500);                  }                           }   else{Run_Go(60,10);}}}

基于STM32的超声波避障小车相关推荐

  1. 基于STM32三路超声波避障小车

    基于STM32的避障小车 最近几天的学习了STM32输入捕获输入捕获的相关知识,为了巩固自己学习的知识特意制作一辆有三个超声波组成的4轮避障小车来加深对输入捕获的理解. 1.输入捕获简介 输入捕获模式 ...

  2. stm32捕获占空比_基于STM32超声波避障小车

    不管是对于初学者还是对于一个玩过单片机的电子爱好者来说,或多或少都接触到过小车项目,今天给大家介绍的的一个项目基于STM32超声波避障小车.这也是我曾经的一个课设,在此开源分享给大家,全文5000多字 ...

  3. 基于51单片机的超声波避障小车设计(含Proteus仿真)

    超声波避障程序随处可见,基于51单片机的超声波避障小车也很成熟,但是完整的Proteus仿真并不容易找到开源资料. 这次主要给大家分享其Proteus仿真部分. 涉及到的模块有:超声波模块(hc-sr ...

  4. STM32F103RCT6 实验代码之舵机+超声波避障小车(一)杂谈+电机+L298N

    STM32 舵机+超声波避障 一.直流电机 二.L298N模块 寒假由于时间较长,自己就想做一个智能车玩玩,第一个做的是蓝牙小车,不过比较简单,我就不打算具体另开一个部分,到时候挑一些与避障小车不一样 ...

  5. 基于arduino单片机智能避障小车

    基于arduino单片机智能避障小车 思路简介 本文简要介绍了基于arduino单片机智能小车可以通过手机端蓝牙助手对其进行遥控操作'可以切换手动操作和自动避障两个模式,避障基于蝙蝠超声波测距的原理, ...

  6. 利用52单片机制作的超声波避障小车(包含所有源码)

    做这个超声波避障小车的原因是因为单片机课程设计 一.硬件部分 1.电机驱动 电机驱动四个输入端IN1.IN2.IN3和IN4,四个输出端OUT1.OUT2.OUT3和OUT4,一个接地端GND,单片机 ...

  7. 51单片机小车的立项书_毕业论文:基于51单片机智能避障小车的设计报告(范文1)...

    <毕业论文:基于51单片机智能避障小车的设计报告.doc>由会员分享,可免费在线阅读全文,更多与<毕业论文:基于51单片机智能避障小车的设计报告>相关文档资源请在帮帮文库(ww ...

  8. 基于STM32设计的避障寻迹小车

    一.前言 1.1 项目背景 根据美国玩具协会在一项研究中,过去几年全球玩具销售增长与GDP的世界平均水平大致相同.但全球玩具市场的内部结构已经占据了巨大的位置变化:传统玩具的市场份额正在下降,高科技电 ...

  9. STM32循迹避障小车制作代码详解(简单实现版)

    感谢几年来大家的支持,看到大家对工程的呼声很高,所以来把工程上传了,大家自行下载即可哈,谢谢大家支持 这个代码是进阶版的,就是可以跑的很快的,和上面博客的主要区别就是这个代码的避障机制并不是做在主ma ...

  10. STM32F103RCT6 实验代码之舵机+超声波避障小车(三)蓝牙遥控

    STM32 蓝牙遥控 一.蓝牙简述 二.蓝牙遥控 一.蓝牙简述 我这次把小车的坑补上,这是小车的最后一个部分,蓝牙遥控.这个部分重点在于蓝牙,其实蓝牙可以相当于一个串口,用串口通信就可以进行手机与单片 ...

最新文章

  1. ACM的java 傻瓜式教学
  2. mysql数据实时同步:Canal安装部署、kafka安装、zk安装、mysql安装、Canal Server+Canal Client HA,Canal+mysql+Kafka,相关验证(学习笔记)
  3. c语言5的阶乘流程图_2020年,5种将死的编程语言!
  4. 几个常用shell脚本命令
  5. 里用gam使用_第一次使用Roam一头雾水?
  6. 读《白帽子讲Web安全》之客户端脚本安全(一)
  7. stm32时钟配置总结
  8. Qt4: Show an image in your widget – 在Qt里面显示图像
  9. 虚拟化VMware ESXi 6.7服务器安装配置
  10. python集成开发环境运行快捷键_Python初学者选择集成开发环境必看 python开发
  11. 巧用PPT模板,远离翻车风险
  12. 使用 Python 合并地图瓦片
  13. 使用深度图重建世界坐标
  14. 页面无法自动播放音频的解决方案
  15. Vue绘制业务流程图(附源码)
  16. Android Studio||动态改变xml图片位置+背景/旋转+平移/AnimationSet/java读取drawable图
  17. Julia开发工具Atom+Juno的安装与使用
  18. idea jdk版本设置
  19. 1.可编程并行接口实验
  20. Java —— 内存泄露排查

热门文章

  1. 【数学模型】银行贷款计算系统含Matlab源码
  2. HDMI接口定义,传输流程
  3. 阿特拉斯拧紧枪说明书_阿特拉斯使用说明书(全).pdf
  4. kettle官网下载
  5. WS2811单线传输三通道LED驱动控制专用芯片
  6. html5查看xps文件,c# – 在文档查看器中显示XPS文档
  7. POM文件详解(如何组织POM文件)
  8. 【Jsp】第七课 Jsp内置对象的学习和使用
  9. java架构师之路-并发编程
  10. 《Mimics软件临床应用:计算机辅助外科手术》目录摘要