文章目录
前言
一个学习STM32的小白~ 有问题请评论区或私信指出
提示:以下是本篇文章正文内容,下面案例可供参考
一、超声波测距
1.超声波简介
超声波传感器模块上面通常有两个超声波元器件,
。一个用于发射,一个用于接收。
电路板上有四个引脚:VCC GND Trig(触发),Echo(回应)
主要参数:
工作电压与电流:5V,15mA
感应距离: 2~400cm
感测角度:不小于15°
被测物的面积不要小于50cm并且尽量平整
具备温度补偿电路
2.超声波测距原理
超声波模块的触发脚(Trig)输入10us以上的高电位,即可发射超声波,发射超声波后,与接收到传回的超声波之前,"响应"脚(Echo)位呈现高电平。因此,程序可以从"响应"脚位(Echo)的高电平脉冲持续时间,换算出被测物的距离。
距离公式:高电平持续时间 * 声速(340/秒)/2
2.超声波测距步骤
1.配置GPIO引脚结构体(Trig,Echo)。
2.配置定时器结构体
3.配置定时器中断结构体
4.开启时钟(定时器,GPIO)
5.Tria引脚输出高电平(10us以上),然后关闭
6.等待Echo引脚输入高电平开始,定时器打开-->开启计数器计数
7.等待Echo引脚输入高电平结束,定时器关闭--->停止计数器计数
8.通过计数器的值计算得出超声波测量距离
c
#include "HCSR04.h"
#include "stm32f10x.h" // Device header
#include "SysTick.h"
uint32_t ms_Count = 0;
#define Trig_Value_High GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define Trig_Value_LOW GPIO_ResetBits(GPIOB,GPIO_Pin_11)
#define Echo_Read GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)
void HCSR04_Config(void)
{
GPIO_InitTypeDef HCSR04_Structure;
TIM_TimeBaseInitTypeDef TIM4_Structure;
NVIC_InitTypeDef nvic_Structure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
//Trig
HCSR04_Structure.GPIO_Mode = GPIO_Mode_Out_PP;
HCSR04_Structure.GPIO_Pin = GPIO_Pin_11;
HCSR04_Structure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&HCSR04_Structure);
//Echo
HCSR04_Structure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
HCSR04_Structure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOB,&HCSR04_Structure);
TIM4_Structure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM4_Structure.TIM_CounterMode = TIM_CounterMode_Up;
TIM4_Structure.TIM_Period = 1000-1;
TIM4_Structure.TIM_Prescaler =72-1;
TIM4_Structure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM4,&TIM4_Structure);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM4,DISABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
nvic_Structure.NVIC_IRQChannel = TIM4_IRQn;
nvic_Structure.NVIC_IRQChannelPreemptionPriority = 0;
nvic_Structure.NVIC_IRQChannelSubPriority = 0;
nvic_Structure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_Structure);
}
void open_TIM4(void)
{
TIM_SetCounter(TIM4,0);//初始化CNT = 0
ms_Count = 0;//计时器 = 0
TIM_Cmd(TIM4,ENABLE);
}
void close_TIM4(void)
{
TIM_Cmd(TIM4,DISABLE);
}
int Get_timeCount(void)
{
uint32_t t_Count;
t_Count = ms_Count*1000;//毫秒化微妙
t_Count += TIM_GetCounter(TIM4);//加上当前CNT值
TIM4->CNT = 0;//CNT置0
delay_ms(50);
return t_Count;
}
float GetLenth(void)
{
uint32_t time = 0;
uint16_t i = 0;
float lenth = 0;
float sum = 0;
while(i != 5)//取五次测距结果
{
Trig_Value_High;//发射20us超声波
delay_us(20);
Trig_Value_LOW;
while(Echo_Read == 0);//等待Echo接收反射波
open_TIM4();//接收到反射波打开定时器
i = i+1;//记录次数
while(Echo_Read == 1);等待Echo接收的反射波停止
close_TIM4();//关闭定时器
time = Get_timeCount();//获取反射波持续时间
lenth = ((float)time/58.3);//计算距离cm/us
sum += lenth;
}
lenth = sum/5.0;
return lenth;
}
void TIM4_IRQHandler(void)
{
if( TIM_GetITStatus(TIM4,TIM_IT_Update) != RESET)
{
ms_Count++;//每次中断代表1ms过去了
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}
}
二、舵机的控制
三、硬件搭建及功能展示
如图:
总结
局部变量初值一定不要忘记~~ 切记!!!