前言
本项目基于使用STM32的最基本技术,在实验室独自完成的项目,经过细心调试,不断试错改进,使智能小车呈现不同的功能
一,硬件
配置
- STM32F103C8T6最小系统板
- HC-SR04 超声波测距模块
- 固定超声波传感器支架
连接
超声波接口: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);
}
}
}
}