基于STM32的超声波避障小车
超声波避障小车原理就是通过给超声波模块超过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的超声波避障小车相关推荐
- 基于STM32三路超声波避障小车
基于STM32的避障小车 最近几天的学习了STM32输入捕获输入捕获的相关知识,为了巩固自己学习的知识特意制作一辆有三个超声波组成的4轮避障小车来加深对输入捕获的理解. 1.输入捕获简介 输入捕获模式 ...
- stm32捕获占空比_基于STM32超声波避障小车
不管是对于初学者还是对于一个玩过单片机的电子爱好者来说,或多或少都接触到过小车项目,今天给大家介绍的的一个项目基于STM32超声波避障小车.这也是我曾经的一个课设,在此开源分享给大家,全文5000多字 ...
- 基于51单片机的超声波避障小车设计(含Proteus仿真)
超声波避障程序随处可见,基于51单片机的超声波避障小车也很成熟,但是完整的Proteus仿真并不容易找到开源资料. 这次主要给大家分享其Proteus仿真部分. 涉及到的模块有:超声波模块(hc-sr ...
- STM32F103RCT6 实验代码之舵机+超声波避障小车(一)杂谈+电机+L298N
STM32 舵机+超声波避障 一.直流电机 二.L298N模块 寒假由于时间较长,自己就想做一个智能车玩玩,第一个做的是蓝牙小车,不过比较简单,我就不打算具体另开一个部分,到时候挑一些与避障小车不一样 ...
- 基于arduino单片机智能避障小车
基于arduino单片机智能避障小车 思路简介 本文简要介绍了基于arduino单片机智能小车可以通过手机端蓝牙助手对其进行遥控操作'可以切换手动操作和自动避障两个模式,避障基于蝙蝠超声波测距的原理, ...
- 利用52单片机制作的超声波避障小车(包含所有源码)
做这个超声波避障小车的原因是因为单片机课程设计 一.硬件部分 1.电机驱动 电机驱动四个输入端IN1.IN2.IN3和IN4,四个输出端OUT1.OUT2.OUT3和OUT4,一个接地端GND,单片机 ...
- 51单片机小车的立项书_毕业论文:基于51单片机智能避障小车的设计报告(范文1)...
<毕业论文:基于51单片机智能避障小车的设计报告.doc>由会员分享,可免费在线阅读全文,更多与<毕业论文:基于51单片机智能避障小车的设计报告>相关文档资源请在帮帮文库(ww ...
- 基于STM32设计的避障寻迹小车
一.前言 1.1 项目背景 根据美国玩具协会在一项研究中,过去几年全球玩具销售增长与GDP的世界平均水平大致相同.但全球玩具市场的内部结构已经占据了巨大的位置变化:传统玩具的市场份额正在下降,高科技电 ...
- STM32循迹避障小车制作代码详解(简单实现版)
感谢几年来大家的支持,看到大家对工程的呼声很高,所以来把工程上传了,大家自行下载即可哈,谢谢大家支持 这个代码是进阶版的,就是可以跑的很快的,和上面博客的主要区别就是这个代码的避障机制并不是做在主ma ...
- STM32F103RCT6 实验代码之舵机+超声波避障小车(三)蓝牙遥控
STM32 蓝牙遥控 一.蓝牙简述 二.蓝牙遥控 一.蓝牙简述 我这次把小车的坑补上,这是小车的最后一个部分,蓝牙遥控.这个部分重点在于蓝牙,其实蓝牙可以相当于一个串口,用串口通信就可以进行手机与单片 ...
最新文章
- ACM的java 傻瓜式教学
- mysql数据实时同步:Canal安装部署、kafka安装、zk安装、mysql安装、Canal Server+Canal Client HA,Canal+mysql+Kafka,相关验证(学习笔记)
- c语言5的阶乘流程图_2020年,5种将死的编程语言!
- 几个常用shell脚本命令
- 里用gam使用_第一次使用Roam一头雾水?
- 读《白帽子讲Web安全》之客户端脚本安全(一)
- stm32时钟配置总结
- Qt4: Show an image in your widget – 在Qt里面显示图像
- 虚拟化VMware ESXi 6.7服务器安装配置
- python集成开发环境运行快捷键_Python初学者选择集成开发环境必看 python开发
- 巧用PPT模板,远离翻车风险
- 使用 Python 合并地图瓦片
- 使用深度图重建世界坐标
- 页面无法自动播放音频的解决方案
- Vue绘制业务流程图(附源码)
- Android Studio||动态改变xml图片位置+背景/旋转+平移/AnimationSet/java读取drawable图
- Julia开发工具Atom+Juno的安装与使用
- idea jdk版本设置
- 1.可编程并行接口实验
- Java —— 内存泄露排查