【STM32智能小车/模式3】超声波避障功能

前言

本项目基于使用STM32的最基本技术,在实验室独自完成的项目,经过细心调试,不断试错改进,使智能小车呈现不同的功能

一,硬件

配置

  1. STM32F103C8T6最小系统板
  2. HC-SR04 超声波测距模块
  3. 固定超声波传感器支架 

连接

超声波接口:PB0 ---> SR04_Trig     PB1 ---> SR04_Echo

 舵机:PA6 ---> GS90

二,环境配置

略,见

三,代码

 1.重定义引脚

改成你可以识别的标志

#define SR04 PAout(0)

 2.编写超声波测距函数

/**
* @brief 超声波测距函数
*				 
* @param 
* @return Distance:测得距离
*/
int SR04_Distance(void)
{
			SR04 = 1;
			delay_us(13);
			SR04 = 0;
			if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
			{
				time=TIM5CH1_CAPTURE_STA&0X3F;
				time*=65536;//溢出时间总和
				time+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
				Distance = time*0.033/2;
				
//				sprintf((char *)string,"D:%d",Distance);
//		    	OLED_ShowString(6,3,string,16);	
				
//				printf("HIGH:%d us\r\n",time);//打印总的高点平时间
				TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
			}
	    return Distance;
}

3.编写超声波避障功能 

 

根据占空比,控制舵机的转向 

while(1)
	{
        if(Mode == 3)
		{
					//超声波避障
					TIM_SetCompare1(TIM3,75);	 //舵机向前 使超声波朝前方 75 ===> 7.5% ===> 90°
					delay_ms(200);
					if(SR04_Distance()>25)// 前方无障碍物
					{
							Forward();
							delay_ms(500);
					}
					
					if(SR04_Distance()<25)  //·
					{
								TIM_SetCompare1(TIM3,50);	 //舵机向右边转大约30度 30 ===> 3.0% ===>45 °
								delay_ms(200);
								if(SR04_Distance()>25)//右侧无障碍物判断
								{
										Rightward();
										delay_ms(700);
								}
								else {   //右边有障碍物
										TIM_SetCompare1(TIM3,100); //舵机向左边转大约30度 100 ===> 10.0% ===>135 °
										delay_ms(200);
										if(SR04_Distance()>25)//左侧无障碍物
										{
													Leftward();
													delay_ms(700);	
										}
										else{
													Backward();//后退
													delay_ms(700);
													Rightward(); //右转
													delay_ms(700);
										}											
							 }
					}					
		}	

四,源码

源码获取

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是基于STM32超声波避障小车程序。本程序使用了HC-SR04超声波模块进行测距,并通过L298N电机驱动模块控制小车的运动。 ``` #include "stm32f10x.h" #include "usart.h" #include "delay.h" #define TRIG GPIO_Pin_0 //超声波模块控制引脚 #define ECHO GPIO_Pin_1 //超声波模块回传引脚 void TIM2_Init(void) //初始化TIM2 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 999; //计数器周期为1000 TIM_TimeBaseStructure.TIM_Prescaler = 71; //预分频器为72 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); } void GPIO_Init(void) //初始化GPIO { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = TRIG; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ECHO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } void L298N_Init(void) //初始化L298N电机驱动模块 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void delay_us(uint32_t us) //延时函数,单位为微秒 { while (us--) { int i = 10; while (i--) ; } } void HC_SR04_Start(void) //启动超声波模块测距 { GPIO_SetBits(GPIOA, TRIG); //发出一个高电平脉冲 delay_us(10); GPIO_ResetBits(GPIOA, TRIG); } float HC_SR04_GetDistance(void) //获取超声波测距结果,单位为厘米 { TIM2->CNT = 0; //计数器清零 while (!GPIO_ReadInputDataBit(GPIOA, ECHO)) //等待超声波模块回传引脚变高电平 ; TIM_Cmd(TIM2, ENABLE); //启动计数器 while (GPIO_ReadInputDataBit(GPIOA, ECHO)) //等待超声波模块回传引脚变低电平 ; float distance = TIM2->CNT / 58.0f; //计算距离,单位为厘米 TIM_Cmd(TIM2, DISABLE); //关闭计数器 return distance; } int main(void) { float distance; USART1_Init(); //初始化串口 TIM2_Init(); //初始化计数器 GPIO_Init(); //初始化GPIO L298N_Init(); //初始化L298N电机驱动模块 while (1) { HC_SR04_Start(); //启动超声波模块测距 distance = HC_SR04_GetDistance(); //获取距离 printf("Distance: %.2f cm\r\n", distance); //输出距离 if (distance < 30) //如果距离小于30厘米,后退 { GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1); //右轮后退 GPIO_ResetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11); //左轮后退 } else //否则前进 { GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1); //右轮前进 GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11); //左轮前进 } } } ``` 注意:本程序是一个简单的示例程序,仅供参考。在实际项目中,需要根据具体需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零零怪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值