超声波传感器HC-SR04测距实例
最近刚学了点32的知识,找了个超声波传感器练习一下,这是我的一点学习经验,和大家分享一下,如有不足希望各位大佬多多指导。
软件
STM32CubeMX,keil5,野火串口调试助手
硬件
stm32f103vet6开发板,J-Link,超声波传感器HC-SR04
原理
HC-SR04超声波模块工作原理
(1)采用IO口触发测距,给至少10us高电平脉冲;
(2)模块内自动发送八个40khz方波,并自主检测是否有电波返回;
(3)当有信号返回时,通过IO口输出一个高电平,高电平的持续时间就是超声波从发送到返回的时间;
(4)测距公式:距离=(高电平时间*声速)/2;
我自己的理解:本模块使用时,给Trig一个10US以上的高电平,模块开始工作,模块内自动发送八个40khz方波,并自主检测是否有电波返回。这是我们需要检测Echo处的电平,当为高电平的时候记一个时间;当Echo出为低电平的时候在记一个时间,这两个时间的差就是高电平持续的时间,然后用测距公式进行计算。
步骤
1,设置RCC和SYS
2,设置Trig输出引脚,Echo输入引脚以及LED灯
3,设置TIM2和USART1
4,设置时钟树,项目名称以及其他设置
不同板子的时钟树设置不同,自己去查资料。
5,生成代码,并打开keil5
6,编写代码
让LED灯快速亮灭三次----表示代码已下载到板子中,并开始运行
/* USER CODE BEGIN 2 */
int i=0;
while(i《7)
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
HAL_Delay(400);
i=i+1;
}
/* USER CODE END 2 */
按照原理,编写while函数体里面的代码。(第一个while是当有信号返回时,如果满足条件,就会卡在这里,当不满足条件时,开始往下走,记一个时间,然后会卡在另一个while处,当条件不成立了再继续往下走,在记一个时间。两个while可以理解为条件延时。)
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_TIM_Base_Start_IT(&htim2);
htim2.Instance-》CNT = 0;
float t1,t2,distance;
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == GPIO_PIN_RESET)
t1=htim2.Instance-》CNT;
while(HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == GPIO_PIN_SET)
t2=htim2.Instance-》CNT;
htim2.Instance-》CNT = 0;
distance=(t2-t1)*17/(float)1000;
printf(“The distance is %0.1fcmn”,(float)distance);
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
HAL_Delay(500);
}
/* USER CODE END 3 */
7,编译,下载代码,打开串口调试助手并且运行代码
在编译前,点击魔术棒选项卡,确认J-Link仿真器已连接好以及其他设置也是正确的。
8,用传感器测距离
有些人的printf无法使用,点击这里[printf无法使用的解决方法。
超声波传感器HC-SR04测距实例
最近刚学了点32的知识,找了个超声波传感器练习一下,这是我的一点学习经验,和大家分享一下,如有不足希望各位大佬多多指导。
软件
STM32CubeMX,keil5,野火串口调试助手
硬件
stm32f103vet6开发板,J-Link,超声波传感器HC-SR04
原理
HC-SR04超声波模块工作原理
(1)采用IO口触发测距,给至少10us高电平脉冲;
(2)模块内自动发送八个40khz方波,并自主检测是否有电波返回;
(3)当有信号返回时,通过IO口输出一个高电平,高电平的持续时间就是超声波从发送到返回的时间;
(4)测距公式:距离=(高电平时间*声速)/2;
我自己的理解:本模块使用时,给Trig一个10US以上的高电平,模块开始工作,模块内自动发送八个40khz方波,并自主检测是否有电波返回。这是我们需要检测Echo处的电平,当为高电平的时候记一个时间;当Echo出为低电平的时候在记一个时间,这两个时间的差就是高电平持续的时间,然后用测距公式进行计算。
步骤
1,设置RCC和SYS
2,设置Trig输出引脚,Echo输入引脚以及LED灯
3,设置TIM2和USART1
4,设置时钟树,项目名称以及其他设置
不同板子的时钟树设置不同,自己去查资料。
5,生成代码,并打开keil5
6,编写代码
让LED灯快速亮灭三次----表示代码已下载到板子中,并开始运行
/* USER CODE BEGIN 2 */
int i=0;
while(i《7)
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
HAL_Delay(400);
i=i+1;
}
/* USER CODE END 2 */
按照原理,编写while函数体里面的代码。(第一个while是当有信号返回时,如果满足条件,就会卡在这里,当不满足条件时,开始往下走,记一个时间,然后会卡在另一个while处,当条件不成立了再继续往下走,在记一个时间。两个while可以理解为条件延时。)
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_TIM_Base_Start_IT(&htim2);
htim2.Instance-》CNT = 0;
float t1,t2,distance;
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == GPIO_PIN_RESET)
t1=htim2.Instance-》CNT;
while(HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == GPIO_PIN_SET)
t2=htim2.Instance-》CNT;
htim2.Instance-》CNT = 0;
distance=(t2-t1)*17/(float)1000;
printf(“The distance is %0.1fcmn”,(float)distance);
HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
HAL_Delay(500);
}
/* USER CODE END 3 */
7,编译,下载代码,打开串口调试助手并且运行代码
在编译前,点击魔术棒选项卡,确认J-Link仿真器已连接好以及其他设置也是正确的。
8,用传感器测距离
有些人的printf无法使用,点击这里[printf无法使用的解决方法。
举报