超声波简介
超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离。
型号:HC-SR04
时序图
怎么让它发送波 Trig触发信号,给Trig端口至少10us的高电平
怎么知道它开始发了 Echo信号,由低电平跳转到高电平,表示开始发送波
怎么知道接收了返回波
Echo信号,由高电平跳转回低电平,表示波回来了
怎么算时间
Echo引脚维持高电平的时间! 波发出去的那一下,开始启动定时器 波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间怎么算距离
距离 = 速度 (340m/s)* 时间/2
编程实战
使用超声波测距,当手离传感器小于10cm时,led亮,否侧灭
接线:Tring ——PB6 Echo——PB7 led——PC13
PB6设置为输出,给Tring一个触发信号,PB7设置为输入,接收Echo的信号
定时器配置
使用TIM2,只用作计数功能,不用做定时。
将PSC配置为71,则计数1次为1us
编写微秒级函数
//使用TIM2来做us级别的延时函数
void TIM2_Delay_us(uint16_t n_us)
{
//使能定时器2计数
__HAL_TIM_ENABLE(&htim2);
__HAL_TIM_SetCounter(&htim2,0);
while(__HAL_TIM_GetCounter(&htim2) < ((1*n_us)-1));
//关闭定时器2计数
__HAL_TIM_DISABLE(&htim2);
}
//使用TIM2来做us级别的延时函数
void TIM2_Delay_us(uint16_t n_us)
{
//使能定时器2计数
__HAL_TIM_ENABLE(&htim2);
__HAL_TIM_SetCounter(&htim2,0);
while(__HAL_TIM_GetCounter(&htim2) < ((1*n_us)-1));
//关闭定时器2计数
__HAL_TIM_DISABLE(&htim2);
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
int cnt = 0;
float distance = 0;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//给Tring至少10us的高电平,触发信号
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
TIM2_Delay_us(20);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
//波发出去时打开定时器计时
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_RESET);
HAL_TIM_Base_Start(&htim2);
__HAL_TIM_SetCounter(&htim2,0);//设置每次都从0开始计算次数
//波回来的时候关闭定时器,停止计时
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_SET);
HAL_TIM_Base_Stop(&htim2);
//获取时间,转换为距离,计算一次为1us,获取计算次数cnt
cnt = __HAL_TIM_GetCounter(&htim2);
distance = cnt*340/2*0.000001*100;//单位cm
if(distance < 10){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
}else {
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
}
HAL_Delay(1000);
}
/* USER CODE END 3 */
}