STM32_超声波测距(SR04)

代码如下:

//超声波工作
void SR04_Work()
{
	double t1,t2;
	double distance,m;
	//1.给传感器一个脉冲-测距 E0-高-delay-低

	SW_E0(1);//对ODR置位
	My_Delay_US(10);//10us
	SW_E0(0);//对ODR复位

	//2.等E1-高电平 记录时间t1-发射信号时间
	while(1)
	{
		if(Check_E1()==1)
		{
			t1=US_Tick;
			break;
		}
	}
	//3.等E1-低电平 记录时间t2-接收信号时间
	while(1)
	{
		if(Check_E1()==0)
		{
			t2=US_Tick;
			break;
		}
	}
	//4.计算距离
	distance=(t2-t1)/1000000.0f*340.0f/2.0f*100.0f;
	printf("%.2lfcm\n",distance);
}

原理如下:

        模块原理:            

(1)采用 IO 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;

        工作原理:

 

 以下为配置超声波相关的函数:

//PE0  OUT     Trig
void GPIOE0_Init()
{
	RCC->AHB1ENR |= 1<<4;
	GPIOE->MODER &= ~(3<<0);
	GPIOE->MODER |= (1<<0);
	
	GPIOE->OTYPER &= ~(1<<0);
	
	GPIOE->OSPEEDR |= (3<<0);
	
	GPIOE->PUPDR &= ~(3<<0);
	GPIOE->PUPDR |= (2<<0);
}

void SW_E0(int c)
{
	if(c == 0)
		GPIOE->BSRRH = 1<<0;//对ODR复位
	else
		GPIOE->BSRRL = 1<<0;//对ODR置位
}
//
//PE1   IN     Echo
void GPIOE1_Init_IN()
{
	RCC->AHB1ENR |= 1<<4;
	GPIOE->MODER &= ~(3<<2);

	GPIOE->PUPDR &= ~(3<<2);
	GPIOE->PUPDR |= (2<<2);
}

int Check_E1()
{
	int r = GPIOE->IDR & (1<<1);
	if(r!=0)
		return 1;
	else
		return 0;
}
//
//Timer4 
u32 US_Tick;	//1us计数
void Timer4_Init()
{
	RCC->APB1ENR |= 1<<2;	
	TIM4->PSC=42-1;  	//预分频器	 
	//Timer2的参考频率   84Mhz / 84 = 100Hz
	TIM4->ARR=2-1;  	//设定计数器自动重装值 
	//   1秒产生一次中断
	TIM4->DIER |= 1<<0;   //允许更新中断	
	TIM4->CR1 |= 1<<0;		//启动定时器
	MY_NVIC_InitG2(0,1,TIM4_IRQn);//使能中断向量 配置优先级
}
//Timer2的中断回调函数
void TIM4_IRQHandler(void)
{
	//了解是否进入了溢出中断
	int r = TIM4->SR & 0x0001;
	if(r!=0)  //sr 第0位 为1
	{
		TIM4->SR &= ~(1<<0);//清中断
		US_Tick++;
	}
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种基于ARM Cortex-M内核的单片机,ST公司提供了多种型号和系列。对于超声波测距,可以使用STM32的IO口来控制超声波发射和接收,然后通过定时器等模块来计算超声波从发射到接收所经历的时间,从而计算出距离。以下是一个简单的STM32超声波测距代码示例: ```c #include "stm32f10x.h" void Delay_us(uint32_t nus) { uint32_t i,j; for(i=0;i<nus;i++) for(j=0;j<8;j++); } void HC_SR04_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //ECHO GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TRIG GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } float HC_SR04_GetDistance(void) { uint16_t time_out = 0xFFFF; uint32_t cnt = 0; GPIO_ResetBits(GPIOB, GPIO_Pin_1); Delay_us(2); GPIO_SetBits(GPIOB, GPIO_Pin_1); Delay_us(10); GPIO_ResetBits(GPIOB, GPIO_Pin_1); while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == RESET && time_out--); while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == SET && time_out--) cnt++; return (float)(cnt * 0.017); //单位为米 } int main(void) { HC_SR04_Init(); while(1) { float dist = HC_SR04_GetDistance(); printf("distance: %.2f m\r\n", dist); Delay_us(100000); //100ms } } ``` 在上面的代码中,`HC_SR04_Init()`函数用于初始化GPIO口,将PB0配置为输入模式,并开启上拉电阻;将PB1配置为输出模式,并将其输出低电平。`HC_SR04_GetDistance()`函数用于获取距离,其中`time_out`用于判断是否超时,`cnt`用于计算时间差。最后,将时间差乘以声速的一半即可得到距离。 相关问题: 1. 超声波测距的原理是什么? 2. 怎么使用超声波测距模块进行距离测量? 3. STM32的定时器有哪些应用场景?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值