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);}}}}