1. 实验目标
-
使用STM32 HAL库和定时器实现超声波测距功能。
-
当超声波模块前方障碍物距离 < 10cm 时,点亮板载LED。
2. 硬件准备
硬件模块 | 说明 |
---|---|
STM32开发板 | STM32F103C8T6 |
HC-SR04模块 | 超声波测距模块 |
杜邦线若干 | 连接模块与开发板 |
3. 硬件连接
HC-SR04引脚 | STM32引脚 | 备注 |
---|---|---|
VCC | 3.3V | |
Trig | PA0 | GPIO_Output |
Echo | PA8 | GPIO_Input(建议串联1kΩ电阻) |
GND | GND |
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);
}
}
}
}