STM32超声波模块代码
时间: 2023-11-13 20:05:39 浏览: 93
US-100超声波模块.rar_STM32 US-100_US-100 STM32_US——100超声波代码_i2c超声波模组_
由于STM32超声波模块的具体型号和厂家不同,所以代码实现也有所差异。以下提供一组通用的超声波模块代码,供参考:
```c
#include "stm32f10x.h"
#include <stdio.h>
#define TRIG_PIN GPIO_Pin_0
#define ECHO_PIN GPIO_Pin_1
#define TRIG_PORT GPIOA
#define ECHO_PORT GPIOA
void Delay_us(uint32_t us)
{
uint32_t i,j;
for(i=0;i<us;i++)
for(j=0;j<9;j++);
}
void Init_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TRIG_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ECHO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ECHO_PORT, &GPIO_InitStructure);
}
float Get_Distance(void)
{
uint32_t start_time, end_time;
float distance;
TRIG_PORT->BSRR |= TRIG_PIN;
Delay_us(10);
TRIG_PORT->BSRR |= TRIG_PIN << 16;
while(!(ECHO_PORT->IDR & ECHO_PIN));
start_time = TIM3->CNT;
while((ECHO_PORT->IDR & ECHO_PIN));
end_time = TIM3->CNT;
distance = (float)(end_time - start_time) / 58.0;
return distance;
}
int main(void)
{
float distance;
char buf[16];
Init_GPIO();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM3->PSC = 72 - 1;
TIM3->ARR = 0xFFFF;
TIM3->CR1 = 0x01;
while(1)
{
distance = Get_Distance();
sprintf(buf, "%.2f cm\r\n", distance);
printf(buf);
Delay_us(100000);
}
}
```
以上代码使用的是STM32F103芯片和TIM3定时器,超声波模块的Trig和Echo分别连接到PA0和PA1引脚。代码中的Get_Distance()函数用于获取超声波模块测得的距离,具体实现为:
1. 将Trig引脚拉高10us,然后拉低,触发超声波模块发送出去一组声波;
2. 等待Echo引脚变高,记录此时的计数器值start_time;
3. 等待Echo引脚再次变低,记录此时的计数器值end_time;
4. 根据声波在空气中的传播速度(340m/s),计算出距离(单位为厘米)。
最后,使用printf将测得的距离输出到串口终端上,实现了超声波模块的简单应用。
阅读全文