STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

这篇具有很好参考价值的文章主要介绍了STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇)
二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速)
三、小车3.0——避障小车(超声波+舵机云台)
四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传)
五、双轮自平衡小车(HAL库版)——点此学习吧



前言

提示:学习这篇文章《超声波避障小车》之前还需要掌握小车驱动以及超声波测距的相关内容

学习完HC-SR04超声波模块的使用以及怎样驱动小车之后,就可以通过简单的代码实现基础的蓝牙避障小车了。
HC-SR04超声波模块的使用详见----->《超声波模块的使用》
小车驱动程序的讲解详见 ----------->小车驱动(这个链接是蓝牙小车的,驱动部分不用看usart中内容)


提示:以下是本篇文章正文内容,下面案例可供参考

一、前期准备

需要准备
STM32F103C8T6 —————————— 1个
12V电池————–—————————— 1个
L298N电机驱动 ——————————— 2个
小车底座 —————————————— 1个
稳压模块或者可调降压模块 —————— 1个
超声波模块HC-SR04————————— 1个
舵机SG90 -————————————— 1个

二、CubeMX中的设置

2.1. 时钟树的配置

(1)点击RCC开启HSE和LSE,并选择RC或晶体作为时钟源
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)
(2)配置时钟树
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

最终最右侧显示为
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

2.2. TIM的设置

2.2.1. TIM2设置

(1)点击TIM2,在Mode选项中设置Clock Source为Internal Clock。设置Channel1为PWM Generation CH1,Channel2为PWM Generation CH2,其余默认即可。
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)
(2)在Mode下面的Configuration选项中Parameter Settings的参数设置
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)
(3)TIM2 的GPIO参数设置
CH1,CH2都设置为推挽输出,高速
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

2.2.2. TIM3设置

(1)点击TIM3,在Mode选项中设置Clock Source为Internal Clock。
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)
(2)在Mode下面的Configuration选项中Parameter Settings的参数设置
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)
(3)TIM3中NVIC设置
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

2.2.3. TIM4设置

(1)点击TIM4,在Mode选项中设置Clock Source为Internal Clock,并将TIM4_CH4设置为输入捕获模式
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

(2)在Mode下面的Configuration选项中Parameter Settings的参数设置
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)
(3)TIM4中NVIC设置
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)
(4)TIM4 的GPIO参数设置
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

2.3. INx分配的GPIO参数配置

注意:这里的GPIO设置只用添加电机模块的INx以及超声波的发送端Trig,其余的已经在TIM的设置中配置过了

2.3.1. INx设置:

8个INx与PA11的参数设置一致,但是User Label不一样,对应如下:
IN1——PA8
IN2——PA12
IN3——PA13
IN4——PA14
IN11——PA15
IN22——PB0
IN33——PB1
IN44——PB2
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)
最终结果为:
STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

2.3.2. Trig设置:

STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

自此就全部设置完了
最终:

STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

三、代码

注意:这里我仅添加了超声波输入捕获测距程序和舵机PWM调速,小车驱动的程序见前言的链接

总体项目代码结构

STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

3.1. 超声波输入捕获代码

chaoshengbo.h

#ifndef CHAOSHENGBO_CHAOSHENGBO_H_
#define CHAOSHENGBO_CHAOSHENGBO_H_

#include "stm32f1xx_hal.h" //HAL库文件声明
#include <main.h>
#include "../delay/delay.h"


#define TRIG_ON  HAL_GPIO_WritePin(GPIOB, TRIG_Pin, GPIO_PIN_SET)   //定义TRIG输出高电平
#define TRIG_OFF  HAL_GPIO_WritePin(GPIOB, TRIG_Pin, GPIO_PIN_RESET)//定义TRIG输出低电平
extern TIM_HandleTypeDef htim4;//声明TIM4的HAL库结构体
extern TIM_HandleTypeDef htim3;//声明TIM3的HAL库结构体

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);//定时器中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);//定时器输入捕获中断回调函数

#endif /* CHAOSHENGBO_CHAOSHENGBO_H_ */

chaoshengbo.c

#include "chaoshengbo.h"


/********************************************************************************************
 *设置变量
 *distances:超声波所测距离
 *t        :回响信号脉冲持续时间
 *high_time[0]:回响信号脉冲上升沿发生时间
 *high_time[1]:回响信号脉冲下降沿发生时间
 *c_values :标志值,用于定时器输入捕获回调函数

 ********************************************************************************************/
float distances;
uint32_t t=0;
uint32_t high_time[2]={0};
uint8_t c_values=0;

/********************************************************************************************
 * 定时器中断回调函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 *
 * 说明:
 * 因为SR04每次发送超声波的时间间隔要大于60ms,
 * 故通过Cube MX 已经将TIM3设置为100ms的定时器,每隔100ms才执行一次这个定时器中断回调函数
 * 即每隔100ms发送一个20us的高电平脉冲,同时开启定时器4输入捕获并设置为上升沿捕获
 *
 ********************************************************************************************/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{


	if(htim==&htim3)                      //判断是否为TIM3溢出中断
	{
		TRIG_OFF;                         //先将超声波模块SR04的发送端TRIG拉低
		TRIG_ON;                          //再将超声波模块SR04的发送端TRIG拉高,并且持续20ms后再拉低
		delay_us(20);
		TRIG_OFF;
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim4,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);//设置为上升沿捕获
		HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//开启定时器输入捕获

	}

}

/********************************************************************************************
 * 定时器输入捕获回调函数 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
 *
 *说明:
 *ECHO接收回响信号脉冲,这个回调函数要被执行2次
 *这个回调函数在类似于一个分叉路口,上升沿捕获走路口0,下降沿捕获走路口1
 *
 ********************************************************************************************/
	void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
	{
		if(htim==&htim4)
		{
			switch(c_values)
			{//标志值c_values初始设定值为0,上升沿输入捕获,先执行回调函数执行case(0)中内容

			case(0): high_time[0]=HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_4);//获取上升沿的捕获值,即接收的高电平开始时间
			         __HAL_TIM_SET_CAPTUREPOLARITY(&htim4,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);//设置为下降沿捕获
			         c_values++;//标志值c_values值变为1,下次回调函数执行case(1)中内容
			         break;


			case(1): high_time[1]=HAL_TIM_ReadCapturedValue(&htim4,TIM_CHANNEL_4);//获取下降沿的捕获值,即接收的高电平结束时间
			         HAL_TIM_IC_Stop_IT(&htim4,TIM_CHANNEL_4); //关闭TIM4输入捕获
			         c_values=0;                 //标志值清零,用于下次输入捕获回调函数
			         __HAL_TIM_SET_COUNTER(&htim4,0);//TIM4计数值清零
				     t=high_time[1]-high_time[0];//下降沿捕获值-上升沿捕获值=回响信号高电平脉冲持续时间t
				     distances= t*0.017; //速度0.034cm/us,计算出的距离要除以2,distances的单位是cm
			         break;
			default: break;
			}
		}
	}

3.2. 舵机PWM代码

我直接将这个舵机PWM调速.c写到了control.c中
由舵机控制原理知道:(sg90)要求0.5ms~2.5ms对应 0至180°(数学映射思想)

	void SG90_Init()//舵机转90°
	{
		__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,1500);  //sg90是逆时针转动
	}
	void SG90_Turn_L()//舵机转135°
	{
		__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,2000);
	}
	void SG90_Turn_R()//舵机转45°
	{
		__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,1000);
	}


3.3. us级延时函数代码

delay.h

#ifndef DELAY_DELAY_H_
#define DELAY_DELAY_H_

#include "stm32f1xx_hal.h" HAL库文件声明
void delay_us(uint32_t us); //us级延时函数

#endif /* DELAY_DELAY_H_ */

delay.c

#include "delay.h"

void delay_us(uint32_t us) //利用CPU循环实现的非精准应用的微秒延时函数
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 8000000 * us); //使用HAL_RCC_GetHCLKFreq()函数获取主频值,经算法得到1微秒的循环次数
    while (delay--); //循环delay次,达到1微秒延时
}

3.4. 小车驱动

略,小车驱动的程序见前言的链接,我写的《蓝牙小车》中有十分详细的介绍,
唯一不同的是因为TIM2设置的预分频以及计时周期的不同,__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,5000);的设定值有所改变。

3.5. main.c

/* USER CODE BEGIN Includes */
#include "../../icode/control/control.h"
#include "../../icode/chaoshengbo/chaoshengbo.h"
/* USER CODE END Includes */



/* USER CODE BEGIN 1 */
extern  float distances;
uint32_t S=20;//设定距离标准值
uint32_t LS,RS=0;//测定的左右两边距离值
/* USER CODE END 1 */



/* USER CODE BEGIN 2 */

HAL_TIM_Base_Start_IT(&htim3);//开启定时器3中断
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); //直流电机PWM
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); //SG90PWM
SG90_Init();//SG90舵机初始化,也就是转90°,朝向小车前方
CAR_STOP();
HAL_Delay(500);

/* USER CODE END 2 */
	


while (1)
{
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
	if(distances>S)
	{
	    CAR_GO();
	}
	else
	{
	    CAR_STOP();
	    SG90_Turn_L();
	    HAL_Delay(1500);
	    LS=distances;
	    SG90_Turn_R();
	    HAL_Delay(1500);
	    RS=distances;
	    SG90_Init();
	
	    if(LS>RS&&LS>S)
	    {
	  	  CAR_LGO();
	  	  HAL_Delay(500);
	    }
	    else if(RS>LS&&RS>S)
	    {
	  	  CAR_RGO();
	  	  HAL_Delay(500);
	    }
	    else
	    {
	  	  CAR_BACK();
	  	  HAL_Delay(500);
	    }
	}
  }
  /* USER CODE END 3 */


总结

总体说来,这个避障小车的避障功能不是很完善,还存在一些视野盲区。因为通过舵机的转动,超声波模块只能监测到小车车头90°的范围,只能算是个半成品吧,这个项目目前是将所学的PWM控制,以及超声波整合在一起作为一个小整体,也算是小车之路的必经处吧。。。

欢迎大家积极交流,本文未经允许谢绝转载!!!文章来源地址https://www.toymoban.com/news/detail-453949.html

到了这里,关于STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51智能小车(舵机、超声波、蓝牙)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本项目实现超声波舵机自动避障,手机连接蓝牙控制小车运动、调速两个功能并实现两个功能的切换。 整体思路: 1.T1作为串口的波特率发生器,串口连接HC06蓝牙模块(从机)与手机连接,手机发送数

    2024年02月03日
    浏览(23)
  • 【嵌入式开发】基于树莓派实现超声波避障小车(Python)

    1.1 所需硬件 (1)烧制好的树莓派4B (2)小车车架(可在网上购买)。 (3)直流电机*4:用于驱动小车行驶。 (4)L298N电机驱动模块:用于实现对电机的控制。 (5)超声波测距模块:用于实时测距,以实现自主避障。 (6)其余辅助器件:包括充电宝(树莓派供电)、干电

    2023年04月14日
    浏览(33)
  • 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51

    自动跟随小车系统由两部分组成:跟随小车和移动目标携带装置。 工作原理:跟随小车系统通过无线通信模块发送寻找信号,同时超声波接收器开始计时,如果移动目标接收到无线寻找信号,则立即发送超声波信号。这样小车的三角超声波接收器陆续收到超声波信号,CPU通过

    2023年04月08日
    浏览(21)
  • 基于FPGA的蓝牙遥控,超声波避障,红外循迹的智能小车

            闲来无事整个小车玩玩,设想的小车可以有蓝牙模块来控制模式切换,通过发送指令来更改相对应的功能,当避障的时候可以自动规避障碍物,当处于红外循迹时,可以跟随规划的轨迹前线,当手动遥控时可以控制前进后退左右转向停止等功能。         先介绍一下

    2024年02月07日
    浏览(22)
  • ESP32(MicroPython) RGB点阵+多功能显示+可交互超声波云台

    ESP32 RGB点阵+多功能显示+可交互超声波云台 本程序通过LCD1602显示湿度和距离数据。超声波云台在超声波传感器检测到距离小于15厘米时顺时针转动,距离大于15厘米时逆时针转动实现交互。WS2812点阵每320ms显示随机颜色(每个灯的颜色分开取值),通过五向导航按键控制亮度和

    2024年02月11日
    浏览(15)
  • ESP32(MicroPython) WS2812点阵+可交互超声波云台+网页显示温湿度

    ESP32 RGB点阵 三种随机颜色模式 由于之前的RGB点阵程序中的后两个模式灯的颜色过饱和影响观感,本程序把这两个模式整合到所有灯取随机颜色的程序,分别实现所有灯各取随机颜色、每一圈的灯取随机颜色和每相邻4灯取同一种随机颜色。 本程序增加了服务器功能,可以通

    2024年02月12日
    浏览(18)
  • STM32——超声波传感器

    需求: 使用超声波测距,当手离传感器距离小于 5cm 时, LED1 点亮,否则保持不亮状态   接线:     定时器配置: 使用 TIM2 ,只用作计数功能,不用作定时。 将 PSC 配置为 71 ,则计数 1 次代表 1us 。   编写微秒级函数: 1、总结 微秒级定时: 这个延迟函数的实现利用了定

    2024年02月05日
    浏览(24)
  • 基于STM32的超声波测距

    一、HC-SR04模块介绍 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm;模块包括超声波发射器、接收器、与控制电路。 模块的基本工作原理为: (1)采用 IO口 TRIG触发测距,给最少 10us的高电平信呈。 (2)模块自动发送 8个 40khz的方波,自动检测是

    2024年02月13日
    浏览(21)
  • 基于STM32的超声波雷达

    视频地址:1.基于STM32的超声波雷达-演示_哔哩哔哩_bilibili 备注:文档最后有所有文件的网盘地址 全部必要硬件(左到右) : ST-LINK调试器:调试下载程序 stm32f103c8t6核心板 1.8寸TFT显示器 sg90舵机 超声波传感器 其他扩展硬件 超声波传感器转接板:方便超声波传感器接到舵机上

    2024年02月12日
    浏览(19)
  • 基于STM32超声波测距系统设计

    随着社会的发展和科技的进步,人们对测距的要求越来越高,特别是在一些要求实时测距的场合,传统的测距方式已经无法满足人们的需求,而超声波测距由于其非接触和实时反馈的特点在生活中得到广泛应用。 本系统硬件部分由电源模块、控制模块、显示模块、报警模块、

    2024年02月04日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包