利用STM32F407控制US-100超声波模块测距实验

本文介绍了如何使用STM32F407单片机控制US-100超声波模块进行测距实验。超声波测距原理是通过发送高电平触发声波发射,测量回波时间差来计算距离。硬件部分包括US-100模块和STM32F407ZGT6单片机。软件部分涉及串口通信、传感器引脚配置和TIM2定时器设置。通过主函数初始化和测距函数实现,实验步骤简单,适合初学者实践。
摘要由CSDN通过智能技术生成

超声波测距是进行小车实验时最为常用的测距模块,因为其原理简单以及价格低廉,受到很多同学的喜爱,下面为大家介绍利用STM32F407单片机控制US-100进行测距。
原理:给超声波模块Trig端一个大于10us的高电平,模块会自动发射8个40KHZ的声波,同时Echo电平变高,当声波被模块接收时,Echo电平变低,通过时间差可以计算出测量的距离。
首先,硬件部分,超声波模块用的是US-100,可以在淘宝上购买,价格也非常的便宜,单片机用的STM32F407ZGT6如下图:
在这里插入图片描述US-100图
在这里插入图片描述STM32ZGT6
在这里插入图片描述US-100的一些参数
在这里插入图片描述两种配置方式,这里我们选择比较简单的TTL电平触发模式
在这里插入图片描述接线就更为简单了,4

  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是使用STM32F407和HC-SR04超声波测距模块的示例代码: ```c #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_tim.h" #include "misc.h" #define TRIG_PIN GPIO_Pin_0 #define ECHO_PIN GPIO_Pin_1 #define GPIO_PORT GPIOA uint32_t distance = 0; void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = TRIG_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ECHO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIO_PORT, &GPIO_InitStructure); } void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF; TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_Cmd(TIM2, ENABLE); } uint32_t GetDistance(void) { GPIO_SetBits(GPIO_PORT, TRIG_PIN); Delay_us(10); GPIO_ResetBits(GPIO_PORT, TRIG_PIN); uint32_t start_time = 0; uint32_t end_time = 0; uint32_t timeout = 0; while (GPIO_ReadInputDataBit(GPIO_PORT, ECHO_PIN) == RESET) { if (++timeout > 1000000) { return 0xFFFFFFFF; } } start_time = TIM_GetCounter(TIM2); timeout = 0; while (GPIO_ReadInputDataBit(GPIO_PORT, ECHO_PIN) == SET) { if (++timeout > 1000000) { return 0xFFFFFFFF; } } end_time = TIM_GetCounter(TIM2); if (end_time > start_time) { distance = (end_time - start_time) * 10 / 58; } else { distance = (start_time - end_time) * 10 / 58; } return distance; } int main(void) { GPIO_Configuration(); TIM_Configuration(); while (1) { GetDistance(); } return 0; } ``` 此代码初始化GPIO和定时器,然后在主循环中调用`GetDistance()`函数来获取测量到的距离。该函数使用超声波模块发送一个10微秒的脉冲,然后等待接收到回波。通过测量回波的时间来计算距离,并返回结果。在本例中,距离以毫米为单位表示。如果无法检测到回波或测量超时,则返回0xFFFFFFFF。 需要注意的是,在本例中,我们使用了定时器的输入捕获模式来测量回波的时间。我们使用TIM2的通道2来读取ECHO引脚的状态,并在上升沿触发捕获。此代码假设您已正确配置STM32F407的时钟源。如果您遇到问题,请参阅STM32F407参考手册。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44041987

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值