STM32定时器超声波测距实验手册

1. 实验目标

  • 使用STM32 HAL库和定时器实现超声波测距功能。

  • 当超声波模块前方障碍物距离 < 10cm 时,点亮板载LED。


2. 硬件准备

硬件模块说明
STM32开发板STM32F103C8T6
HC-SR04模块超声波测距模块
杜邦线若干连接模块与开发板

3. 硬件连接

HC-SR04引脚STM32引脚备注
VCC3.3V
TrigPA0GPIO_Output
EchoPA8GPIO_Input(建议串联1kΩ电阻)
GNDGND

4. STM32CubeMX配置

  • GPIO配置

  • 定时器配置TIM1

  • 设置通道模式参数

  • 设置通道参数

  • 设置板载LED参数

  • 设置时基单元参数

5.代码实现

功能流程分析

while (1)
  {
		//1.CNT归零
		__HAL_TIM_SET_COUNTER(&htim1,0);
		//1.CC1,CC2清除
		__HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_CC1);
		__HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_CC2);

		//2.启动输入捕获
		HAL_TIM_IC_Start(&htim1,TIM_CHANNEL_1);
		HAL_TIM_IC_Start(&htim1,TIM_CHANNEL_2);

		//3.向Trig发送脉冲
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
		for(uint32_t i = 0;i < 10;i++);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
		
		//4.等待测量结束
		uint8_t success = 0; // 测量是否成功,0 - 失败,1 - 成功
		uint32_t expireTime =  HAL_GetTick()+50; //最长等待时间
		
		while(expireTime > HAL_GetTick()){
			uint32_t cc1Flag = __HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC1);
			uint32_t cc2Flag = __HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC2);
			if(cc1Flag && cc2Flag){
				success = 1;
				break;
			}
		}
		
		//5.关闭定时器
		HAL_TIM_IC_Stop(&htim1,TIM_CHANNEL_1);
		HAL_TIM_IC_Stop(&htim1,TIM_CHANNEL_2);
		
		//6.计算测量结果
		if(success == 1){
			uint16_t ccr1 = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_1);
			uint16_t ccr2 = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2);
			
			float pulseWidth = (ccr2 - ccr1) * 1e-6f;
			
			float distance = 340.0f * pulseWidth / 2.0f;
				
			if(distance < 0.2){
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
			}else{
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
			}
		}
		   
    }
 
}

6.代码解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值